diff --git a/.gitignore b/.gitignore
index 25ca3ad..511e76c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,4 +3,5 @@
.ruff_cache
uv.lock
.venv
-**/node_modules
\ No newline at end of file
+rest/java-spring/target
+**/node_modules
diff --git a/rest/java-spring/README.md b/rest/java-spring/README.md
new file mode 100644
index 0000000..1bd7ecf
--- /dev/null
+++ b/rest/java-spring/README.md
@@ -0,0 +1,241 @@
+
+
+# UCP Merchant Server (Java/Spring Boot)
+
+This directory contains a reference implementation of a Universal Commerce
+Protocol (UCP) server built with Java 25 and Spring Boot 3.5.9. It demonstrates
+how to implement the UCP specifications for checkout sessions, including modular
+support for fulfillment, discounts, and order extensions.
+
+## Project Structure
+
+* `src/main/java/com/dev/ucp/actions`: Contains the business logic for
+ checkout operations (Create, Update, Complete, etc.).
+* `src/main/java/com/dev/ucp/entities`: JPA entities with nested repository
+ interfaces for persistence.
+* `src/main/java/com/dev/ucp/service`: REST controllers and exception
+ handlers.
+* `src/main/resources/openapi.extensions.json`: Defines modular UCP schema
+ extensions (e.g., fulfillment, discounts) used for model generation.
+* `generated/`: Source root for models and interfaces generated from OpenAPI
+ specs.
+* `pom.xml`: Main Maven configuration.
+* `codegen.pom.xml`: Specialized Maven configuration for OpenAPI code
+ generation.
+
+## Prerequisites
+
+* Java 25 JDK
+* Apache Maven 3.9+
+* (Optional) Official `ucp` repository for
+ [model generation](#generating-models).
+
+## Setup
+
+```shell
+# Clone the samples repository if you haven't already
+git clone https://github.com/Universal-Commerce-Protocol/samples.git
+cd samples/rest/java-spring
+
+# Build the project (pre-generated models are included in the repository)
+mvn clean install
+```
+
+## Run the Server
+
+Start the server on port 8182. Using the `conformance` profile enables
+simulation endpoints required for testing.
+
+```bash
+# Start the server in the background, redirecting output to server.log
+mvn spring-boot:run -Dspring-boot.run.arguments=--server.port=8182 -Pconformance > server.log 2>&1 &
+SERVER_PID=$!
+```
+
+Note: You can monitor the logs with `tail -f server.log`.
+
+## Discovery & Health Check
+
+To verify the operational status and discover the capabilities of your local
+server, you can query the UCP discovery endpoint. This serves as a primary
+validation that the service is correctly configured and accessible.
+
+```bash
+curl -s http://localhost:8182/.well-known/ucp
+```
+
+### Example Discovery Response:
+
+```json
+{
+ "ucp": {
+ "version": "2026-01-11",
+ "services": {
+ "dev.ucp.shopping": {
+ "version": "2026-01-11",
+ "spec": "https://ucp.dev/specs/shopping",
+ "rest": {
+ "schema": "https://ucp.dev/services/shopping/openapi.json",
+ "endpoint": "http://localhost:8182/ucp"
+ }
+ }
+ },
+ "capabilities": [
+ {
+ "name": "dev.ucp.shopping.checkout",
+ "version": "2026-01-11",
+ "spec": "https://ucp.dev/specs/shopping/checkout",
+ "schema": "https://ucp.dev/schemas/shopping/checkout.json"
+ },
+ {
+ "name": "dev.ucp.shopping.discount",
+ "version": "2026-01-11",
+ "spec": "https://ucp.dev/specs/shopping/discount",
+ "schema": "https://ucp.dev/schemas/shopping/discount.json",
+ "extends": "dev.ucp.shopping.checkout"
+ },
+ {
+ "name": "dev.ucp.shopping.fulfillment",
+ "version": "2026-01-11",
+ "spec": "https://ucp.dev/specs/shopping/fulfillment",
+ "schema": "https://ucp.dev/schemas/shopping/fulfillment.json",
+ "extends": "dev.ucp.shopping.checkout"
+ },
+ {
+ "name": "dev.ucp.shopping.order",
+ "version": "2026-01-11",
+ "spec": "https://ucp.dev/specs/shopping/order",
+ "schema": "https://ucp.dev/schemas/shopping/order.json"
+ }
+ ]
+ },
+ "payment": {
+ "handlers": [
+ {
+ "id": "mock_payment_handler",
+ "name": "dev.ucp.mock_payment",
+ "version": "2026-01-11",
+ "spec": "https://ucp.dev/specs/mock",
+ "config_schema": "https://ucp.dev/schemas/mock.json",
+ "instrument_schemas": [
+ "https://ucp.dev/schemas/shopping/types/card_payment_instrument.json"
+ ],
+ "config": {
+ "supported_tokens": [
+ "success_token",
+ "fail_token"
+ ]
+ }
+ }
+ ]
+ }
+}
+```
+
+## Running Conformance Tests
+
+To verify that this server implementation complies with the UCP specifications,
+please use the official
+[UCP Conformance Test Suite](https://github.com/Universal-Commerce-Protocol/conformance).
+Refer to its documentation for prerequisites, installation, and detailed
+execution instructions.
+
+Assuming the conformance suite is configured to target port **8182**, you can
+run the fulfillment tests with a command similar to:
+
+```bash
+.venv/bin/python3 fulfillment_test.py \
+ --server_url=http://localhost:8182 \
+ --simulation_secret=super-secret-sim-key \
+ --conformance_input=test_data/flower_shop/conformance_input.json
+```
+
+## Testing Endpoints
+
+The server exposes additional endpoints for simulation and testing purposes.
+These are only available when the server is started with the `conformance`
+profile.
+
+**Note:** If you are relying on hot-swapping, ensure that you also include the
+`-Pconformance` flag during your build or compilation steps to keep these
+test-only classes active.
+
+* `POST /testing/simulate-shipping/{id}`: Triggers a simulated "order shipped"
+ event for the specified order ID. This updates the order status and sends a
+ webhook notification. This endpoint requires the `Simulation-Secret` header.
+
+## Database & Test Data
+
+The server uses an in-memory H2 database for the demo. The schema and initial
+flower shop data are automatically loaded on startup.
+
+If you wish to add custom products, discounts, or inventory for testing, you can
+modify `src/main/resources/data.sql`
+
+## Generating Models
+
+This project uses OpenAPI Generator to maintain strict adherence to the UCP
+schemas. Pre-generated models are provided in the `generated/` directory.
+
+### Workspace Structure
+
+The generation process assumes that the main `ucp` repository (containing the
+official specifications) is checked out in a directory sibling to the `samples`
+repository:
+
+```text
+/work/
+ ├── ucp/ <-- Official specifications
+ └── samples/ <-- This repository
+```
+
+### Regeneration Steps
+
+If the specifications change, you can regenerate the models:
+
+1. **Run the preparation and generation script**:
+
+ ```bash
+ ./generate_ucp_models.sh [optional_path_to_ucp_root]
+ ```
+
+ By default, it looks for UCP at `../../../ucp`.
+
+This script copies the official specs to `target/spec`, applies necessary
+compatibility transformations, and runs the code generator.
+
+The generated code will be placed in the `generated/` directory and is
+automatically included in the main build's classpath.
+
+## Terminate the server
+
+Terminate the server process when finished:
+
+```bash
+kill -9 $(lsof -t -i :8182)
+```
+
+## Developer Guide: Core Framework Components
+
+The following files provide essential infrastructure for UCP compliance and are designed to be reused or extended as the protocol evolves:
+
+* **`CheckoutSessionsApiController.java`**: The primary REST entry point for the UCP Shopping API. It handles protocol-level concerns like `UCP-Agent` header validation before delegating business logic to specialized action classes.
+* **`DiscoveryController.java`**: Implements the mandatory UCP discovery endpoint (`.well-known/ucp`), advertising the server's supported protocol versions, services, and capabilities to the platform.
+* **`ExtensionsHelper.java` & `src/main/resources/openapi.extensions.json`**: These work in tandem to manage UCP extension fields. `openapi.extensions.json` defines the schema extensions for model generation, while `ExtensionsHelper.java` provides typed access to these fields. This infrastructure only requires updates when a new extension module is added to or removed from the protocol.
+* **`JacksonConfig.java`**: Handles the specialized JSON processing required by the UCP specification, including `JsonNullable` support and custom polymorphic deserialization for union types like `PaymentCredential` and `FulfillmentDestination`.
+* **`UCPExceptionControllerAdvice.java`**: Ensures that all service-layer exceptions are automatically transformed into structured, UCP-compliant error responses with appropriate protocol-standard error codes.
+* **`PlatformProfileResolver.java`**: Orchestrates the discovery and resolution of platform UCP profiles, enabling the server to dynamically determine capability endpoints and webhook configurations.
diff --git a/rest/java-spring/codegen.pom.xml b/rest/java-spring/codegen.pom.xml
new file mode 100644
index 0000000..a4c7906
--- /dev/null
+++ b/rest/java-spring/codegen.pom.xml
@@ -0,0 +1,128 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 3.5.9
+
+
+ com.dev.ucp
+ api-generator
+ 2026.1.11-1-SNAPSHOT
+ ucp-api-generator
+ UCP API Generator
+
+
+
+ Apache License, Version 2.0
+ https://www.apache.org/licenses/LICENSE-2.0.txt
+ repo
+
+
+
+
+
+
+
+
+
+
+
+
+ 25
+ ${project.basedir}/spec
+
+
+
+
+
+ org.openapitools
+ openapi-generator-maven-plugin
+ 7.17.0
+
+ spring
+ com.dev.ucp.service.shopping
+ com.dev.ucp.service.shopping.model
+
+
+ Postal_Address_1=PostalAddress
+ Item_Response_1=ItemResponse
+
+
+ AnyType=JsonNode
+ object=JsonNode
+
+
+ JsonNode=com.fasterxml.jackson.databind.JsonNode
+
+
+ true
+ swagger2
+ java8
+ true
+ false
+
+ false
+ false
+
+
+
+ generate-core-models
+
+ generate
+
+
+ ${spec.dir}/services/shopping/rest.openapi.json
+ true
+ true
+
+ true
+
+
+
+
+ generate-extensions
+
+ generate
+
+
+ ${basedir}/src/main/resources/openapi.extensions.json
+
+
+
+
+
+
+ com.mycila
+ license-maven-plugin
+ 4.6
+
+ apache_v2
+ ${project.basedir}/license_template.txt
+
+ SLASHSTAR_STYLE
+
+
+ **/*.java
+
+ true
+
+
+
+ add-license-headers
+ generate-sources
+
+ format
+
+
+ ${project.basedir}/generated
+
+
+
+
+
+
+
diff --git a/rest/java-spring/conformance/src/main/java/com/dev/ucp/conformance/SimulationController.java b/rest/java-spring/conformance/src/main/java/com/dev/ucp/conformance/SimulationController.java
new file mode 100644
index 0000000..0de4221
--- /dev/null
+++ b/rest/java-spring/conformance/src/main/java/com/dev/ucp/conformance/SimulationController.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.dev.ucp.conformance;
+
+import com.dev.ucp.OrderWebHookNotifier;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * Optional testing controller part of the UCP conformance extension.
+ *
+ *
This controller provides endpoints to simulate post-checkout lifecycle events that would
+ * normally occur within internal merchant systems (like ERP or WMS). It is intended only for
+ * protocol verification and automated conformance testing.
+ *
+ *
This controller is only active when the 'conformance' Maven profile is enabled.
+ */
+@RestController
+public class SimulationController {
+
+ private static final String SIMULATION_SECRET = "super-secret-sim-key";
+
+ @Autowired private OrderWebHookNotifier webhookNotifier;
+
+ /**
+ * Manually triggers the 'order_shipped' webhook event for a given order.
+ *
+ *
The request must include a valid 'Simulation-Secret' header to be authorized.
+ *
+ * @param orderId the unique identifier of the order to simulate shipping for.
+ * @param secret the secret key provided in the 'Simulation-Secret' request header.
+ * @return a {@link ResponseEntity} with {@code 200 OK} if successful, or {@code 403 Forbidden} if
+ * the secret is invalid.
+ */
+ @PostMapping("/testing/simulate-shipping/{orderId}")
+ public ResponseEntity simulateShipping(
+ @PathVariable String orderId,
+ @RequestHeader(value = "Simulation-Secret", required = false) String secret) {
+
+ if (!SIMULATION_SECRET.equals(secret)) {
+ return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
+ }
+
+ webhookNotifier.triggerShipping(orderId);
+ return ResponseEntity.ok().build();
+ }
+}
diff --git a/rest/java-spring/generate_ucp_models.sh b/rest/java-spring/generate_ucp_models.sh
new file mode 100755
index 0000000..d6b1c49
--- /dev/null
+++ b/rest/java-spring/generate_ucp_models.sh
@@ -0,0 +1,51 @@
+#!/bin/bash
+#
+# Copyright 2026 UCP Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# Default UCP root directory assuming standard checkout structure
+UCP_ROOT_DEFAULT="../../../ucp"
+UCP_ROOT="${1:-$UCP_ROOT_DEFAULT}"
+SPEC_SRC="$UCP_ROOT/spec"
+SPEC_DEST="target/spec"
+
+if [ ! -d "$SPEC_SRC" ]; then
+ echo "Error: UCP spec directory not found at $SPEC_SRC"
+ echo "Usage: $0 [path_to_ucp_root]"
+ exit 1
+fi
+
+echo "Preparing specs from $SPEC_SRC into $SPEC_DEST..."
+
+# Clean and recreate target/spec
+rm -rf "$SPEC_DEST"
+mkdir -p "$SPEC_DEST"
+
+# Copy original specs
+cp -r "$SPEC_SRC/"* "$SPEC_DEST/"
+
+# Apply transformations for OpenAPI generator compatibility
+# 1. Replace ucp.dev URLs with local relative paths for generator to find local files
+sed -i "s/https:\/\/ucp.dev\//..\/..\//g" "$SPEC_DEST/services/shopping/rest.openapi.json"
+
+# 2. Remove $id fields to prevent the OpenAPI 3.1 generator from using them as
+# base URIs for reference resolution. This ensures local file-based resolution
+# and avoids errors when specs are not yet hosted or when testing local changes.
+find "$SPEC_DEST" -name "*.json" -exec sed -i '/"$id":/d' {} +
+
+echo "Specs prepared. Running code generation..."
+
+# Run the code generator pointing to the modified specs
+mvn -f codegen.pom.xml generate-sources -Dspec.dir="$SPEC_DEST"
\ No newline at end of file
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/CheckoutSessionsApi.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/CheckoutSessionsApi.java
new file mode 100644
index 0000000..3a17e23
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/CheckoutSessionsApi.java
@@ -0,0 +1,379 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (7.17.0).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+package com.dev.ucp.service.shopping;
+
+import com.dev.ucp.service.shopping.model.CheckoutCreateRequest;
+import com.dev.ucp.service.shopping.model.CheckoutResponse;
+import com.dev.ucp.service.shopping.model.CheckoutUpdateRequest;
+import com.dev.ucp.service.shopping.model.CompleteCheckoutRequest;
+import org.springframework.lang.Nullable;
+import java.util.UUID;
+import io.swagger.v3.oas.annotations.ExternalDocumentation;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
+import io.swagger.v3.oas.annotations.media.ArraySchema;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.security.SecurityRequirement;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.enums.ParameterIn;
+import io.swagger.v3.oas.annotations.media.ExampleObject;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.context.request.NativeWebRequest;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import jakarta.annotation.Generated;
+
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+@Validated
+@Tag(name = "checkout-sessions", description = "the checkout-sessions API")
+public interface CheckoutSessionsApi {
+
+ default Optional getRequest() {
+ return Optional.empty();
+ }
+
+ String PATH_CANCEL_CHECKOUT = "/checkout-sessions/{id}/cancel";
+ /**
+ * POST /checkout-sessions/{id}/cancel : Cancel Checkout
+ * Cancel a checkout session
+ *
+ * @param requestSignature Ensure the authenticity and integrity of an HTTP message. (required)
+ * @param idempotencyKey Ensures duplicate operations don't happen during retries. (required)
+ * @param requestId For tracing the requests across network layers and components. (required)
+ * @param ucPAgent Identifies the UCP agent making the call. All requests MUST include the UCP-Agent header containing the platform profile URI using Dictionary Structured Field syntax (RFC 8941). Format: profile=\"https://platform.example/profile\". (required)
+ * @param id The unique identifier of the checkout session. (required)
+ * @param authorization Should contain oauth token representing the following 2 schemes: 1. Platform self authenticating (client_credentials). 2. Platform authenticating on behalf of end user (authorization_code). (optional)
+ * @param xAPIKey Authenticates the platform with a reusable api key allocated to the platform by the business. (optional)
+ * @param userAgent Identifies the user agent string making the call. (optional)
+ * @param contentType Representation Metadata. Tells the receiver what the data in the message body actually is. (optional)
+ * @param accept Content Negotiation. The client tells the server what data formats it is capable of understanding. (optional)
+ * @param acceptLanguage Localization. Tells the receiver the user's preferred natural languages, often with \"weights\" or priorities. (optional)
+ * @param acceptEncoding Compression. The client tells the server which content-codings it supports, usually for compression (optional)
+ * @return Checkout session canceled (status code 200)
+ */
+ @Operation(
+ operationId = "cancelCheckout",
+ summary = "Cancel Checkout",
+ description = "Cancel a checkout session",
+ responses = {
+ @ApiResponse(responseCode = "200", description = "Checkout session canceled", content = {
+ @Content(mediaType = "application/json", schema = @Schema(implementation = CheckoutResponse.class))
+ })
+ }
+ )
+ @RequestMapping(
+ method = RequestMethod.POST,
+ value = CheckoutSessionsApi.PATH_CANCEL_CHECKOUT,
+ produces = { "application/json" }
+ )
+ default ResponseEntity cancelCheckout(
+ @NotNull @Parameter(name = "Request-Signature", description = "Ensure the authenticity and integrity of an HTTP message.", required = true, in = ParameterIn.HEADER) @RequestHeader(value = "Request-Signature", required = true) String requestSignature,
+ @NotNull @Parameter(name = "Idempotency-Key", description = "Ensures duplicate operations don't happen during retries.", required = true, in = ParameterIn.HEADER) @RequestHeader(value = "Idempotency-Key", required = true) UUID idempotencyKey,
+ @NotNull @Parameter(name = "Request-Id", description = "For tracing the requests across network layers and components.", required = true, in = ParameterIn.HEADER) @RequestHeader(value = "Request-Id", required = true) UUID requestId,
+ @NotNull @Parameter(name = "UCP-Agent", description = "Identifies the UCP agent making the call. All requests MUST include the UCP-Agent header containing the platform profile URI using Dictionary Structured Field syntax (RFC 8941). Format: profile=\"https://platform.example/profile\".", required = true, in = ParameterIn.HEADER) @RequestHeader(value = "UCP-Agent", required = true) String ucPAgent,
+ @NotNull @Parameter(name = "id", description = "The unique identifier of the checkout session.", required = true, in = ParameterIn.PATH) @PathVariable("id") String id,
+ @Parameter(name = "Authorization", description = "Should contain oauth token representing the following 2 schemes: 1. Platform self authenticating (client_credentials). 2. Platform authenticating on behalf of end user (authorization_code).", in = ParameterIn.HEADER) @RequestHeader(value = "Authorization", required = false) @Nullable String authorization,
+ @Parameter(name = "X-API-Key", description = "Authenticates the platform with a reusable api key allocated to the platform by the business.", in = ParameterIn.HEADER) @RequestHeader(value = "X-API-Key", required = false) @Nullable String xAPIKey,
+ @Parameter(name = "User-Agent", description = "Identifies the user agent string making the call.", in = ParameterIn.HEADER) @RequestHeader(value = "User-Agent", required = false) @Nullable String userAgent,
+ @Parameter(name = "Content-Type", description = "Representation Metadata. Tells the receiver what the data in the message body actually is.", in = ParameterIn.HEADER) @RequestHeader(value = "Content-Type", required = false) @Nullable String contentType,
+ @Parameter(name = "Accept", description = "Content Negotiation. The client tells the server what data formats it is capable of understanding.", in = ParameterIn.HEADER) @RequestHeader(value = "Accept", required = false) @Nullable String accept,
+ @Parameter(name = "Accept-Language", description = "Localization. Tells the receiver the user's preferred natural languages, often with \"weights\" or priorities.", in = ParameterIn.HEADER) @RequestHeader(value = "Accept-Language", required = false) @Nullable String acceptLanguage,
+ @Parameter(name = "Accept-Encoding", description = "Compression. The client tells the server which content-codings it supports, usually for compression", in = ParameterIn.HEADER) @RequestHeader(value = "Accept-Encoding", required = false) @Nullable String acceptEncoding
+ ) {
+ getRequest().ifPresent(request -> {
+ for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) {
+ if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) {
+ String exampleString = "{ \"ucp\" : { \"capabilities\" : [ { \"schema\" : \"https://openapi-generator.tech\", \"extends\" : \"extends\", \"name\" : \"name\", \"version\" : \"version\", \"config\" : \"{}\", \"spec\" : \"https://openapi-generator.tech\" }, { \"schema\" : \"https://openapi-generator.tech\", \"extends\" : \"extends\", \"name\" : \"name\", \"version\" : \"version\", \"config\" : \"{}\", \"spec\" : \"https://openapi-generator.tech\" } ], \"version\" : \"version\" }, \"line_items\" : [ { \"item\" : { \"price\" : 0, \"image_url\" : \"https://openapi-generator.tech\", \"id\" : \"id\", \"title\" : \"title\" }, \"quantity\" : 1, \"parent_id\" : \"parent_id\", \"id\" : \"id\", \"totals\" : [ { \"amount\" : 0, \"type\" : \"items_discount\", \"display_text\" : \"display_text\" }, { \"amount\" : 0, \"type\" : \"items_discount\", \"display_text\" : \"display_text\" } ] }, { \"item\" : { \"price\" : 0, \"image_url\" : \"https://openapi-generator.tech\", \"id\" : \"id\", \"title\" : \"title\" }, \"quantity\" : 1, \"parent_id\" : \"parent_id\", \"id\" : \"id\", \"totals\" : [ { \"amount\" : 0, \"type\" : \"items_discount\", \"display_text\" : \"display_text\" }, { \"amount\" : 0, \"type\" : \"items_discount\", \"display_text\" : \"display_text\" } ] } ], \"totals\" : [ { \"amount\" : 0, \"type\" : \"items_discount\", \"display_text\" : \"display_text\" }, { \"amount\" : 0, \"type\" : \"items_discount\", \"display_text\" : \"display_text\" } ], \"continue_url\" : \"https://openapi-generator.tech\", \"buyer\" : { \"full_name\" : \"full_name\", \"last_name\" : \"last_name\", \"phone_number\" : \"phone_number\", \"first_name\" : \"first_name\", \"email\" : \"email\" }, \"expires_at\" : \"2000-01-23T04:56:07.000+00:00\", \"messages\" : [ { \"severity\" : \"recoverable\", \"path\" : \"path\", \"code\" : \"code\", \"content_type\" : \"plain\", \"type\" : \"error\", \"content\" : \"content\" }, { \"severity\" : \"recoverable\", \"path\" : \"path\", \"code\" : \"code\", \"content_type\" : \"plain\", \"type\" : \"error\", \"content\" : \"content\" } ], \"currency\" : \"currency\", \"links\" : [ { \"type\" : \"type\", \"title\" : \"title\", \"url\" : \"https://openapi-generator.tech\" }, { \"type\" : \"type\", \"title\" : \"title\", \"url\" : \"https://openapi-generator.tech\" } ], \"payment\" : { \"instruments\" : [ { \"expiry_month\" : 5, \"handler_id\" : \"handler_id\", \"credential\" : { \"type\" : \"type\" }, \"billing_address\" : { \"extended_address\" : \"extended_address\", \"street_address\" : \"street_address\", \"full_name\" : \"full_name\", \"address_region\" : \"address_region\", \"address_country\" : \"address_country\", \"address_locality\" : \"address_locality\", \"last_name\" : \"last_name\", \"phone_number\" : \"phone_number\", \"postal_code\" : \"postal_code\", \"first_name\" : \"first_name\" }, \"id\" : \"id\", \"type\" : \"card\", \"brand\" : \"brand\", \"last_digits\" : \"last_digits\", \"rich_text_description\" : \"rich_text_description\", \"expiry_year\" : 5, \"rich_card_art\" : \"https://openapi-generator.tech\" }, { \"expiry_month\" : 5, \"handler_id\" : \"handler_id\", \"credential\" : { \"type\" : \"type\" }, \"billing_address\" : { \"extended_address\" : \"extended_address\", \"street_address\" : \"street_address\", \"full_name\" : \"full_name\", \"address_region\" : \"address_region\", \"address_country\" : \"address_country\", \"address_locality\" : \"address_locality\", \"last_name\" : \"last_name\", \"phone_number\" : \"phone_number\", \"postal_code\" : \"postal_code\", \"first_name\" : \"first_name\" }, \"id\" : \"id\", \"type\" : \"card\", \"brand\" : \"brand\", \"last_digits\" : \"last_digits\", \"rich_text_description\" : \"rich_text_description\", \"expiry_year\" : 5, \"rich_card_art\" : \"https://openapi-generator.tech\" } ], \"selected_instrument_id\" : \"selected_instrument_id\", \"handlers\" : [ { \"instrument_schemas\" : [ \"https://openapi-generator.tech\", \"https://openapi-generator.tech\" ], \"name\" : \"name\", \"id\" : \"id\", \"config_schema\" : \"https://openapi-generator.tech\", \"version\" : \"version\", \"config\" : { \"key\" : \"\" }, \"spec\" : \"https://openapi-generator.tech\" }, { \"instrument_schemas\" : [ \"https://openapi-generator.tech\", \"https://openapi-generator.tech\" ], \"name\" : \"name\", \"id\" : \"id\", \"config_schema\" : \"https://openapi-generator.tech\", \"version\" : \"version\", \"config\" : { \"key\" : \"\" }, \"spec\" : \"https://openapi-generator.tech\" } ] }, \"id\" : \"id\", \"status\" : \"incomplete\", \"order\" : { \"id\" : \"id\", \"permalink_url\" : \"https://openapi-generator.tech\" } }";
+ ApiUtil.setExampleResponse(request, "application/json", exampleString);
+ break;
+ }
+ }
+ });
+ return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
+
+ }
+
+
+ String PATH_COMPLETE_CHECKOUT = "/checkout-sessions/{id}/complete";
+ /**
+ * POST /checkout-sessions/{id}/complete : Complete Checkout
+ * Place the order
+ *
+ * @param requestSignature Ensure the authenticity and integrity of an HTTP message. (required)
+ * @param idempotencyKey Ensures duplicate operations don't happen during retries. (required)
+ * @param requestId For tracing the requests across network layers and components. (required)
+ * @param ucPAgent Identifies the UCP agent making the call. All requests MUST include the UCP-Agent header containing the platform profile URI using Dictionary Structured Field syntax (RFC 8941). Format: profile=\"https://platform.example/profile\". (required)
+ * @param id The unique identifier of the checkout session. (required)
+ * @param completeCheckoutRequest (required)
+ * @param authorization Should contain oauth token representing the following 2 schemes: 1. Platform self authenticating (client_credentials). 2. Platform authenticating on behalf of end user (authorization_code). (optional)
+ * @param xAPIKey Authenticates the platform with a reusable api key allocated to the platform by the business. (optional)
+ * @param userAgent Identifies the user agent string making the call. (optional)
+ * @param contentType Representation Metadata. Tells the receiver what the data in the message body actually is. (optional)
+ * @param accept Content Negotiation. The client tells the server what data formats it is capable of understanding. (optional)
+ * @param acceptLanguage Localization. Tells the receiver the user's preferred natural languages, often with \"weights\" or priorities. (optional)
+ * @param acceptEncoding Compression. The client tells the server which content-codings it supports, usually for compression (optional)
+ * @return Checkout session completed (status code 200)
+ */
+ @Operation(
+ operationId = "completeCheckout",
+ summary = "Complete Checkout",
+ description = "Place the order",
+ responses = {
+ @ApiResponse(responseCode = "200", description = "Checkout session completed", content = {
+ @Content(mediaType = "application/json", schema = @Schema(implementation = CheckoutResponse.class))
+ })
+ }
+ )
+ @RequestMapping(
+ method = RequestMethod.POST,
+ value = CheckoutSessionsApi.PATH_COMPLETE_CHECKOUT,
+ produces = { "application/json" },
+ consumes = { "application/json" }
+ )
+ default ResponseEntity completeCheckout(
+ @NotNull @Parameter(name = "Request-Signature", description = "Ensure the authenticity and integrity of an HTTP message.", required = true, in = ParameterIn.HEADER) @RequestHeader(value = "Request-Signature", required = true) String requestSignature,
+ @NotNull @Parameter(name = "Idempotency-Key", description = "Ensures duplicate operations don't happen during retries.", required = true, in = ParameterIn.HEADER) @RequestHeader(value = "Idempotency-Key", required = true) UUID idempotencyKey,
+ @NotNull @Parameter(name = "Request-Id", description = "For tracing the requests across network layers and components.", required = true, in = ParameterIn.HEADER) @RequestHeader(value = "Request-Id", required = true) UUID requestId,
+ @NotNull @Parameter(name = "UCP-Agent", description = "Identifies the UCP agent making the call. All requests MUST include the UCP-Agent header containing the platform profile URI using Dictionary Structured Field syntax (RFC 8941). Format: profile=\"https://platform.example/profile\".", required = true, in = ParameterIn.HEADER) @RequestHeader(value = "UCP-Agent", required = true) String ucPAgent,
+ @NotNull @Parameter(name = "id", description = "The unique identifier of the checkout session.", required = true, in = ParameterIn.PATH) @PathVariable("id") String id,
+ @Parameter(name = "CompleteCheckoutRequest", description = "", required = true) @Valid @RequestBody CompleteCheckoutRequest completeCheckoutRequest,
+ @Parameter(name = "Authorization", description = "Should contain oauth token representing the following 2 schemes: 1. Platform self authenticating (client_credentials). 2. Platform authenticating on behalf of end user (authorization_code).", in = ParameterIn.HEADER) @RequestHeader(value = "Authorization", required = false) @Nullable String authorization,
+ @Parameter(name = "X-API-Key", description = "Authenticates the platform with a reusable api key allocated to the platform by the business.", in = ParameterIn.HEADER) @RequestHeader(value = "X-API-Key", required = false) @Nullable String xAPIKey,
+ @Parameter(name = "User-Agent", description = "Identifies the user agent string making the call.", in = ParameterIn.HEADER) @RequestHeader(value = "User-Agent", required = false) @Nullable String userAgent,
+ @Parameter(name = "Content-Type", description = "Representation Metadata. Tells the receiver what the data in the message body actually is.", in = ParameterIn.HEADER) @RequestHeader(value = "Content-Type", required = false) @Nullable String contentType,
+ @Parameter(name = "Accept", description = "Content Negotiation. The client tells the server what data formats it is capable of understanding.", in = ParameterIn.HEADER) @RequestHeader(value = "Accept", required = false) @Nullable String accept,
+ @Parameter(name = "Accept-Language", description = "Localization. Tells the receiver the user's preferred natural languages, often with \"weights\" or priorities.", in = ParameterIn.HEADER) @RequestHeader(value = "Accept-Language", required = false) @Nullable String acceptLanguage,
+ @Parameter(name = "Accept-Encoding", description = "Compression. The client tells the server which content-codings it supports, usually for compression", in = ParameterIn.HEADER) @RequestHeader(value = "Accept-Encoding", required = false) @Nullable String acceptEncoding
+ ) {
+ getRequest().ifPresent(request -> {
+ for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) {
+ if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) {
+ String exampleString = "{ \"ucp\" : { \"capabilities\" : [ { \"schema\" : \"https://openapi-generator.tech\", \"extends\" : \"extends\", \"name\" : \"name\", \"version\" : \"version\", \"config\" : \"{}\", \"spec\" : \"https://openapi-generator.tech\" }, { \"schema\" : \"https://openapi-generator.tech\", \"extends\" : \"extends\", \"name\" : \"name\", \"version\" : \"version\", \"config\" : \"{}\", \"spec\" : \"https://openapi-generator.tech\" } ], \"version\" : \"version\" }, \"line_items\" : [ { \"item\" : { \"price\" : 0, \"image_url\" : \"https://openapi-generator.tech\", \"id\" : \"id\", \"title\" : \"title\" }, \"quantity\" : 1, \"parent_id\" : \"parent_id\", \"id\" : \"id\", \"totals\" : [ { \"amount\" : 0, \"type\" : \"items_discount\", \"display_text\" : \"display_text\" }, { \"amount\" : 0, \"type\" : \"items_discount\", \"display_text\" : \"display_text\" } ] }, { \"item\" : { \"price\" : 0, \"image_url\" : \"https://openapi-generator.tech\", \"id\" : \"id\", \"title\" : \"title\" }, \"quantity\" : 1, \"parent_id\" : \"parent_id\", \"id\" : \"id\", \"totals\" : [ { \"amount\" : 0, \"type\" : \"items_discount\", \"display_text\" : \"display_text\" }, { \"amount\" : 0, \"type\" : \"items_discount\", \"display_text\" : \"display_text\" } ] } ], \"totals\" : [ { \"amount\" : 0, \"type\" : \"items_discount\", \"display_text\" : \"display_text\" }, { \"amount\" : 0, \"type\" : \"items_discount\", \"display_text\" : \"display_text\" } ], \"continue_url\" : \"https://openapi-generator.tech\", \"buyer\" : { \"full_name\" : \"full_name\", \"last_name\" : \"last_name\", \"phone_number\" : \"phone_number\", \"first_name\" : \"first_name\", \"email\" : \"email\" }, \"expires_at\" : \"2000-01-23T04:56:07.000+00:00\", \"messages\" : [ { \"severity\" : \"recoverable\", \"path\" : \"path\", \"code\" : \"code\", \"content_type\" : \"plain\", \"type\" : \"error\", \"content\" : \"content\" }, { \"severity\" : \"recoverable\", \"path\" : \"path\", \"code\" : \"code\", \"content_type\" : \"plain\", \"type\" : \"error\", \"content\" : \"content\" } ], \"currency\" : \"currency\", \"links\" : [ { \"type\" : \"type\", \"title\" : \"title\", \"url\" : \"https://openapi-generator.tech\" }, { \"type\" : \"type\", \"title\" : \"title\", \"url\" : \"https://openapi-generator.tech\" } ], \"payment\" : { \"instruments\" : [ { \"expiry_month\" : 5, \"handler_id\" : \"handler_id\", \"credential\" : { \"type\" : \"type\" }, \"billing_address\" : { \"extended_address\" : \"extended_address\", \"street_address\" : \"street_address\", \"full_name\" : \"full_name\", \"address_region\" : \"address_region\", \"address_country\" : \"address_country\", \"address_locality\" : \"address_locality\", \"last_name\" : \"last_name\", \"phone_number\" : \"phone_number\", \"postal_code\" : \"postal_code\", \"first_name\" : \"first_name\" }, \"id\" : \"id\", \"type\" : \"card\", \"brand\" : \"brand\", \"last_digits\" : \"last_digits\", \"rich_text_description\" : \"rich_text_description\", \"expiry_year\" : 5, \"rich_card_art\" : \"https://openapi-generator.tech\" }, { \"expiry_month\" : 5, \"handler_id\" : \"handler_id\", \"credential\" : { \"type\" : \"type\" }, \"billing_address\" : { \"extended_address\" : \"extended_address\", \"street_address\" : \"street_address\", \"full_name\" : \"full_name\", \"address_region\" : \"address_region\", \"address_country\" : \"address_country\", \"address_locality\" : \"address_locality\", \"last_name\" : \"last_name\", \"phone_number\" : \"phone_number\", \"postal_code\" : \"postal_code\", \"first_name\" : \"first_name\" }, \"id\" : \"id\", \"type\" : \"card\", \"brand\" : \"brand\", \"last_digits\" : \"last_digits\", \"rich_text_description\" : \"rich_text_description\", \"expiry_year\" : 5, \"rich_card_art\" : \"https://openapi-generator.tech\" } ], \"selected_instrument_id\" : \"selected_instrument_id\", \"handlers\" : [ { \"instrument_schemas\" : [ \"https://openapi-generator.tech\", \"https://openapi-generator.tech\" ], \"name\" : \"name\", \"id\" : \"id\", \"config_schema\" : \"https://openapi-generator.tech\", \"version\" : \"version\", \"config\" : { \"key\" : \"\" }, \"spec\" : \"https://openapi-generator.tech\" }, { \"instrument_schemas\" : [ \"https://openapi-generator.tech\", \"https://openapi-generator.tech\" ], \"name\" : \"name\", \"id\" : \"id\", \"config_schema\" : \"https://openapi-generator.tech\", \"version\" : \"version\", \"config\" : { \"key\" : \"\" }, \"spec\" : \"https://openapi-generator.tech\" } ] }, \"id\" : \"id\", \"status\" : \"incomplete\", \"order\" : { \"id\" : \"id\", \"permalink_url\" : \"https://openapi-generator.tech\" } }";
+ ApiUtil.setExampleResponse(request, "application/json", exampleString);
+ break;
+ }
+ }
+ });
+ return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
+
+ }
+
+
+ String PATH_CREATE_CHECKOUT = "/checkout-sessions";
+ /**
+ * POST /checkout-sessions : Create Checkout
+ * Create a checkout session. Called as soon as a user adds an item to a cart.
+ *
+ * @param requestSignature Ensure the authenticity and integrity of an HTTP message. (required)
+ * @param idempotencyKey Ensures duplicate operations don't happen during retries. (required)
+ * @param requestId For tracing the requests across network layers and components. (required)
+ * @param ucPAgent Identifies the UCP agent making the call. All requests MUST include the UCP-Agent header containing the platform profile URI using Dictionary Structured Field syntax (RFC 8941). Format: profile=\"https://platform.example/profile\". (required)
+ * @param checkoutCreateRequest (required)
+ * @param authorization Should contain oauth token representing the following 2 schemes: 1. Platform self authenticating (client_credentials). 2. Platform authenticating on behalf of end user (authorization_code). (optional)
+ * @param xAPIKey Authenticates the platform with a reusable api key allocated to the platform by the business. (optional)
+ * @param userAgent Identifies the user agent string making the call. (optional)
+ * @param contentType Representation Metadata. Tells the receiver what the data in the message body actually is. (optional)
+ * @param accept Content Negotiation. The client tells the server what data formats it is capable of understanding. (optional)
+ * @param acceptLanguage Localization. Tells the receiver the user's preferred natural languages, often with \"weights\" or priorities. (optional)
+ * @param acceptEncoding Compression. The client tells the server which content-codings it supports, usually for compression (optional)
+ * @return Checkout session created (status code 201)
+ */
+ @Operation(
+ operationId = "createCheckout",
+ summary = "Create Checkout",
+ description = "Create a checkout session. Called as soon as a user adds an item to a cart.",
+ responses = {
+ @ApiResponse(responseCode = "201", description = "Checkout session created", content = {
+ @Content(mediaType = "application/json", schema = @Schema(implementation = CheckoutResponse.class))
+ })
+ }
+ )
+ @RequestMapping(
+ method = RequestMethod.POST,
+ value = CheckoutSessionsApi.PATH_CREATE_CHECKOUT,
+ produces = { "application/json" },
+ consumes = { "application/json" }
+ )
+ default ResponseEntity createCheckout(
+ @NotNull @Parameter(name = "Request-Signature", description = "Ensure the authenticity and integrity of an HTTP message.", required = true, in = ParameterIn.HEADER) @RequestHeader(value = "Request-Signature", required = true) String requestSignature,
+ @NotNull @Parameter(name = "Idempotency-Key", description = "Ensures duplicate operations don't happen during retries.", required = true, in = ParameterIn.HEADER) @RequestHeader(value = "Idempotency-Key", required = true) UUID idempotencyKey,
+ @NotNull @Parameter(name = "Request-Id", description = "For tracing the requests across network layers and components.", required = true, in = ParameterIn.HEADER) @RequestHeader(value = "Request-Id", required = true) UUID requestId,
+ @NotNull @Parameter(name = "UCP-Agent", description = "Identifies the UCP agent making the call. All requests MUST include the UCP-Agent header containing the platform profile URI using Dictionary Structured Field syntax (RFC 8941). Format: profile=\"https://platform.example/profile\".", required = true, in = ParameterIn.HEADER) @RequestHeader(value = "UCP-Agent", required = true) String ucPAgent,
+ @Parameter(name = "CheckoutCreateRequest", description = "", required = true) @Valid @RequestBody CheckoutCreateRequest checkoutCreateRequest,
+ @Parameter(name = "Authorization", description = "Should contain oauth token representing the following 2 schemes: 1. Platform self authenticating (client_credentials). 2. Platform authenticating on behalf of end user (authorization_code).", in = ParameterIn.HEADER) @RequestHeader(value = "Authorization", required = false) @Nullable String authorization,
+ @Parameter(name = "X-API-Key", description = "Authenticates the platform with a reusable api key allocated to the platform by the business.", in = ParameterIn.HEADER) @RequestHeader(value = "X-API-Key", required = false) @Nullable String xAPIKey,
+ @Parameter(name = "User-Agent", description = "Identifies the user agent string making the call.", in = ParameterIn.HEADER) @RequestHeader(value = "User-Agent", required = false) @Nullable String userAgent,
+ @Parameter(name = "Content-Type", description = "Representation Metadata. Tells the receiver what the data in the message body actually is.", in = ParameterIn.HEADER) @RequestHeader(value = "Content-Type", required = false) @Nullable String contentType,
+ @Parameter(name = "Accept", description = "Content Negotiation. The client tells the server what data formats it is capable of understanding.", in = ParameterIn.HEADER) @RequestHeader(value = "Accept", required = false) @Nullable String accept,
+ @Parameter(name = "Accept-Language", description = "Localization. Tells the receiver the user's preferred natural languages, often with \"weights\" or priorities.", in = ParameterIn.HEADER) @RequestHeader(value = "Accept-Language", required = false) @Nullable String acceptLanguage,
+ @Parameter(name = "Accept-Encoding", description = "Compression. The client tells the server which content-codings it supports, usually for compression", in = ParameterIn.HEADER) @RequestHeader(value = "Accept-Encoding", required = false) @Nullable String acceptEncoding
+ ) {
+ getRequest().ifPresent(request -> {
+ for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) {
+ if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) {
+ String exampleString = "{ \"ucp\" : { \"capabilities\" : [ { \"schema\" : \"https://openapi-generator.tech\", \"extends\" : \"extends\", \"name\" : \"name\", \"version\" : \"version\", \"config\" : \"{}\", \"spec\" : \"https://openapi-generator.tech\" }, { \"schema\" : \"https://openapi-generator.tech\", \"extends\" : \"extends\", \"name\" : \"name\", \"version\" : \"version\", \"config\" : \"{}\", \"spec\" : \"https://openapi-generator.tech\" } ], \"version\" : \"version\" }, \"line_items\" : [ { \"item\" : { \"price\" : 0, \"image_url\" : \"https://openapi-generator.tech\", \"id\" : \"id\", \"title\" : \"title\" }, \"quantity\" : 1, \"parent_id\" : \"parent_id\", \"id\" : \"id\", \"totals\" : [ { \"amount\" : 0, \"type\" : \"items_discount\", \"display_text\" : \"display_text\" }, { \"amount\" : 0, \"type\" : \"items_discount\", \"display_text\" : \"display_text\" } ] }, { \"item\" : { \"price\" : 0, \"image_url\" : \"https://openapi-generator.tech\", \"id\" : \"id\", \"title\" : \"title\" }, \"quantity\" : 1, \"parent_id\" : \"parent_id\", \"id\" : \"id\", \"totals\" : [ { \"amount\" : 0, \"type\" : \"items_discount\", \"display_text\" : \"display_text\" }, { \"amount\" : 0, \"type\" : \"items_discount\", \"display_text\" : \"display_text\" } ] } ], \"totals\" : [ { \"amount\" : 0, \"type\" : \"items_discount\", \"display_text\" : \"display_text\" }, { \"amount\" : 0, \"type\" : \"items_discount\", \"display_text\" : \"display_text\" } ], \"continue_url\" : \"https://openapi-generator.tech\", \"buyer\" : { \"full_name\" : \"full_name\", \"last_name\" : \"last_name\", \"phone_number\" : \"phone_number\", \"first_name\" : \"first_name\", \"email\" : \"email\" }, \"expires_at\" : \"2000-01-23T04:56:07.000+00:00\", \"messages\" : [ { \"severity\" : \"recoverable\", \"path\" : \"path\", \"code\" : \"code\", \"content_type\" : \"plain\", \"type\" : \"error\", \"content\" : \"content\" }, { \"severity\" : \"recoverable\", \"path\" : \"path\", \"code\" : \"code\", \"content_type\" : \"plain\", \"type\" : \"error\", \"content\" : \"content\" } ], \"currency\" : \"currency\", \"links\" : [ { \"type\" : \"type\", \"title\" : \"title\", \"url\" : \"https://openapi-generator.tech\" }, { \"type\" : \"type\", \"title\" : \"title\", \"url\" : \"https://openapi-generator.tech\" } ], \"payment\" : { \"instruments\" : [ { \"expiry_month\" : 5, \"handler_id\" : \"handler_id\", \"credential\" : { \"type\" : \"type\" }, \"billing_address\" : { \"extended_address\" : \"extended_address\", \"street_address\" : \"street_address\", \"full_name\" : \"full_name\", \"address_region\" : \"address_region\", \"address_country\" : \"address_country\", \"address_locality\" : \"address_locality\", \"last_name\" : \"last_name\", \"phone_number\" : \"phone_number\", \"postal_code\" : \"postal_code\", \"first_name\" : \"first_name\" }, \"id\" : \"id\", \"type\" : \"card\", \"brand\" : \"brand\", \"last_digits\" : \"last_digits\", \"rich_text_description\" : \"rich_text_description\", \"expiry_year\" : 5, \"rich_card_art\" : \"https://openapi-generator.tech\" }, { \"expiry_month\" : 5, \"handler_id\" : \"handler_id\", \"credential\" : { \"type\" : \"type\" }, \"billing_address\" : { \"extended_address\" : \"extended_address\", \"street_address\" : \"street_address\", \"full_name\" : \"full_name\", \"address_region\" : \"address_region\", \"address_country\" : \"address_country\", \"address_locality\" : \"address_locality\", \"last_name\" : \"last_name\", \"phone_number\" : \"phone_number\", \"postal_code\" : \"postal_code\", \"first_name\" : \"first_name\" }, \"id\" : \"id\", \"type\" : \"card\", \"brand\" : \"brand\", \"last_digits\" : \"last_digits\", \"rich_text_description\" : \"rich_text_description\", \"expiry_year\" : 5, \"rich_card_art\" : \"https://openapi-generator.tech\" } ], \"selected_instrument_id\" : \"selected_instrument_id\", \"handlers\" : [ { \"instrument_schemas\" : [ \"https://openapi-generator.tech\", \"https://openapi-generator.tech\" ], \"name\" : \"name\", \"id\" : \"id\", \"config_schema\" : \"https://openapi-generator.tech\", \"version\" : \"version\", \"config\" : { \"key\" : \"\" }, \"spec\" : \"https://openapi-generator.tech\" }, { \"instrument_schemas\" : [ \"https://openapi-generator.tech\", \"https://openapi-generator.tech\" ], \"name\" : \"name\", \"id\" : \"id\", \"config_schema\" : \"https://openapi-generator.tech\", \"version\" : \"version\", \"config\" : { \"key\" : \"\" }, \"spec\" : \"https://openapi-generator.tech\" } ] }, \"id\" : \"id\", \"status\" : \"incomplete\", \"order\" : { \"id\" : \"id\", \"permalink_url\" : \"https://openapi-generator.tech\" } }";
+ ApiUtil.setExampleResponse(request, "application/json", exampleString);
+ break;
+ }
+ }
+ });
+ return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
+
+ }
+
+
+ String PATH_GET_CHECKOUT = "/checkout-sessions/{id}";
+ /**
+ * GET /checkout-sessions/{id} : Get Checkout
+ * Get the latest state of a checkout session.
+ *
+ * @param requestSignature Ensure the authenticity and integrity of an HTTP message. (required)
+ * @param requestId For tracing the requests across network layers and components. (required)
+ * @param ucPAgent Identifies the UCP agent making the call. All requests MUST include the UCP-Agent header containing the platform profile URI using Dictionary Structured Field syntax (RFC 8941). Format: profile=\"https://platform.example/profile\". (required)
+ * @param id The unique identifier of the checkout session. (required)
+ * @param authorization Should contain oauth token representing the following 2 schemes: 1. Platform self authenticating (client_credentials). 2. Platform authenticating on behalf of end user (authorization_code). (optional)
+ * @param xAPIKey Authenticates the platform with a reusable api key allocated to the platform by the business. (optional)
+ * @param userAgent Identifies the user agent string making the call. (optional)
+ * @param contentType Representation Metadata. Tells the receiver what the data in the message body actually is. (optional)
+ * @param accept Content Negotiation. The client tells the server what data formats it is capable of understanding. (optional)
+ * @param acceptLanguage Localization. Tells the receiver the user's preferred natural languages, often with \"weights\" or priorities. (optional)
+ * @param acceptEncoding Compression. The client tells the server which content-codings it supports, usually for compression (optional)
+ * @return Checkout session retrieved (status code 200)
+ */
+ @Operation(
+ operationId = "getCheckout",
+ summary = "Get Checkout",
+ description = "Get the latest state of a checkout session.",
+ responses = {
+ @ApiResponse(responseCode = "200", description = "Checkout session retrieved", content = {
+ @Content(mediaType = "application/json", schema = @Schema(implementation = CheckoutResponse.class))
+ })
+ }
+ )
+ @RequestMapping(
+ method = RequestMethod.GET,
+ value = CheckoutSessionsApi.PATH_GET_CHECKOUT,
+ produces = { "application/json" }
+ )
+ default ResponseEntity getCheckout(
+ @NotNull @Parameter(name = "Request-Signature", description = "Ensure the authenticity and integrity of an HTTP message.", required = true, in = ParameterIn.HEADER) @RequestHeader(value = "Request-Signature", required = true) String requestSignature,
+ @NotNull @Parameter(name = "Request-Id", description = "For tracing the requests across network layers and components.", required = true, in = ParameterIn.HEADER) @RequestHeader(value = "Request-Id", required = true) UUID requestId,
+ @NotNull @Parameter(name = "UCP-Agent", description = "Identifies the UCP agent making the call. All requests MUST include the UCP-Agent header containing the platform profile URI using Dictionary Structured Field syntax (RFC 8941). Format: profile=\"https://platform.example/profile\".", required = true, in = ParameterIn.HEADER) @RequestHeader(value = "UCP-Agent", required = true) String ucPAgent,
+ @NotNull @Parameter(name = "id", description = "The unique identifier of the checkout session.", required = true, in = ParameterIn.PATH) @PathVariable("id") String id,
+ @Parameter(name = "Authorization", description = "Should contain oauth token representing the following 2 schemes: 1. Platform self authenticating (client_credentials). 2. Platform authenticating on behalf of end user (authorization_code).", in = ParameterIn.HEADER) @RequestHeader(value = "Authorization", required = false) @Nullable String authorization,
+ @Parameter(name = "X-API-Key", description = "Authenticates the platform with a reusable api key allocated to the platform by the business.", in = ParameterIn.HEADER) @RequestHeader(value = "X-API-Key", required = false) @Nullable String xAPIKey,
+ @Parameter(name = "User-Agent", description = "Identifies the user agent string making the call.", in = ParameterIn.HEADER) @RequestHeader(value = "User-Agent", required = false) @Nullable String userAgent,
+ @Parameter(name = "Content-Type", description = "Representation Metadata. Tells the receiver what the data in the message body actually is.", in = ParameterIn.HEADER) @RequestHeader(value = "Content-Type", required = false) @Nullable String contentType,
+ @Parameter(name = "Accept", description = "Content Negotiation. The client tells the server what data formats it is capable of understanding.", in = ParameterIn.HEADER) @RequestHeader(value = "Accept", required = false) @Nullable String accept,
+ @Parameter(name = "Accept-Language", description = "Localization. Tells the receiver the user's preferred natural languages, often with \"weights\" or priorities.", in = ParameterIn.HEADER) @RequestHeader(value = "Accept-Language", required = false) @Nullable String acceptLanguage,
+ @Parameter(name = "Accept-Encoding", description = "Compression. The client tells the server which content-codings it supports, usually for compression", in = ParameterIn.HEADER) @RequestHeader(value = "Accept-Encoding", required = false) @Nullable String acceptEncoding
+ ) {
+ getRequest().ifPresent(request -> {
+ for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) {
+ if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) {
+ String exampleString = "{ \"ucp\" : { \"capabilities\" : [ { \"schema\" : \"https://openapi-generator.tech\", \"extends\" : \"extends\", \"name\" : \"name\", \"version\" : \"version\", \"config\" : \"{}\", \"spec\" : \"https://openapi-generator.tech\" }, { \"schema\" : \"https://openapi-generator.tech\", \"extends\" : \"extends\", \"name\" : \"name\", \"version\" : \"version\", \"config\" : \"{}\", \"spec\" : \"https://openapi-generator.tech\" } ], \"version\" : \"version\" }, \"line_items\" : [ { \"item\" : { \"price\" : 0, \"image_url\" : \"https://openapi-generator.tech\", \"id\" : \"id\", \"title\" : \"title\" }, \"quantity\" : 1, \"parent_id\" : \"parent_id\", \"id\" : \"id\", \"totals\" : [ { \"amount\" : 0, \"type\" : \"items_discount\", \"display_text\" : \"display_text\" }, { \"amount\" : 0, \"type\" : \"items_discount\", \"display_text\" : \"display_text\" } ] }, { \"item\" : { \"price\" : 0, \"image_url\" : \"https://openapi-generator.tech\", \"id\" : \"id\", \"title\" : \"title\" }, \"quantity\" : 1, \"parent_id\" : \"parent_id\", \"id\" : \"id\", \"totals\" : [ { \"amount\" : 0, \"type\" : \"items_discount\", \"display_text\" : \"display_text\" }, { \"amount\" : 0, \"type\" : \"items_discount\", \"display_text\" : \"display_text\" } ] } ], \"totals\" : [ { \"amount\" : 0, \"type\" : \"items_discount\", \"display_text\" : \"display_text\" }, { \"amount\" : 0, \"type\" : \"items_discount\", \"display_text\" : \"display_text\" } ], \"continue_url\" : \"https://openapi-generator.tech\", \"buyer\" : { \"full_name\" : \"full_name\", \"last_name\" : \"last_name\", \"phone_number\" : \"phone_number\", \"first_name\" : \"first_name\", \"email\" : \"email\" }, \"expires_at\" : \"2000-01-23T04:56:07.000+00:00\", \"messages\" : [ { \"severity\" : \"recoverable\", \"path\" : \"path\", \"code\" : \"code\", \"content_type\" : \"plain\", \"type\" : \"error\", \"content\" : \"content\" }, { \"severity\" : \"recoverable\", \"path\" : \"path\", \"code\" : \"code\", \"content_type\" : \"plain\", \"type\" : \"error\", \"content\" : \"content\" } ], \"currency\" : \"currency\", \"links\" : [ { \"type\" : \"type\", \"title\" : \"title\", \"url\" : \"https://openapi-generator.tech\" }, { \"type\" : \"type\", \"title\" : \"title\", \"url\" : \"https://openapi-generator.tech\" } ], \"payment\" : { \"instruments\" : [ { \"expiry_month\" : 5, \"handler_id\" : \"handler_id\", \"credential\" : { \"type\" : \"type\" }, \"billing_address\" : { \"extended_address\" : \"extended_address\", \"street_address\" : \"street_address\", \"full_name\" : \"full_name\", \"address_region\" : \"address_region\", \"address_country\" : \"address_country\", \"address_locality\" : \"address_locality\", \"last_name\" : \"last_name\", \"phone_number\" : \"phone_number\", \"postal_code\" : \"postal_code\", \"first_name\" : \"first_name\" }, \"id\" : \"id\", \"type\" : \"card\", \"brand\" : \"brand\", \"last_digits\" : \"last_digits\", \"rich_text_description\" : \"rich_text_description\", \"expiry_year\" : 5, \"rich_card_art\" : \"https://openapi-generator.tech\" }, { \"expiry_month\" : 5, \"handler_id\" : \"handler_id\", \"credential\" : { \"type\" : \"type\" }, \"billing_address\" : { \"extended_address\" : \"extended_address\", \"street_address\" : \"street_address\", \"full_name\" : \"full_name\", \"address_region\" : \"address_region\", \"address_country\" : \"address_country\", \"address_locality\" : \"address_locality\", \"last_name\" : \"last_name\", \"phone_number\" : \"phone_number\", \"postal_code\" : \"postal_code\", \"first_name\" : \"first_name\" }, \"id\" : \"id\", \"type\" : \"card\", \"brand\" : \"brand\", \"last_digits\" : \"last_digits\", \"rich_text_description\" : \"rich_text_description\", \"expiry_year\" : 5, \"rich_card_art\" : \"https://openapi-generator.tech\" } ], \"selected_instrument_id\" : \"selected_instrument_id\", \"handlers\" : [ { \"instrument_schemas\" : [ \"https://openapi-generator.tech\", \"https://openapi-generator.tech\" ], \"name\" : \"name\", \"id\" : \"id\", \"config_schema\" : \"https://openapi-generator.tech\", \"version\" : \"version\", \"config\" : { \"key\" : \"\" }, \"spec\" : \"https://openapi-generator.tech\" }, { \"instrument_schemas\" : [ \"https://openapi-generator.tech\", \"https://openapi-generator.tech\" ], \"name\" : \"name\", \"id\" : \"id\", \"config_schema\" : \"https://openapi-generator.tech\", \"version\" : \"version\", \"config\" : { \"key\" : \"\" }, \"spec\" : \"https://openapi-generator.tech\" } ] }, \"id\" : \"id\", \"status\" : \"incomplete\", \"order\" : { \"id\" : \"id\", \"permalink_url\" : \"https://openapi-generator.tech\" } }";
+ ApiUtil.setExampleResponse(request, "application/json", exampleString);
+ break;
+ }
+ }
+ });
+ return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
+
+ }
+
+
+ String PATH_UPDATE_CHECKOUT = "/checkout-sessions/{id}";
+ /**
+ * PUT /checkout-sessions/{id} : Update Checkout
+ * If an optional field is provided in the request body, its value is treated as a complete replacement for the corresponding data. If optional field is omitted, then current checkout session is unchanged.
+ *
+ * @param requestSignature Ensure the authenticity and integrity of an HTTP message. (required)
+ * @param idempotencyKey Ensures duplicate operations don't happen during retries. (required)
+ * @param requestId For tracing the requests across network layers and components. (required)
+ * @param ucPAgent Identifies the UCP agent making the call. All requests MUST include the UCP-Agent header containing the platform profile URI using Dictionary Structured Field syntax (RFC 8941). Format: profile=\"https://platform.example/profile\". (required)
+ * @param id The unique identifier of the checkout session. (required)
+ * @param checkoutUpdateRequest (required)
+ * @param authorization Should contain oauth token representing the following 2 schemes: 1. Platform self authenticating (client_credentials). 2. Platform authenticating on behalf of end user (authorization_code). (optional)
+ * @param xAPIKey Authenticates the platform with a reusable api key allocated to the platform by the business. (optional)
+ * @param userAgent Identifies the user agent string making the call. (optional)
+ * @param contentType Representation Metadata. Tells the receiver what the data in the message body actually is. (optional)
+ * @param accept Content Negotiation. The client tells the server what data formats it is capable of understanding. (optional)
+ * @param acceptLanguage Localization. Tells the receiver the user's preferred natural languages, often with \"weights\" or priorities. (optional)
+ * @param acceptEncoding Compression. The client tells the server which content-codings it supports, usually for compression (optional)
+ * @return Checkout session updated (status code 200)
+ */
+ @Operation(
+ operationId = "updateCheckout",
+ summary = "Update Checkout",
+ description = "If an optional field is provided in the request body, its value is treated as a complete replacement for the corresponding data. If optional field is omitted, then current checkout session is unchanged.",
+ responses = {
+ @ApiResponse(responseCode = "200", description = "Checkout session updated", content = {
+ @Content(mediaType = "application/json", schema = @Schema(implementation = CheckoutResponse.class))
+ })
+ }
+ )
+ @RequestMapping(
+ method = RequestMethod.PUT,
+ value = CheckoutSessionsApi.PATH_UPDATE_CHECKOUT,
+ produces = { "application/json" },
+ consumes = { "application/json" }
+ )
+ default ResponseEntity updateCheckout(
+ @NotNull @Parameter(name = "Request-Signature", description = "Ensure the authenticity and integrity of an HTTP message.", required = true, in = ParameterIn.HEADER) @RequestHeader(value = "Request-Signature", required = true) String requestSignature,
+ @NotNull @Parameter(name = "Idempotency-Key", description = "Ensures duplicate operations don't happen during retries.", required = true, in = ParameterIn.HEADER) @RequestHeader(value = "Idempotency-Key", required = true) UUID idempotencyKey,
+ @NotNull @Parameter(name = "Request-Id", description = "For tracing the requests across network layers and components.", required = true, in = ParameterIn.HEADER) @RequestHeader(value = "Request-Id", required = true) UUID requestId,
+ @NotNull @Parameter(name = "UCP-Agent", description = "Identifies the UCP agent making the call. All requests MUST include the UCP-Agent header containing the platform profile URI using Dictionary Structured Field syntax (RFC 8941). Format: profile=\"https://platform.example/profile\".", required = true, in = ParameterIn.HEADER) @RequestHeader(value = "UCP-Agent", required = true) String ucPAgent,
+ @NotNull @Parameter(name = "id", description = "The unique identifier of the checkout session.", required = true, in = ParameterIn.PATH) @PathVariable("id") String id,
+ @Parameter(name = "CheckoutUpdateRequest", description = "", required = true) @Valid @RequestBody CheckoutUpdateRequest checkoutUpdateRequest,
+ @Parameter(name = "Authorization", description = "Should contain oauth token representing the following 2 schemes: 1. Platform self authenticating (client_credentials). 2. Platform authenticating on behalf of end user (authorization_code).", in = ParameterIn.HEADER) @RequestHeader(value = "Authorization", required = false) @Nullable String authorization,
+ @Parameter(name = "X-API-Key", description = "Authenticates the platform with a reusable api key allocated to the platform by the business.", in = ParameterIn.HEADER) @RequestHeader(value = "X-API-Key", required = false) @Nullable String xAPIKey,
+ @Parameter(name = "User-Agent", description = "Identifies the user agent string making the call.", in = ParameterIn.HEADER) @RequestHeader(value = "User-Agent", required = false) @Nullable String userAgent,
+ @Parameter(name = "Content-Type", description = "Representation Metadata. Tells the receiver what the data in the message body actually is.", in = ParameterIn.HEADER) @RequestHeader(value = "Content-Type", required = false) @Nullable String contentType,
+ @Parameter(name = "Accept", description = "Content Negotiation. The client tells the server what data formats it is capable of understanding.", in = ParameterIn.HEADER) @RequestHeader(value = "Accept", required = false) @Nullable String accept,
+ @Parameter(name = "Accept-Language", description = "Localization. Tells the receiver the user's preferred natural languages, often with \"weights\" or priorities.", in = ParameterIn.HEADER) @RequestHeader(value = "Accept-Language", required = false) @Nullable String acceptLanguage,
+ @Parameter(name = "Accept-Encoding", description = "Compression. The client tells the server which content-codings it supports, usually for compression", in = ParameterIn.HEADER) @RequestHeader(value = "Accept-Encoding", required = false) @Nullable String acceptEncoding
+ ) {
+ getRequest().ifPresent(request -> {
+ for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) {
+ if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) {
+ String exampleString = "{ \"ucp\" : { \"capabilities\" : [ { \"schema\" : \"https://openapi-generator.tech\", \"extends\" : \"extends\", \"name\" : \"name\", \"version\" : \"version\", \"config\" : \"{}\", \"spec\" : \"https://openapi-generator.tech\" }, { \"schema\" : \"https://openapi-generator.tech\", \"extends\" : \"extends\", \"name\" : \"name\", \"version\" : \"version\", \"config\" : \"{}\", \"spec\" : \"https://openapi-generator.tech\" } ], \"version\" : \"version\" }, \"line_items\" : [ { \"item\" : { \"price\" : 0, \"image_url\" : \"https://openapi-generator.tech\", \"id\" : \"id\", \"title\" : \"title\" }, \"quantity\" : 1, \"parent_id\" : \"parent_id\", \"id\" : \"id\", \"totals\" : [ { \"amount\" : 0, \"type\" : \"items_discount\", \"display_text\" : \"display_text\" }, { \"amount\" : 0, \"type\" : \"items_discount\", \"display_text\" : \"display_text\" } ] }, { \"item\" : { \"price\" : 0, \"image_url\" : \"https://openapi-generator.tech\", \"id\" : \"id\", \"title\" : \"title\" }, \"quantity\" : 1, \"parent_id\" : \"parent_id\", \"id\" : \"id\", \"totals\" : [ { \"amount\" : 0, \"type\" : \"items_discount\", \"display_text\" : \"display_text\" }, { \"amount\" : 0, \"type\" : \"items_discount\", \"display_text\" : \"display_text\" } ] } ], \"totals\" : [ { \"amount\" : 0, \"type\" : \"items_discount\", \"display_text\" : \"display_text\" }, { \"amount\" : 0, \"type\" : \"items_discount\", \"display_text\" : \"display_text\" } ], \"continue_url\" : \"https://openapi-generator.tech\", \"buyer\" : { \"full_name\" : \"full_name\", \"last_name\" : \"last_name\", \"phone_number\" : \"phone_number\", \"first_name\" : \"first_name\", \"email\" : \"email\" }, \"expires_at\" : \"2000-01-23T04:56:07.000+00:00\", \"messages\" : [ { \"severity\" : \"recoverable\", \"path\" : \"path\", \"code\" : \"code\", \"content_type\" : \"plain\", \"type\" : \"error\", \"content\" : \"content\" }, { \"severity\" : \"recoverable\", \"path\" : \"path\", \"code\" : \"code\", \"content_type\" : \"plain\", \"type\" : \"error\", \"content\" : \"content\" } ], \"currency\" : \"currency\", \"links\" : [ { \"type\" : \"type\", \"title\" : \"title\", \"url\" : \"https://openapi-generator.tech\" }, { \"type\" : \"type\", \"title\" : \"title\", \"url\" : \"https://openapi-generator.tech\" } ], \"payment\" : { \"instruments\" : [ { \"expiry_month\" : 5, \"handler_id\" : \"handler_id\", \"credential\" : { \"type\" : \"type\" }, \"billing_address\" : { \"extended_address\" : \"extended_address\", \"street_address\" : \"street_address\", \"full_name\" : \"full_name\", \"address_region\" : \"address_region\", \"address_country\" : \"address_country\", \"address_locality\" : \"address_locality\", \"last_name\" : \"last_name\", \"phone_number\" : \"phone_number\", \"postal_code\" : \"postal_code\", \"first_name\" : \"first_name\" }, \"id\" : \"id\", \"type\" : \"card\", \"brand\" : \"brand\", \"last_digits\" : \"last_digits\", \"rich_text_description\" : \"rich_text_description\", \"expiry_year\" : 5, \"rich_card_art\" : \"https://openapi-generator.tech\" }, { \"expiry_month\" : 5, \"handler_id\" : \"handler_id\", \"credential\" : { \"type\" : \"type\" }, \"billing_address\" : { \"extended_address\" : \"extended_address\", \"street_address\" : \"street_address\", \"full_name\" : \"full_name\", \"address_region\" : \"address_region\", \"address_country\" : \"address_country\", \"address_locality\" : \"address_locality\", \"last_name\" : \"last_name\", \"phone_number\" : \"phone_number\", \"postal_code\" : \"postal_code\", \"first_name\" : \"first_name\" }, \"id\" : \"id\", \"type\" : \"card\", \"brand\" : \"brand\", \"last_digits\" : \"last_digits\", \"rich_text_description\" : \"rich_text_description\", \"expiry_year\" : 5, \"rich_card_art\" : \"https://openapi-generator.tech\" } ], \"selected_instrument_id\" : \"selected_instrument_id\", \"handlers\" : [ { \"instrument_schemas\" : [ \"https://openapi-generator.tech\", \"https://openapi-generator.tech\" ], \"name\" : \"name\", \"id\" : \"id\", \"config_schema\" : \"https://openapi-generator.tech\", \"version\" : \"version\", \"config\" : { \"key\" : \"\" }, \"spec\" : \"https://openapi-generator.tech\" }, { \"instrument_schemas\" : [ \"https://openapi-generator.tech\", \"https://openapi-generator.tech\" ], \"name\" : \"name\", \"id\" : \"id\", \"config_schema\" : \"https://openapi-generator.tech\", \"version\" : \"version\", \"config\" : { \"key\" : \"\" }, \"spec\" : \"https://openapi-generator.tech\" } ] }, \"id\" : \"id\", \"status\" : \"incomplete\", \"order\" : { \"id\" : \"id\", \"permalink_url\" : \"https://openapi-generator.tech\" } }";
+ ApiUtil.setExampleResponse(request, "application/json", exampleString);
+ break;
+ }
+ }
+ });
+ return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
+
+ }
+
+}
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/Adjustment.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/Adjustment.java
new file mode 100644
index 0000000..7e55b3e
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/Adjustment.java
@@ -0,0 +1,406 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.AdjustmentLineItemsInner;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+import java.time.OffsetDateTime;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * Append-only event that exists independently of fulfillment. Typically represents money movements but can be any post-order change. Polymorphic type that can optionally reference line items.
+ */
+
+@Schema(name = "Adjustment", description = "Append-only event that exists independently of fulfillment. Typically represents money movements but can be any post-order change. Polymorphic type that can optionally reference line items.")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class Adjustment {
+
+ private String id;
+
+ private String type;
+
+ @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
+ private OffsetDateTime occurredAt;
+
+ /**
+ * Adjustment status.
+ */
+ public enum StatusEnum {
+ PENDING("pending"),
+
+ COMPLETED("completed"),
+
+ FAILED("failed");
+
+ private final String value;
+
+ StatusEnum(String value) {
+ this.value = value;
+ }
+
+ @JsonValue
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+ @JsonCreator
+ public static StatusEnum fromValue(String value) {
+ for (StatusEnum b : StatusEnum.values()) {
+ if (b.value.equals(value)) {
+ return b;
+ }
+ }
+ throw new IllegalArgumentException("Unexpected value '" + value + "'");
+ }
+ }
+
+ private StatusEnum status;
+
+ @Valid
+ private List<@Valid AdjustmentLineItemsInner> lineItems = new ArrayList<>();
+
+ private @Nullable Integer amount;
+
+ private @Nullable String description;
+
+ public Adjustment() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public Adjustment(String id, String type, OffsetDateTime occurredAt, StatusEnum status) {
+ this.id = id;
+ this.type = type;
+ this.occurredAt = occurredAt;
+ this.status = status;
+ }
+
+ public Adjustment id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Adjustment event identifier.
+ * @return id
+ */
+ @NotNull
+ @Schema(name = "id", description = "Adjustment event identifier.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("id")
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public Adjustment type(String type) {
+ this.type = type;
+ return this;
+ }
+
+ /**
+ * Type of adjustment (open string). Typically money-related like: refund, return, credit, price_adjustment, dispute, cancellation. Can be any value that makes sense for the merchant's business.
+ * @return type
+ */
+ @NotNull
+ @Schema(name = "type", description = "Type of adjustment (open string). Typically money-related like: refund, return, credit, price_adjustment, dispute, cancellation. Can be any value that makes sense for the merchant's business.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("type")
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public Adjustment occurredAt(OffsetDateTime occurredAt) {
+ this.occurredAt = occurredAt;
+ return this;
+ }
+
+ /**
+ * RFC 3339 timestamp when this adjustment occurred.
+ * @return occurredAt
+ */
+ @NotNull @Valid
+ @Schema(name = "occurred_at", description = "RFC 3339 timestamp when this adjustment occurred.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("occurred_at")
+ public OffsetDateTime getOccurredAt() {
+ return occurredAt;
+ }
+
+ public void setOccurredAt(OffsetDateTime occurredAt) {
+ this.occurredAt = occurredAt;
+ }
+
+ public Adjustment status(StatusEnum status) {
+ this.status = status;
+ return this;
+ }
+
+ /**
+ * Adjustment status.
+ * @return status
+ */
+ @NotNull
+ @Schema(name = "status", description = "Adjustment status.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("status")
+ public StatusEnum getStatus() {
+ return status;
+ }
+
+ public void setStatus(StatusEnum status) {
+ this.status = status;
+ }
+
+ public Adjustment lineItems(List<@Valid AdjustmentLineItemsInner> lineItems) {
+ this.lineItems = lineItems;
+ return this;
+ }
+
+ public Adjustment addLineItemsItem(AdjustmentLineItemsInner lineItemsItem) {
+ if (this.lineItems == null) {
+ this.lineItems = new ArrayList<>();
+ }
+ this.lineItems.add(lineItemsItem);
+ return this;
+ }
+
+ /**
+ * Which line items and quantities are affected (optional).
+ * @return lineItems
+ */
+ @Valid
+ @Schema(name = "line_items", description = "Which line items and quantities are affected (optional).", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("line_items")
+ public List<@Valid AdjustmentLineItemsInner> getLineItems() {
+ return lineItems;
+ }
+
+ public void setLineItems(List<@Valid AdjustmentLineItemsInner> lineItems) {
+ this.lineItems = lineItems;
+ }
+
+ public Adjustment amount(@Nullable Integer amount) {
+ this.amount = amount;
+ return this;
+ }
+
+ /**
+ * Amount in minor units (cents) for refunds, credits, price adjustments (optional).
+ * @return amount
+ */
+
+ @Schema(name = "amount", description = "Amount in minor units (cents) for refunds, credits, price adjustments (optional).", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("amount")
+ public @Nullable Integer getAmount() {
+ return amount;
+ }
+
+ public void setAmount(@Nullable Integer amount) {
+ this.amount = amount;
+ }
+
+ public Adjustment description(@Nullable String description) {
+ this.description = description;
+ return this;
+ }
+
+ /**
+ * Human-readable reason or description (e.g., 'Defective item', 'Customer requested').
+ * @return description
+ */
+
+ @Schema(name = "description", description = "Human-readable reason or description (e.g., 'Defective item', 'Customer requested').", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("description")
+ public @Nullable String getDescription() {
+ return description;
+ }
+
+ public void setDescription(@Nullable String description) {
+ this.description = description;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ Adjustment adjustment = (Adjustment) o;
+ return Objects.equals(this.id, adjustment.id) &&
+ Objects.equals(this.type, adjustment.type) &&
+ Objects.equals(this.occurredAt, adjustment.occurredAt) &&
+ Objects.equals(this.status, adjustment.status) &&
+ Objects.equals(this.lineItems, adjustment.lineItems) &&
+ Objects.equals(this.amount, adjustment.amount) &&
+ Objects.equals(this.description, adjustment.description);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, type, occurredAt, status, lineItems, amount, description);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class Adjustment {\n");
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" type: ").append(toIndentedString(type)).append("\n");
+ sb.append(" occurredAt: ").append(toIndentedString(occurredAt)).append("\n");
+ sb.append(" status: ").append(toIndentedString(status)).append("\n");
+ sb.append(" lineItems: ").append(toIndentedString(lineItems)).append("\n");
+ sb.append(" amount: ").append(toIndentedString(amount)).append("\n");
+ sb.append(" description: ").append(toIndentedString(description)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private Adjustment instance;
+
+ public Builder() {
+ this(new Adjustment());
+ }
+
+ protected Builder(Adjustment instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(Adjustment value) {
+ this.instance.setId(value.id);
+ this.instance.setType(value.type);
+ this.instance.setOccurredAt(value.occurredAt);
+ this.instance.setStatus(value.status);
+ this.instance.setLineItems(value.lineItems);
+ this.instance.setAmount(value.amount);
+ this.instance.setDescription(value.description);
+ return this;
+ }
+
+ public Adjustment.Builder id(String id) {
+ this.instance.id(id);
+ return this;
+ }
+
+ public Adjustment.Builder type(String type) {
+ this.instance.type(type);
+ return this;
+ }
+
+ public Adjustment.Builder occurredAt(OffsetDateTime occurredAt) {
+ this.instance.occurredAt(occurredAt);
+ return this;
+ }
+
+ public Adjustment.Builder status(StatusEnum status) {
+ this.instance.status(status);
+ return this;
+ }
+
+ public Adjustment.Builder lineItems(List lineItems) {
+ this.instance.lineItems(lineItems);
+ return this;
+ }
+
+ public Adjustment.Builder amount(Integer amount) {
+ this.instance.amount(amount);
+ return this;
+ }
+
+ public Adjustment.Builder description(String description) {
+ this.instance.description(description);
+ return this;
+ }
+
+ /**
+ * returns a built Adjustment instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public Adjustment build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static Adjustment.Builder builder() {
+ return new Adjustment.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public Adjustment.Builder toBuilder() {
+ Adjustment.Builder builder = new Adjustment.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/AdjustmentLineItemsInner.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/AdjustmentLineItemsInner.java
new file mode 100644
index 0000000..d34290c
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/AdjustmentLineItemsInner.java
@@ -0,0 +1,202 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * AdjustmentLineItemsInner
+ */
+
+@JsonTypeName("Adjustment_line_items_inner")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class AdjustmentLineItemsInner {
+
+ private String id;
+
+ private Integer quantity;
+
+ public AdjustmentLineItemsInner() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public AdjustmentLineItemsInner(String id, Integer quantity) {
+ this.id = id;
+ this.quantity = quantity;
+ }
+
+ public AdjustmentLineItemsInner id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Line item ID reference.
+ * @return id
+ */
+ @NotNull
+ @Schema(name = "id", description = "Line item ID reference.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("id")
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public AdjustmentLineItemsInner quantity(Integer quantity) {
+ this.quantity = quantity;
+ return this;
+ }
+
+ /**
+ * Quantity affected by this adjustment.
+ * minimum: 1
+ * @return quantity
+ */
+ @NotNull @Min(value = 1)
+ @Schema(name = "quantity", description = "Quantity affected by this adjustment.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("quantity")
+ public Integer getQuantity() {
+ return quantity;
+ }
+
+ public void setQuantity(Integer quantity) {
+ this.quantity = quantity;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ AdjustmentLineItemsInner adjustmentLineItemsInner = (AdjustmentLineItemsInner) o;
+ return Objects.equals(this.id, adjustmentLineItemsInner.id) &&
+ Objects.equals(this.quantity, adjustmentLineItemsInner.quantity);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, quantity);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class AdjustmentLineItemsInner {\n");
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" quantity: ").append(toIndentedString(quantity)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private AdjustmentLineItemsInner instance;
+
+ public Builder() {
+ this(new AdjustmentLineItemsInner());
+ }
+
+ protected Builder(AdjustmentLineItemsInner instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(AdjustmentLineItemsInner value) {
+ this.instance.setId(value.id);
+ this.instance.setQuantity(value.quantity);
+ return this;
+ }
+
+ public AdjustmentLineItemsInner.Builder id(String id) {
+ this.instance.id(id);
+ return this;
+ }
+
+ public AdjustmentLineItemsInner.Builder quantity(Integer quantity) {
+ this.instance.quantity(quantity);
+ return this;
+ }
+
+ /**
+ * returns a built AdjustmentLineItemsInner instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public AdjustmentLineItemsInner build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static AdjustmentLineItemsInner.Builder builder() {
+ return new AdjustmentLineItemsInner.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public AdjustmentLineItemsInner.Builder toBuilder() {
+ AdjustmentLineItemsInner.Builder builder = new AdjustmentLineItemsInner.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/Buyer.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/Buyer.java
new file mode 100644
index 0000000..13fa817
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/Buyer.java
@@ -0,0 +1,328 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.databind.JsonNode;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+import java.util.Map;
+import java.util.HashMap;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+/**
+ * Representation of the buyer.
+ */
+
+@Schema(name = "Buyer", description = "Representation of the buyer.")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class Buyer {
+
+ private @Nullable String firstName;
+
+ private @Nullable String lastName;
+
+ private @Nullable String fullName;
+
+ private @Nullable String email;
+
+ private @Nullable String phoneNumber;
+
+ public Buyer firstName(@Nullable String firstName) {
+ this.firstName = firstName;
+ return this;
+ }
+
+ /**
+ * First name of the buyer.
+ * @return firstName
+ */
+
+ @Schema(name = "first_name", description = "First name of the buyer.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("first_name")
+ public @Nullable String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(@Nullable String firstName) {
+ this.firstName = firstName;
+ }
+
+ public Buyer lastName(@Nullable String lastName) {
+ this.lastName = lastName;
+ return this;
+ }
+
+ /**
+ * Last name of the buyer.
+ * @return lastName
+ */
+
+ @Schema(name = "last_name", description = "Last name of the buyer.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("last_name")
+ public @Nullable String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(@Nullable String lastName) {
+ this.lastName = lastName;
+ }
+
+ public Buyer fullName(@Nullable String fullName) {
+ this.fullName = fullName;
+ return this;
+ }
+
+ /**
+ * Optional, buyer's full name (if first_name or last_name fields are present they take precedence).
+ * @return fullName
+ */
+
+ @Schema(name = "full_name", description = "Optional, buyer's full name (if first_name or last_name fields are present they take precedence).", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("full_name")
+ public @Nullable String getFullName() {
+ return fullName;
+ }
+
+ public void setFullName(@Nullable String fullName) {
+ this.fullName = fullName;
+ }
+
+ public Buyer email(@Nullable String email) {
+ this.email = email;
+ return this;
+ }
+
+ /**
+ * Email of the buyer.
+ * @return email
+ */
+
+ @Schema(name = "email", description = "Email of the buyer.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("email")
+ public @Nullable String getEmail() {
+ return email;
+ }
+
+ public void setEmail(@Nullable String email) {
+ this.email = email;
+ }
+
+ public Buyer phoneNumber(@Nullable String phoneNumber) {
+ this.phoneNumber = phoneNumber;
+ return this;
+ }
+
+ /**
+ * E.164 standard.
+ * @return phoneNumber
+ */
+
+ @Schema(name = "phone_number", description = "E.164 standard.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("phone_number")
+ public @Nullable String getPhoneNumber() {
+ return phoneNumber;
+ }
+
+ public void setPhoneNumber(@Nullable String phoneNumber) {
+ this.phoneNumber = phoneNumber;
+ }
+ /**
+ * A container for additional, undeclared properties.
+ * This is a holder for any undeclared properties as specified with
+ * the 'additionalProperties' keyword in the OAS document.
+ */
+ private Map additionalProperties;
+
+ /**
+ * Set the additional (undeclared) property with the specified name and value.
+ * If the property does not already exist, create it otherwise replace it.
+ */
+ @JsonAnySetter
+ public Buyer putAdditionalProperty(String key, JsonNode value) {
+ if (this.additionalProperties == null) {
+ this.additionalProperties = new HashMap();
+ }
+ this.additionalProperties.put(key, value);
+ return this;
+ }
+
+ /**
+ * Return the additional (undeclared) property.
+ */
+ @JsonAnyGetter
+ public Map getAdditionalProperties() {
+ return additionalProperties;
+ }
+
+ /**
+ * Return the additional (undeclared) property with the specified name.
+ */
+ public JsonNode getAdditionalProperty(String key) {
+ if (this.additionalProperties == null) {
+ return null;
+ }
+ return this.additionalProperties.get(key);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ Buyer buyer = (Buyer) o;
+ return Objects.equals(this.firstName, buyer.firstName) &&
+ Objects.equals(this.lastName, buyer.lastName) &&
+ Objects.equals(this.fullName, buyer.fullName) &&
+ Objects.equals(this.email, buyer.email) &&
+ Objects.equals(this.phoneNumber, buyer.phoneNumber) &&
+ Objects.equals(this.additionalProperties, buyer.additionalProperties);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(firstName, lastName, fullName, email, phoneNumber, additionalProperties);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class Buyer {\n");
+ sb.append(" firstName: ").append(toIndentedString(firstName)).append("\n");
+ sb.append(" lastName: ").append(toIndentedString(lastName)).append("\n");
+ sb.append(" fullName: ").append(toIndentedString(fullName)).append("\n");
+ sb.append(" email: ").append(toIndentedString(email)).append("\n");
+ sb.append(" phoneNumber: ").append(toIndentedString(phoneNumber)).append("\n");
+
+ sb.append(" additionalProperties: ").append(toIndentedString(additionalProperties)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private Buyer instance;
+
+ public Builder() {
+ this(new Buyer());
+ }
+
+ protected Builder(Buyer instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(Buyer value) {
+ this.instance.setFirstName(value.firstName);
+ this.instance.setLastName(value.lastName);
+ this.instance.setFullName(value.fullName);
+ this.instance.setEmail(value.email);
+ this.instance.setPhoneNumber(value.phoneNumber);
+ return this;
+ }
+
+ public Buyer.Builder firstName(String firstName) {
+ this.instance.firstName(firstName);
+ return this;
+ }
+
+ public Buyer.Builder lastName(String lastName) {
+ this.instance.lastName(lastName);
+ return this;
+ }
+
+ public Buyer.Builder fullName(String fullName) {
+ this.instance.fullName(fullName);
+ return this;
+ }
+
+ public Buyer.Builder email(String email) {
+ this.instance.email(email);
+ return this;
+ }
+
+ public Buyer.Builder phoneNumber(String phoneNumber) {
+ this.instance.phoneNumber(phoneNumber);
+ return this;
+ }
+
+ public Buyer.Builder additionalProperties(Map additionalProperties) {
+ this.instance.additionalProperties = additionalProperties;
+ return this;
+ }
+
+ /**
+ * returns a built Buyer instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public Buyer build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static Buyer.Builder builder() {
+ return new Buyer.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public Buyer.Builder toBuilder() {
+ Buyer.Builder builder = new Buyer.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/CapabilityResponse.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/CapabilityResponse.java
new file mode 100644
index 0000000..81011f0
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/CapabilityResponse.java
@@ -0,0 +1,361 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.databind.JsonNode;
+import java.net.URI;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+import java.util.Map;
+import java.util.HashMap;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+/**
+ * Capability reference in responses. Only name/version required to confirm active capabilities.
+ */
+
+@Schema(name = "Capability__Response_", description = "Capability reference in responses. Only name/version required to confirm active capabilities.")
+@JsonTypeName("Capability__Response_")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class CapabilityResponse {
+
+ private @Nullable String name;
+
+ private @Nullable String version;
+
+ private @Nullable URI spec;
+
+ private @Nullable URI schema;
+
+ private @Nullable String _extends;
+
+ private @Nullable JsonNode config;
+
+ public CapabilityResponse name(@Nullable String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * Stable capability identifier in reverse-domain notation (e.g., dev.ucp.shopping.checkout). Used in capability negotiation.
+ * @return name
+ */
+ @Pattern(regexp = "^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$")
+ @Schema(name = "name", description = "Stable capability identifier in reverse-domain notation (e.g., dev.ucp.shopping.checkout). Used in capability negotiation.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("name")
+ public @Nullable String getName() {
+ return name;
+ }
+
+ public void setName(@Nullable String name) {
+ this.name = name;
+ }
+
+ public CapabilityResponse version(@Nullable String version) {
+ this.version = version;
+ return this;
+ }
+
+ /**
+ * Capability version in YYYY-MM-DD format.
+ * @return version
+ */
+ @Pattern(regexp = "^\\d{4}-\\d{2}-\\d{2}$")
+ @Schema(name = "version", description = "Capability version in YYYY-MM-DD format.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("version")
+ public @Nullable String getVersion() {
+ return version;
+ }
+
+ public void setVersion(@Nullable String version) {
+ this.version = version;
+ }
+
+ public CapabilityResponse spec(@Nullable URI spec) {
+ this.spec = spec;
+ return this;
+ }
+
+ /**
+ * URL to human-readable specification document.
+ * @return spec
+ */
+ @Valid
+ @Schema(name = "spec", description = "URL to human-readable specification document.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("spec")
+ public @Nullable URI getSpec() {
+ return spec;
+ }
+
+ public void setSpec(@Nullable URI spec) {
+ this.spec = spec;
+ }
+
+ public CapabilityResponse schema(@Nullable URI schema) {
+ this.schema = schema;
+ return this;
+ }
+
+ /**
+ * URL to JSON Schema for this capability's payload.
+ * @return schema
+ */
+ @Valid
+ @Schema(name = "schema", description = "URL to JSON Schema for this capability's payload.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("schema")
+ public @Nullable URI getSchema() {
+ return schema;
+ }
+
+ public void setSchema(@Nullable URI schema) {
+ this.schema = schema;
+ }
+
+ public CapabilityResponse _extends(@Nullable String _extends) {
+ this._extends = _extends;
+ return this;
+ }
+
+ /**
+ * Parent capability this extends. Present for extensions, absent for root capabilities.
+ * @return _extends
+ */
+ @Pattern(regexp = "^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$")
+ @Schema(name = "extends", description = "Parent capability this extends. Present for extensions, absent for root capabilities.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("extends")
+ public @Nullable String getExtends() {
+ return _extends;
+ }
+
+ public void setExtends(@Nullable String _extends) {
+ this._extends = _extends;
+ }
+
+ public CapabilityResponse config(@Nullable JsonNode config) {
+ this.config = config;
+ return this;
+ }
+
+ /**
+ * Capability-specific configuration (structure defined by each capability).
+ * @return config
+ */
+ @Valid
+ @Schema(name = "config", description = "Capability-specific configuration (structure defined by each capability).", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("config")
+ public @Nullable JsonNode getConfig() {
+ return config;
+ }
+
+ public void setConfig(@Nullable JsonNode config) {
+ this.config = config;
+ }
+ /**
+ * A container for additional, undeclared properties.
+ * This is a holder for any undeclared properties as specified with
+ * the 'additionalProperties' keyword in the OAS document.
+ */
+ private Map additionalProperties;
+
+ /**
+ * Set the additional (undeclared) property with the specified name and value.
+ * If the property does not already exist, create it otherwise replace it.
+ */
+ @JsonAnySetter
+ public CapabilityResponse putAdditionalProperty(String key, JsonNode value) {
+ if (this.additionalProperties == null) {
+ this.additionalProperties = new HashMap();
+ }
+ this.additionalProperties.put(key, value);
+ return this;
+ }
+
+ /**
+ * Return the additional (undeclared) property.
+ */
+ @JsonAnyGetter
+ public Map getAdditionalProperties() {
+ return additionalProperties;
+ }
+
+ /**
+ * Return the additional (undeclared) property with the specified name.
+ */
+ public JsonNode getAdditionalProperty(String key) {
+ if (this.additionalProperties == null) {
+ return null;
+ }
+ return this.additionalProperties.get(key);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ CapabilityResponse capabilityResponse = (CapabilityResponse) o;
+ return Objects.equals(this.name, capabilityResponse.name) &&
+ Objects.equals(this.version, capabilityResponse.version) &&
+ Objects.equals(this.spec, capabilityResponse.spec) &&
+ Objects.equals(this.schema, capabilityResponse.schema) &&
+ Objects.equals(this._extends, capabilityResponse._extends) &&
+ Objects.equals(this.config, capabilityResponse.config) &&
+ Objects.equals(this.additionalProperties, capabilityResponse.additionalProperties);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(name, version, spec, schema, _extends, config, additionalProperties);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class CapabilityResponse {\n");
+ sb.append(" name: ").append(toIndentedString(name)).append("\n");
+ sb.append(" version: ").append(toIndentedString(version)).append("\n");
+ sb.append(" spec: ").append(toIndentedString(spec)).append("\n");
+ sb.append(" schema: ").append(toIndentedString(schema)).append("\n");
+ sb.append(" _extends: ").append(toIndentedString(_extends)).append("\n");
+ sb.append(" config: ").append(toIndentedString(config)).append("\n");
+
+ sb.append(" additionalProperties: ").append(toIndentedString(additionalProperties)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private CapabilityResponse instance;
+
+ public Builder() {
+ this(new CapabilityResponse());
+ }
+
+ protected Builder(CapabilityResponse instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(CapabilityResponse value) {
+ this.instance.setName(value.name);
+ this.instance.setVersion(value.version);
+ this.instance.setSpec(value.spec);
+ this.instance.setSchema(value.schema);
+ this.instance.setExtends(value._extends);
+ this.instance.setConfig(value.config);
+ return this;
+ }
+
+ public CapabilityResponse.Builder name(String name) {
+ this.instance.name(name);
+ return this;
+ }
+
+ public CapabilityResponse.Builder version(String version) {
+ this.instance.version(version);
+ return this;
+ }
+
+ public CapabilityResponse.Builder spec(URI spec) {
+ this.instance.spec(spec);
+ return this;
+ }
+
+ public CapabilityResponse.Builder schema(URI schema) {
+ this.instance.schema(schema);
+ return this;
+ }
+
+ public CapabilityResponse.Builder _extends(String _extends) {
+ this.instance._extends(_extends);
+ return this;
+ }
+
+ public CapabilityResponse.Builder config(JsonNode config) {
+ this.instance.config(config);
+ return this;
+ }
+
+ public CapabilityResponse.Builder additionalProperties(Map additionalProperties) {
+ this.instance.additionalProperties = additionalProperties;
+ return this;
+ }
+
+ /**
+ * returns a built CapabilityResponse instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public CapabilityResponse build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static CapabilityResponse.Builder builder() {
+ return new CapabilityResponse.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public CapabilityResponse.Builder toBuilder() {
+ CapabilityResponse.Builder builder = new CapabilityResponse.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/CardCredential.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/CardCredential.java
new file mode 100644
index 0000000..c2d36e8
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/CardCredential.java
@@ -0,0 +1,456 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import com.fasterxml.jackson.databind.JsonNode;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * A card credential containing sensitive payment card details including raw Primary Account Numbers (PANs). This credential type MUST NOT be used for checkout, only with payment handlers that tokenize or encrypt credentials. CRITICAL: Both parties handling CardCredential (sender and receiver) MUST be PCI DSS compliant. Transmission MUST use HTTPS/TLS with strong cipher suites.
+ */
+
+@Schema(name = "Card_Credential", description = "A card credential containing sensitive payment card details including raw Primary Account Numbers (PANs). This credential type MUST NOT be used for checkout, only with payment handlers that tokenize or encrypt credentials. CRITICAL: Both parties handling CardCredential (sender and receiver) MUST be PCI DSS compliant. Transmission MUST use HTTPS/TLS with strong cipher suites.")
+@JsonTypeName("Card_Credential")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class CardCredential implements PaymentCredential {
+
+ private JsonNullable type = JsonNullable.undefined();
+
+ /**
+ * The type of card number. Network tokens are preferred with fallback to FPAN. See PCI Scope for more details.
+ */
+ public enum CardNumberTypeEnum {
+ FPAN("fpan"),
+
+ NETWORK_TOKEN("network_token"),
+
+ DPAN("dpan");
+
+ private final String value;
+
+ CardNumberTypeEnum(String value) {
+ this.value = value;
+ }
+
+ @JsonValue
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+ @JsonCreator
+ public static CardNumberTypeEnum fromValue(String value) {
+ for (CardNumberTypeEnum b : CardNumberTypeEnum.values()) {
+ if (b.value.equals(value)) {
+ return b;
+ }
+ }
+ throw new IllegalArgumentException("Unexpected value '" + value + "'");
+ }
+ }
+
+ private CardNumberTypeEnum cardNumberType;
+
+ private @Nullable String number;
+
+ private @Nullable Integer expiryMonth;
+
+ private @Nullable Integer expiryYear;
+
+ private @Nullable String name;
+
+ private @Nullable String cvc;
+
+ private @Nullable String cryptogram;
+
+ private @Nullable String eciValue;
+
+ public CardCredential() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public CardCredential(JsonNode type, CardNumberTypeEnum cardNumberType) {
+ this.type = JsonNullable.of(type);
+ this.cardNumberType = cardNumberType;
+ }
+
+ public CardCredential type(JsonNode type) {
+ this.type = JsonNullable.of(type);
+ return this;
+ }
+
+ /**
+ * Get type
+ * @return type
+ */
+ @NotNull @Valid
+ @Schema(name = "type", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("type")
+ public JsonNullable getType() {
+ return type;
+ }
+
+ public void setType(JsonNullable type) {
+ this.type = type;
+ }
+
+ public CardCredential cardNumberType(CardNumberTypeEnum cardNumberType) {
+ this.cardNumberType = cardNumberType;
+ return this;
+ }
+
+ /**
+ * The type of card number. Network tokens are preferred with fallback to FPAN. See PCI Scope for more details.
+ * @return cardNumberType
+ */
+ @NotNull
+ @Schema(name = "card_number_type", description = "The type of card number. Network tokens are preferred with fallback to FPAN. See PCI Scope for more details.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("card_number_type")
+ public CardNumberTypeEnum getCardNumberType() {
+ return cardNumberType;
+ }
+
+ public void setCardNumberType(CardNumberTypeEnum cardNumberType) {
+ this.cardNumberType = cardNumberType;
+ }
+
+ public CardCredential number(@Nullable String number) {
+ this.number = number;
+ return this;
+ }
+
+ /**
+ * Card number.
+ * @return number
+ */
+
+ @Schema(name = "number", description = "Card number.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("number")
+ public @Nullable String getNumber() {
+ return number;
+ }
+
+ public void setNumber(@Nullable String number) {
+ this.number = number;
+ }
+
+ public CardCredential expiryMonth(@Nullable Integer expiryMonth) {
+ this.expiryMonth = expiryMonth;
+ return this;
+ }
+
+ /**
+ * The month of the card's expiration date (1-12).
+ * @return expiryMonth
+ */
+
+ @Schema(name = "expiry_month", description = "The month of the card's expiration date (1-12).", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("expiry_month")
+ public @Nullable Integer getExpiryMonth() {
+ return expiryMonth;
+ }
+
+ public void setExpiryMonth(@Nullable Integer expiryMonth) {
+ this.expiryMonth = expiryMonth;
+ }
+
+ public CardCredential expiryYear(@Nullable Integer expiryYear) {
+ this.expiryYear = expiryYear;
+ return this;
+ }
+
+ /**
+ * The year of the card's expiration date.
+ * @return expiryYear
+ */
+
+ @Schema(name = "expiry_year", description = "The year of the card's expiration date.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("expiry_year")
+ public @Nullable Integer getExpiryYear() {
+ return expiryYear;
+ }
+
+ public void setExpiryYear(@Nullable Integer expiryYear) {
+ this.expiryYear = expiryYear;
+ }
+
+ public CardCredential name(@Nullable String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * Cardholder name.
+ * @return name
+ */
+
+ @Schema(name = "name", description = "Cardholder name.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("name")
+ public @Nullable String getName() {
+ return name;
+ }
+
+ public void setName(@Nullable String name) {
+ this.name = name;
+ }
+
+ public CardCredential cvc(@Nullable String cvc) {
+ this.cvc = cvc;
+ return this;
+ }
+
+ /**
+ * Card CVC number.
+ * @return cvc
+ */
+ @Size(max = 4)
+ @Schema(name = "cvc", description = "Card CVC number.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("cvc")
+ public @Nullable String getCvc() {
+ return cvc;
+ }
+
+ public void setCvc(@Nullable String cvc) {
+ this.cvc = cvc;
+ }
+
+ public CardCredential cryptogram(@Nullable String cryptogram) {
+ this.cryptogram = cryptogram;
+ return this;
+ }
+
+ /**
+ * Cryptogram provided with network tokens.
+ * @return cryptogram
+ */
+
+ @Schema(name = "cryptogram", description = "Cryptogram provided with network tokens.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("cryptogram")
+ public @Nullable String getCryptogram() {
+ return cryptogram;
+ }
+
+ public void setCryptogram(@Nullable String cryptogram) {
+ this.cryptogram = cryptogram;
+ }
+
+ public CardCredential eciValue(@Nullable String eciValue) {
+ this.eciValue = eciValue;
+ return this;
+ }
+
+ /**
+ * Electronic Commerce Indicator / Security Level Indicator provided with network tokens.
+ * @return eciValue
+ */
+
+ @Schema(name = "eci_value", description = "Electronic Commerce Indicator / Security Level Indicator provided with network tokens.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("eci_value")
+ public @Nullable String getEciValue() {
+ return eciValue;
+ }
+
+ public void setEciValue(@Nullable String eciValue) {
+ this.eciValue = eciValue;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ CardCredential cardCredential = (CardCredential) o;
+ return Objects.equals(this.type, cardCredential.type) &&
+ Objects.equals(this.cardNumberType, cardCredential.cardNumberType) &&
+ Objects.equals(this.number, cardCredential.number) &&
+ Objects.equals(this.expiryMonth, cardCredential.expiryMonth) &&
+ Objects.equals(this.expiryYear, cardCredential.expiryYear) &&
+ Objects.equals(this.name, cardCredential.name) &&
+ Objects.equals(this.cvc, cardCredential.cvc) &&
+ Objects.equals(this.cryptogram, cardCredential.cryptogram) &&
+ Objects.equals(this.eciValue, cardCredential.eciValue);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(type, cardNumberType, number, expiryMonth, expiryYear, name, cvc, cryptogram, eciValue);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class CardCredential {\n");
+ sb.append(" type: ").append(toIndentedString(type)).append("\n");
+ sb.append(" cardNumberType: ").append(toIndentedString(cardNumberType)).append("\n");
+ sb.append(" number: ").append(toIndentedString(number)).append("\n");
+ sb.append(" expiryMonth: ").append(toIndentedString(expiryMonth)).append("\n");
+ sb.append(" expiryYear: ").append(toIndentedString(expiryYear)).append("\n");
+ sb.append(" name: ").append(toIndentedString(name)).append("\n");
+ sb.append(" cvc: ").append(toIndentedString(cvc)).append("\n");
+ sb.append(" cryptogram: ").append(toIndentedString(cryptogram)).append("\n");
+ sb.append(" eciValue: ").append(toIndentedString(eciValue)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private CardCredential instance;
+
+ public Builder() {
+ this(new CardCredential());
+ }
+
+ protected Builder(CardCredential instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(CardCredential value) {
+ this.instance.setType(value.type);
+ this.instance.setCardNumberType(value.cardNumberType);
+ this.instance.setNumber(value.number);
+ this.instance.setExpiryMonth(value.expiryMonth);
+ this.instance.setExpiryYear(value.expiryYear);
+ this.instance.setName(value.name);
+ this.instance.setCvc(value.cvc);
+ this.instance.setCryptogram(value.cryptogram);
+ this.instance.setEciValue(value.eciValue);
+ return this;
+ }
+
+ public CardCredential.Builder type(JsonNode type) {
+ this.instance.type(type);
+ return this;
+ }
+
+ public CardCredential.Builder type(JsonNullable type) {
+ this.instance.type = type;
+ return this;
+ }
+
+ public CardCredential.Builder cardNumberType(CardNumberTypeEnum cardNumberType) {
+ this.instance.cardNumberType(cardNumberType);
+ return this;
+ }
+
+ public CardCredential.Builder number(String number) {
+ this.instance.number(number);
+ return this;
+ }
+
+ public CardCredential.Builder expiryMonth(Integer expiryMonth) {
+ this.instance.expiryMonth(expiryMonth);
+ return this;
+ }
+
+ public CardCredential.Builder expiryYear(Integer expiryYear) {
+ this.instance.expiryYear(expiryYear);
+ return this;
+ }
+
+ public CardCredential.Builder name(String name) {
+ this.instance.name(name);
+ return this;
+ }
+
+ public CardCredential.Builder cvc(String cvc) {
+ this.instance.cvc(cvc);
+ return this;
+ }
+
+ public CardCredential.Builder cryptogram(String cryptogram) {
+ this.instance.cryptogram(cryptogram);
+ return this;
+ }
+
+ public CardCredential.Builder eciValue(String eciValue) {
+ this.instance.eciValue(eciValue);
+ return this;
+ }
+
+ /**
+ * returns a built CardCredential instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public CardCredential build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static CardCredential.Builder builder() {
+ return new CardCredential.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public CardCredential.Builder toBuilder() {
+ CardCredential.Builder builder = new CardCredential.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/CardPaymentInstrument.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/CardPaymentInstrument.java
new file mode 100644
index 0000000..ee501cf
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/CardPaymentInstrument.java
@@ -0,0 +1,562 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.PaymentCredential;
+import com.dev.ucp.service.shopping.model.PostalAddress;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import com.fasterxml.jackson.databind.JsonNode;
+import java.net.URI;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+import java.util.Map;
+import java.util.HashMap;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+/**
+ * A basic card payment instrument with visible card details. Can be inherited by a handler's instrument schema to define handler-specific display details or more complex credential structures.
+ */
+
+@Schema(name = "Card_Payment_Instrument", description = "A basic card payment instrument with visible card details. Can be inherited by a handler's instrument schema to define handler-specific display details or more complex credential structures.")
+@JsonTypeName("Card_Payment_Instrument")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class CardPaymentInstrument {
+
+ private String id;
+
+ private String handlerId;
+
+ /**
+ * Indicates this is a card payment instrument.
+ */
+ public enum TypeEnum {
+ CARD("card");
+
+ private final String value;
+
+ TypeEnum(String value) {
+ this.value = value;
+ }
+
+ @JsonValue
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+ @JsonCreator
+ public static TypeEnum fromValue(String value) {
+ for (TypeEnum b : TypeEnum.values()) {
+ if (b.value.equals(value)) {
+ return b;
+ }
+ }
+ throw new IllegalArgumentException("Unexpected value '" + value + "'");
+ }
+ }
+
+ private TypeEnum type;
+
+ private @Nullable PostalAddress billingAddress;
+
+ private @Nullable PaymentCredential credential;
+
+ private String brand;
+
+ private String lastDigits;
+
+ private @Nullable Integer expiryMonth;
+
+ private @Nullable Integer expiryYear;
+
+ private @Nullable String richTextDescription;
+
+ private @Nullable URI richCardArt;
+
+ public CardPaymentInstrument() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public CardPaymentInstrument(String id, String handlerId, TypeEnum type, String brand, String lastDigits) {
+ this.id = id;
+ this.handlerId = handlerId;
+ this.type = type;
+ this.brand = brand;
+ this.lastDigits = lastDigits;
+ }
+
+ public CardPaymentInstrument id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * A unique identifier for this instrument instance, assigned by the Agent. Used to reference this specific instrument in the 'payment.selected_instrument_id' field.
+ * @return id
+ */
+ @NotNull
+ @Schema(name = "id", description = "A unique identifier for this instrument instance, assigned by the Agent. Used to reference this specific instrument in the 'payment.selected_instrument_id' field.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("id")
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public CardPaymentInstrument handlerId(String handlerId) {
+ this.handlerId = handlerId;
+ return this;
+ }
+
+ /**
+ * The unique identifier for the handler instance that produced this instrument. This corresponds to the 'id' field in the Payment Handler definition.
+ * @return handlerId
+ */
+ @NotNull
+ @Schema(name = "handler_id", description = "The unique identifier for the handler instance that produced this instrument. This corresponds to the 'id' field in the Payment Handler definition.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("handler_id")
+ public String getHandlerId() {
+ return handlerId;
+ }
+
+ public void setHandlerId(String handlerId) {
+ this.handlerId = handlerId;
+ }
+
+ public CardPaymentInstrument type(TypeEnum type) {
+ this.type = type;
+ return this;
+ }
+
+ /**
+ * Indicates this is a card payment instrument.
+ * @return type
+ */
+ @NotNull
+ @Schema(name = "type", description = "Indicates this is a card payment instrument.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("type")
+ public TypeEnum getType() {
+ return type;
+ }
+
+ public void setType(TypeEnum type) {
+ this.type = type;
+ }
+
+ public CardPaymentInstrument billingAddress(@Nullable PostalAddress billingAddress) {
+ this.billingAddress = billingAddress;
+ return this;
+ }
+
+ /**
+ * Get billingAddress
+ * @return billingAddress
+ */
+ @Valid
+ @Schema(name = "billing_address", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("billing_address")
+ public @Nullable PostalAddress getBillingAddress() {
+ return billingAddress;
+ }
+
+ public void setBillingAddress(@Nullable PostalAddress billingAddress) {
+ this.billingAddress = billingAddress;
+ }
+
+ public CardPaymentInstrument credential(@Nullable PaymentCredential credential) {
+ this.credential = credential;
+ return this;
+ }
+
+ /**
+ * Get credential
+ * @return credential
+ */
+ @Valid
+ @Schema(name = "credential", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("credential")
+ public @Nullable PaymentCredential getCredential() {
+ return credential;
+ }
+
+ public void setCredential(@Nullable PaymentCredential credential) {
+ this.credential = credential;
+ }
+
+ public CardPaymentInstrument brand(String brand) {
+ this.brand = brand;
+ return this;
+ }
+
+ /**
+ * The card brand/network (e.g., visa, mastercard, amex).
+ * @return brand
+ */
+ @NotNull
+ @Schema(name = "brand", description = "The card brand/network (e.g., visa, mastercard, amex).", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("brand")
+ public String getBrand() {
+ return brand;
+ }
+
+ public void setBrand(String brand) {
+ this.brand = brand;
+ }
+
+ public CardPaymentInstrument lastDigits(String lastDigits) {
+ this.lastDigits = lastDigits;
+ return this;
+ }
+
+ /**
+ * Last 4 digits of the card number.
+ * @return lastDigits
+ */
+ @NotNull
+ @Schema(name = "last_digits", description = "Last 4 digits of the card number.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("last_digits")
+ public String getLastDigits() {
+ return lastDigits;
+ }
+
+ public void setLastDigits(String lastDigits) {
+ this.lastDigits = lastDigits;
+ }
+
+ public CardPaymentInstrument expiryMonth(@Nullable Integer expiryMonth) {
+ this.expiryMonth = expiryMonth;
+ return this;
+ }
+
+ /**
+ * The month of the card's expiration date (1-12).
+ * @return expiryMonth
+ */
+
+ @Schema(name = "expiry_month", description = "The month of the card's expiration date (1-12).", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("expiry_month")
+ public @Nullable Integer getExpiryMonth() {
+ return expiryMonth;
+ }
+
+ public void setExpiryMonth(@Nullable Integer expiryMonth) {
+ this.expiryMonth = expiryMonth;
+ }
+
+ public CardPaymentInstrument expiryYear(@Nullable Integer expiryYear) {
+ this.expiryYear = expiryYear;
+ return this;
+ }
+
+ /**
+ * The year of the card's expiration date.
+ * @return expiryYear
+ */
+
+ @Schema(name = "expiry_year", description = "The year of the card's expiration date.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("expiry_year")
+ public @Nullable Integer getExpiryYear() {
+ return expiryYear;
+ }
+
+ public void setExpiryYear(@Nullable Integer expiryYear) {
+ this.expiryYear = expiryYear;
+ }
+
+ public CardPaymentInstrument richTextDescription(@Nullable String richTextDescription) {
+ this.richTextDescription = richTextDescription;
+ return this;
+ }
+
+ /**
+ * An optional rich text description of the card to display to the user (e.g., 'Visa ending in 1234, expires 12/2025').
+ * @return richTextDescription
+ */
+
+ @Schema(name = "rich_text_description", description = "An optional rich text description of the card to display to the user (e.g., 'Visa ending in 1234, expires 12/2025').", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("rich_text_description")
+ public @Nullable String getRichTextDescription() {
+ return richTextDescription;
+ }
+
+ public void setRichTextDescription(@Nullable String richTextDescription) {
+ this.richTextDescription = richTextDescription;
+ }
+
+ public CardPaymentInstrument richCardArt(@Nullable URI richCardArt) {
+ this.richCardArt = richCardArt;
+ return this;
+ }
+
+ /**
+ * An optional URI to a rich image representing the card (e.g., card art provided by the issuer).
+ * @return richCardArt
+ */
+ @Valid
+ @Schema(name = "rich_card_art", description = "An optional URI to a rich image representing the card (e.g., card art provided by the issuer).", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("rich_card_art")
+ public @Nullable URI getRichCardArt() {
+ return richCardArt;
+ }
+
+ public void setRichCardArt(@Nullable URI richCardArt) {
+ this.richCardArt = richCardArt;
+ }
+ /**
+ * A container for additional, undeclared properties.
+ * This is a holder for any undeclared properties as specified with
+ * the 'additionalProperties' keyword in the OAS document.
+ */
+ private Map additionalProperties;
+
+ /**
+ * Set the additional (undeclared) property with the specified name and value.
+ * If the property does not already exist, create it otherwise replace it.
+ */
+ @JsonAnySetter
+ public CardPaymentInstrument putAdditionalProperty(String key, JsonNode value) {
+ if (this.additionalProperties == null) {
+ this.additionalProperties = new HashMap();
+ }
+ this.additionalProperties.put(key, value);
+ return this;
+ }
+
+ /**
+ * Return the additional (undeclared) property.
+ */
+ @JsonAnyGetter
+ public Map getAdditionalProperties() {
+ return additionalProperties;
+ }
+
+ /**
+ * Return the additional (undeclared) property with the specified name.
+ */
+ public JsonNode getAdditionalProperty(String key) {
+ if (this.additionalProperties == null) {
+ return null;
+ }
+ return this.additionalProperties.get(key);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ CardPaymentInstrument cardPaymentInstrument = (CardPaymentInstrument) o;
+ return Objects.equals(this.id, cardPaymentInstrument.id) &&
+ Objects.equals(this.handlerId, cardPaymentInstrument.handlerId) &&
+ Objects.equals(this.type, cardPaymentInstrument.type) &&
+ Objects.equals(this.billingAddress, cardPaymentInstrument.billingAddress) &&
+ Objects.equals(this.credential, cardPaymentInstrument.credential) &&
+ Objects.equals(this.brand, cardPaymentInstrument.brand) &&
+ Objects.equals(this.lastDigits, cardPaymentInstrument.lastDigits) &&
+ Objects.equals(this.expiryMonth, cardPaymentInstrument.expiryMonth) &&
+ Objects.equals(this.expiryYear, cardPaymentInstrument.expiryYear) &&
+ Objects.equals(this.richTextDescription, cardPaymentInstrument.richTextDescription) &&
+ Objects.equals(this.richCardArt, cardPaymentInstrument.richCardArt) &&
+ Objects.equals(this.additionalProperties, cardPaymentInstrument.additionalProperties);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, handlerId, type, billingAddress, credential, brand, lastDigits, expiryMonth, expiryYear, richTextDescription, richCardArt, additionalProperties);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class CardPaymentInstrument {\n");
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" handlerId: ").append(toIndentedString(handlerId)).append("\n");
+ sb.append(" type: ").append(toIndentedString(type)).append("\n");
+ sb.append(" billingAddress: ").append(toIndentedString(billingAddress)).append("\n");
+ sb.append(" credential: ").append(toIndentedString(credential)).append("\n");
+ sb.append(" brand: ").append(toIndentedString(brand)).append("\n");
+ sb.append(" lastDigits: ").append(toIndentedString(lastDigits)).append("\n");
+ sb.append(" expiryMonth: ").append(toIndentedString(expiryMonth)).append("\n");
+ sb.append(" expiryYear: ").append(toIndentedString(expiryYear)).append("\n");
+ sb.append(" richTextDescription: ").append(toIndentedString(richTextDescription)).append("\n");
+ sb.append(" richCardArt: ").append(toIndentedString(richCardArt)).append("\n");
+
+ sb.append(" additionalProperties: ").append(toIndentedString(additionalProperties)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private CardPaymentInstrument instance;
+
+ public Builder() {
+ this(new CardPaymentInstrument());
+ }
+
+ protected Builder(CardPaymentInstrument instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(CardPaymentInstrument value) {
+ this.instance.setId(value.id);
+ this.instance.setHandlerId(value.handlerId);
+ this.instance.setType(value.type);
+ this.instance.setBillingAddress(value.billingAddress);
+ this.instance.setCredential(value.credential);
+ this.instance.setBrand(value.brand);
+ this.instance.setLastDigits(value.lastDigits);
+ this.instance.setExpiryMonth(value.expiryMonth);
+ this.instance.setExpiryYear(value.expiryYear);
+ this.instance.setRichTextDescription(value.richTextDescription);
+ this.instance.setRichCardArt(value.richCardArt);
+ return this;
+ }
+
+ public CardPaymentInstrument.Builder id(String id) {
+ this.instance.id(id);
+ return this;
+ }
+
+ public CardPaymentInstrument.Builder handlerId(String handlerId) {
+ this.instance.handlerId(handlerId);
+ return this;
+ }
+
+ public CardPaymentInstrument.Builder type(TypeEnum type) {
+ this.instance.type(type);
+ return this;
+ }
+
+ public CardPaymentInstrument.Builder billingAddress(PostalAddress billingAddress) {
+ this.instance.billingAddress(billingAddress);
+ return this;
+ }
+
+ public CardPaymentInstrument.Builder credential(PaymentCredential credential) {
+ this.instance.credential(credential);
+ return this;
+ }
+
+ public CardPaymentInstrument.Builder brand(String brand) {
+ this.instance.brand(brand);
+ return this;
+ }
+
+ public CardPaymentInstrument.Builder lastDigits(String lastDigits) {
+ this.instance.lastDigits(lastDigits);
+ return this;
+ }
+
+ public CardPaymentInstrument.Builder expiryMonth(Integer expiryMonth) {
+ this.instance.expiryMonth(expiryMonth);
+ return this;
+ }
+
+ public CardPaymentInstrument.Builder expiryYear(Integer expiryYear) {
+ this.instance.expiryYear(expiryYear);
+ return this;
+ }
+
+ public CardPaymentInstrument.Builder richTextDescription(String richTextDescription) {
+ this.instance.richTextDescription(richTextDescription);
+ return this;
+ }
+
+ public CardPaymentInstrument.Builder richCardArt(URI richCardArt) {
+ this.instance.richCardArt(richCardArt);
+ return this;
+ }
+
+ public CardPaymentInstrument.Builder additionalProperties(Map additionalProperties) {
+ this.instance.additionalProperties = additionalProperties;
+ return this;
+ }
+
+ /**
+ * returns a built CardPaymentInstrument instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public CardPaymentInstrument build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static CardPaymentInstrument.Builder builder() {
+ return new CardPaymentInstrument.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public CardPaymentInstrument.Builder toBuilder() {
+ CardPaymentInstrument.Builder builder = new CardPaymentInstrument.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/CheckoutCreateRequest.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/CheckoutCreateRequest.java
new file mode 100644
index 0000000..55de6a3
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/CheckoutCreateRequest.java
@@ -0,0 +1,328 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.Buyer;
+import com.dev.ucp.service.shopping.model.LineItemCreateRequest;
+import com.dev.ucp.service.shopping.model.PaymentCreateRequest;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.databind.JsonNode;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+import java.util.Map;
+import java.util.HashMap;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+/**
+ * Base checkout schema. Extensions compose onto this using allOf.
+ */
+
+@Schema(name = "checkout_create_request", description = "Base checkout schema. Extensions compose onto this using allOf.")
+@JsonTypeName("checkout_create_request")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class CheckoutCreateRequest {
+
+ @Valid
+ private List<@Valid LineItemCreateRequest> lineItems = new ArrayList<>();
+
+ private @Nullable Buyer buyer;
+
+ private String currency;
+
+ private PaymentCreateRequest payment;
+
+ public CheckoutCreateRequest() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public CheckoutCreateRequest(List<@Valid LineItemCreateRequest> lineItems, String currency, PaymentCreateRequest payment) {
+ this.lineItems = lineItems;
+ this.currency = currency;
+ this.payment = payment;
+ }
+
+ public CheckoutCreateRequest lineItems(List<@Valid LineItemCreateRequest> lineItems) {
+ this.lineItems = lineItems;
+ return this;
+ }
+
+ public CheckoutCreateRequest addLineItemsItem(LineItemCreateRequest lineItemsItem) {
+ if (this.lineItems == null) {
+ this.lineItems = new ArrayList<>();
+ }
+ this.lineItems.add(lineItemsItem);
+ return this;
+ }
+
+ /**
+ * List of line items being checked out.
+ * @return lineItems
+ */
+ @NotNull @Valid
+ @Schema(name = "line_items", description = "List of line items being checked out.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("line_items")
+ public List<@Valid LineItemCreateRequest> getLineItems() {
+ return lineItems;
+ }
+
+ public void setLineItems(List<@Valid LineItemCreateRequest> lineItems) {
+ this.lineItems = lineItems;
+ }
+
+ public CheckoutCreateRequest buyer(@Nullable Buyer buyer) {
+ this.buyer = buyer;
+ return this;
+ }
+
+ /**
+ * Get buyer
+ * @return buyer
+ */
+ @Valid
+ @Schema(name = "buyer", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("buyer")
+ public @Nullable Buyer getBuyer() {
+ return buyer;
+ }
+
+ public void setBuyer(@Nullable Buyer buyer) {
+ this.buyer = buyer;
+ }
+
+ public CheckoutCreateRequest currency(String currency) {
+ this.currency = currency;
+ return this;
+ }
+
+ /**
+ * ISO 4217 currency code.
+ * @return currency
+ */
+ @NotNull
+ @Schema(name = "currency", description = "ISO 4217 currency code.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("currency")
+ public String getCurrency() {
+ return currency;
+ }
+
+ public void setCurrency(String currency) {
+ this.currency = currency;
+ }
+
+ public CheckoutCreateRequest payment(PaymentCreateRequest payment) {
+ this.payment = payment;
+ return this;
+ }
+
+ /**
+ * Get payment
+ * @return payment
+ */
+ @NotNull @Valid
+ @Schema(name = "payment", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("payment")
+ public PaymentCreateRequest getPayment() {
+ return payment;
+ }
+
+ public void setPayment(PaymentCreateRequest payment) {
+ this.payment = payment;
+ }
+ /**
+ * A container for additional, undeclared properties.
+ * This is a holder for any undeclared properties as specified with
+ * the 'additionalProperties' keyword in the OAS document.
+ */
+ private Map additionalProperties;
+
+ /**
+ * Set the additional (undeclared) property with the specified name and value.
+ * If the property does not already exist, create it otherwise replace it.
+ */
+ @JsonAnySetter
+ public CheckoutCreateRequest putAdditionalProperty(String key, JsonNode value) {
+ if (this.additionalProperties == null) {
+ this.additionalProperties = new HashMap();
+ }
+ this.additionalProperties.put(key, value);
+ return this;
+ }
+
+ /**
+ * Return the additional (undeclared) property.
+ */
+ @JsonAnyGetter
+ public Map getAdditionalProperties() {
+ return additionalProperties;
+ }
+
+ /**
+ * Return the additional (undeclared) property with the specified name.
+ */
+ public JsonNode getAdditionalProperty(String key) {
+ if (this.additionalProperties == null) {
+ return null;
+ }
+ return this.additionalProperties.get(key);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ CheckoutCreateRequest checkoutCreateRequest = (CheckoutCreateRequest) o;
+ return Objects.equals(this.lineItems, checkoutCreateRequest.lineItems) &&
+ Objects.equals(this.buyer, checkoutCreateRequest.buyer) &&
+ Objects.equals(this.currency, checkoutCreateRequest.currency) &&
+ Objects.equals(this.payment, checkoutCreateRequest.payment) &&
+ Objects.equals(this.additionalProperties, checkoutCreateRequest.additionalProperties);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(lineItems, buyer, currency, payment, additionalProperties);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class CheckoutCreateRequest {\n");
+ sb.append(" lineItems: ").append(toIndentedString(lineItems)).append("\n");
+ sb.append(" buyer: ").append(toIndentedString(buyer)).append("\n");
+ sb.append(" currency: ").append(toIndentedString(currency)).append("\n");
+ sb.append(" payment: ").append(toIndentedString(payment)).append("\n");
+
+ sb.append(" additionalProperties: ").append(toIndentedString(additionalProperties)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private CheckoutCreateRequest instance;
+
+ public Builder() {
+ this(new CheckoutCreateRequest());
+ }
+
+ protected Builder(CheckoutCreateRequest instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(CheckoutCreateRequest value) {
+ this.instance.setLineItems(value.lineItems);
+ this.instance.setBuyer(value.buyer);
+ this.instance.setCurrency(value.currency);
+ this.instance.setPayment(value.payment);
+ return this;
+ }
+
+ public CheckoutCreateRequest.Builder lineItems(List lineItems) {
+ this.instance.lineItems(lineItems);
+ return this;
+ }
+
+ public CheckoutCreateRequest.Builder buyer(Buyer buyer) {
+ this.instance.buyer(buyer);
+ return this;
+ }
+
+ public CheckoutCreateRequest.Builder currency(String currency) {
+ this.instance.currency(currency);
+ return this;
+ }
+
+ public CheckoutCreateRequest.Builder payment(PaymentCreateRequest payment) {
+ this.instance.payment(payment);
+ return this;
+ }
+
+ public CheckoutCreateRequest.Builder additionalProperties(Map additionalProperties) {
+ this.instance.additionalProperties = additionalProperties;
+ return this;
+ }
+
+ /**
+ * returns a built CheckoutCreateRequest instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public CheckoutCreateRequest build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static CheckoutCreateRequest.Builder builder() {
+ return new CheckoutCreateRequest.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public CheckoutCreateRequest.Builder toBuilder() {
+ CheckoutCreateRequest.Builder builder = new CheckoutCreateRequest.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/CheckoutResponse.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/CheckoutResponse.java
new file mode 100644
index 0000000..20a6eb7
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/CheckoutResponse.java
@@ -0,0 +1,683 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.Buyer;
+import com.dev.ucp.service.shopping.model.LineItemResponse;
+import com.dev.ucp.service.shopping.model.Link;
+import com.dev.ucp.service.shopping.model.Message;
+import com.dev.ucp.service.shopping.model.OrderConfirmation;
+import com.dev.ucp.service.shopping.model.PaymentResponse;
+import com.dev.ucp.service.shopping.model.TotalResponse;
+import com.dev.ucp.service.shopping.model.UCPCheckoutResponse;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import com.fasterxml.jackson.databind.JsonNode;
+import java.net.URI;
+import java.time.OffsetDateTime;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+import java.util.Map;
+import java.util.HashMap;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+/**
+ * Base checkout schema. Extensions compose onto this using allOf.
+ */
+
+@Schema(name = "checkout_response", description = "Base checkout schema. Extensions compose onto this using allOf.")
+@JsonTypeName("checkout_response")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class CheckoutResponse {
+
+ private UCPCheckoutResponse ucp;
+
+ private String id;
+
+ @Valid
+ private List<@Valid LineItemResponse> lineItems = new ArrayList<>();
+
+ private @Nullable Buyer buyer;
+
+ /**
+ * Checkout state indicating the current phase and required action. See Checkout Status lifecycle documentation for state transition details.
+ */
+ public enum StatusEnum {
+ INCOMPLETE("incomplete"),
+
+ REQUIRES_ESCALATION("requires_escalation"),
+
+ READY_FOR_COMPLETE("ready_for_complete"),
+
+ COMPLETE_IN_PROGRESS("complete_in_progress"),
+
+ COMPLETED("completed"),
+
+ CANCELED("canceled");
+
+ private final String value;
+
+ StatusEnum(String value) {
+ this.value = value;
+ }
+
+ @JsonValue
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+ @JsonCreator
+ public static StatusEnum fromValue(String value) {
+ for (StatusEnum b : StatusEnum.values()) {
+ if (b.value.equals(value)) {
+ return b;
+ }
+ }
+ throw new IllegalArgumentException("Unexpected value '" + value + "'");
+ }
+ }
+
+ private StatusEnum status;
+
+ private String currency;
+
+ @Valid
+ private List<@Valid TotalResponse> totals = new ArrayList<>();
+
+ @Valid
+ private List<@Valid Message> messages = new ArrayList<>();
+
+ @Valid
+ private List<@Valid Link> links = new ArrayList<>();
+
+ @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
+ private @Nullable OffsetDateTime expiresAt;
+
+ private @Nullable URI continueUrl;
+
+ private PaymentResponse payment;
+
+ private @Nullable OrderConfirmation order;
+
+ public CheckoutResponse() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public CheckoutResponse(UCPCheckoutResponse ucp, String id, List<@Valid LineItemResponse> lineItems, StatusEnum status, String currency, List<@Valid TotalResponse> totals, List<@Valid Link> links, PaymentResponse payment) {
+ this.ucp = ucp;
+ this.id = id;
+ this.lineItems = lineItems;
+ this.status = status;
+ this.currency = currency;
+ this.totals = totals;
+ this.links = links;
+ this.payment = payment;
+ }
+
+ public CheckoutResponse ucp(UCPCheckoutResponse ucp) {
+ this.ucp = ucp;
+ return this;
+ }
+
+ /**
+ * Get ucp
+ * @return ucp
+ */
+ @NotNull @Valid
+ @Schema(name = "ucp", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("ucp")
+ public UCPCheckoutResponse getUcp() {
+ return ucp;
+ }
+
+ public void setUcp(UCPCheckoutResponse ucp) {
+ this.ucp = ucp;
+ }
+
+ public CheckoutResponse id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Unique identifier of the checkout session.
+ * @return id
+ */
+ @NotNull
+ @Schema(name = "id", description = "Unique identifier of the checkout session.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("id")
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public CheckoutResponse lineItems(List<@Valid LineItemResponse> lineItems) {
+ this.lineItems = lineItems;
+ return this;
+ }
+
+ public CheckoutResponse addLineItemsItem(LineItemResponse lineItemsItem) {
+ if (this.lineItems == null) {
+ this.lineItems = new ArrayList<>();
+ }
+ this.lineItems.add(lineItemsItem);
+ return this;
+ }
+
+ /**
+ * List of line items being checked out.
+ * @return lineItems
+ */
+ @NotNull @Valid
+ @Schema(name = "line_items", description = "List of line items being checked out.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("line_items")
+ public List<@Valid LineItemResponse> getLineItems() {
+ return lineItems;
+ }
+
+ public void setLineItems(List<@Valid LineItemResponse> lineItems) {
+ this.lineItems = lineItems;
+ }
+
+ public CheckoutResponse buyer(@Nullable Buyer buyer) {
+ this.buyer = buyer;
+ return this;
+ }
+
+ /**
+ * Get buyer
+ * @return buyer
+ */
+ @Valid
+ @Schema(name = "buyer", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("buyer")
+ public @Nullable Buyer getBuyer() {
+ return buyer;
+ }
+
+ public void setBuyer(@Nullable Buyer buyer) {
+ this.buyer = buyer;
+ }
+
+ public CheckoutResponse status(StatusEnum status) {
+ this.status = status;
+ return this;
+ }
+
+ /**
+ * Checkout state indicating the current phase and required action. See Checkout Status lifecycle documentation for state transition details.
+ * @return status
+ */
+ @NotNull
+ @Schema(name = "status", description = "Checkout state indicating the current phase and required action. See Checkout Status lifecycle documentation for state transition details.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("status")
+ public StatusEnum getStatus() {
+ return status;
+ }
+
+ public void setStatus(StatusEnum status) {
+ this.status = status;
+ }
+
+ public CheckoutResponse currency(String currency) {
+ this.currency = currency;
+ return this;
+ }
+
+ /**
+ * ISO 4217 currency code.
+ * @return currency
+ */
+ @NotNull
+ @Schema(name = "currency", description = "ISO 4217 currency code.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("currency")
+ public String getCurrency() {
+ return currency;
+ }
+
+ public void setCurrency(String currency) {
+ this.currency = currency;
+ }
+
+ public CheckoutResponse totals(List<@Valid TotalResponse> totals) {
+ this.totals = totals;
+ return this;
+ }
+
+ public CheckoutResponse addTotalsItem(TotalResponse totalsItem) {
+ if (this.totals == null) {
+ this.totals = new ArrayList<>();
+ }
+ this.totals.add(totalsItem);
+ return this;
+ }
+
+ /**
+ * Different cart totals.
+ * @return totals
+ */
+ @NotNull @Valid
+ @Schema(name = "totals", description = "Different cart totals.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("totals")
+ public List<@Valid TotalResponse> getTotals() {
+ return totals;
+ }
+
+ public void setTotals(List<@Valid TotalResponse> totals) {
+ this.totals = totals;
+ }
+
+ public CheckoutResponse messages(List<@Valid Message> messages) {
+ this.messages = messages;
+ return this;
+ }
+
+ public CheckoutResponse addMessagesItem(Message messagesItem) {
+ if (this.messages == null) {
+ this.messages = new ArrayList<>();
+ }
+ this.messages.add(messagesItem);
+ return this;
+ }
+
+ /**
+ * List of messages with error and info about the checkout session state.
+ * @return messages
+ */
+ @Valid
+ @Schema(name = "messages", description = "List of messages with error and info about the checkout session state.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("messages")
+ public List<@Valid Message> getMessages() {
+ return messages;
+ }
+
+ public void setMessages(List<@Valid Message> messages) {
+ this.messages = messages;
+ }
+
+ public CheckoutResponse links(List<@Valid Link> links) {
+ this.links = links;
+ return this;
+ }
+
+ public CheckoutResponse addLinksItem(Link linksItem) {
+ if (this.links == null) {
+ this.links = new ArrayList<>();
+ }
+ this.links.add(linksItem);
+ return this;
+ }
+
+ /**
+ * Links to be displayed by the platform (Privacy Policy, TOS). Mandatory for legal compliance.
+ * @return links
+ */
+ @NotNull @Valid
+ @Schema(name = "links", description = "Links to be displayed by the platform (Privacy Policy, TOS). Mandatory for legal compliance.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("links")
+ public List<@Valid Link> getLinks() {
+ return links;
+ }
+
+ public void setLinks(List<@Valid Link> links) {
+ this.links = links;
+ }
+
+ public CheckoutResponse expiresAt(@Nullable OffsetDateTime expiresAt) {
+ this.expiresAt = expiresAt;
+ return this;
+ }
+
+ /**
+ * RFC 3339 expiry timestamp. Default TTL is 6 hours from creation if not sent.
+ * @return expiresAt
+ */
+ @Valid
+ @Schema(name = "expires_at", description = "RFC 3339 expiry timestamp. Default TTL is 6 hours from creation if not sent.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("expires_at")
+ public @Nullable OffsetDateTime getExpiresAt() {
+ return expiresAt;
+ }
+
+ public void setExpiresAt(@Nullable OffsetDateTime expiresAt) {
+ this.expiresAt = expiresAt;
+ }
+
+ public CheckoutResponse continueUrl(@Nullable URI continueUrl) {
+ this.continueUrl = continueUrl;
+ return this;
+ }
+
+ /**
+ * URL for checkout handoff and session recovery. MUST be provided when status is requires_escalation. See specification for format and availability requirements.
+ * @return continueUrl
+ */
+ @Valid
+ @Schema(name = "continue_url", description = "URL for checkout handoff and session recovery. MUST be provided when status is requires_escalation. See specification for format and availability requirements.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("continue_url")
+ public @Nullable URI getContinueUrl() {
+ return continueUrl;
+ }
+
+ public void setContinueUrl(@Nullable URI continueUrl) {
+ this.continueUrl = continueUrl;
+ }
+
+ public CheckoutResponse payment(PaymentResponse payment) {
+ this.payment = payment;
+ return this;
+ }
+
+ /**
+ * Get payment
+ * @return payment
+ */
+ @NotNull @Valid
+ @Schema(name = "payment", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("payment")
+ public PaymentResponse getPayment() {
+ return payment;
+ }
+
+ public void setPayment(PaymentResponse payment) {
+ this.payment = payment;
+ }
+
+ public CheckoutResponse order(@Nullable OrderConfirmation order) {
+ this.order = order;
+ return this;
+ }
+
+ /**
+ * Get order
+ * @return order
+ */
+ @Valid
+ @Schema(name = "order", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("order")
+ public @Nullable OrderConfirmation getOrder() {
+ return order;
+ }
+
+ public void setOrder(@Nullable OrderConfirmation order) {
+ this.order = order;
+ }
+ /**
+ * A container for additional, undeclared properties.
+ * This is a holder for any undeclared properties as specified with
+ * the 'additionalProperties' keyword in the OAS document.
+ */
+ private Map additionalProperties;
+
+ /**
+ * Set the additional (undeclared) property with the specified name and value.
+ * If the property does not already exist, create it otherwise replace it.
+ */
+ @JsonAnySetter
+ public CheckoutResponse putAdditionalProperty(String key, JsonNode value) {
+ if (this.additionalProperties == null) {
+ this.additionalProperties = new HashMap();
+ }
+ this.additionalProperties.put(key, value);
+ return this;
+ }
+
+ /**
+ * Return the additional (undeclared) property.
+ */
+ @JsonAnyGetter
+ public Map getAdditionalProperties() {
+ return additionalProperties;
+ }
+
+ /**
+ * Return the additional (undeclared) property with the specified name.
+ */
+ public JsonNode getAdditionalProperty(String key) {
+ if (this.additionalProperties == null) {
+ return null;
+ }
+ return this.additionalProperties.get(key);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ CheckoutResponse checkoutResponse = (CheckoutResponse) o;
+ return Objects.equals(this.ucp, checkoutResponse.ucp) &&
+ Objects.equals(this.id, checkoutResponse.id) &&
+ Objects.equals(this.lineItems, checkoutResponse.lineItems) &&
+ Objects.equals(this.buyer, checkoutResponse.buyer) &&
+ Objects.equals(this.status, checkoutResponse.status) &&
+ Objects.equals(this.currency, checkoutResponse.currency) &&
+ Objects.equals(this.totals, checkoutResponse.totals) &&
+ Objects.equals(this.messages, checkoutResponse.messages) &&
+ Objects.equals(this.links, checkoutResponse.links) &&
+ Objects.equals(this.expiresAt, checkoutResponse.expiresAt) &&
+ Objects.equals(this.continueUrl, checkoutResponse.continueUrl) &&
+ Objects.equals(this.payment, checkoutResponse.payment) &&
+ Objects.equals(this.order, checkoutResponse.order) &&
+ Objects.equals(this.additionalProperties, checkoutResponse.additionalProperties);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(ucp, id, lineItems, buyer, status, currency, totals, messages, links, expiresAt, continueUrl, payment, order, additionalProperties);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class CheckoutResponse {\n");
+ sb.append(" ucp: ").append(toIndentedString(ucp)).append("\n");
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" lineItems: ").append(toIndentedString(lineItems)).append("\n");
+ sb.append(" buyer: ").append(toIndentedString(buyer)).append("\n");
+ sb.append(" status: ").append(toIndentedString(status)).append("\n");
+ sb.append(" currency: ").append(toIndentedString(currency)).append("\n");
+ sb.append(" totals: ").append(toIndentedString(totals)).append("\n");
+ sb.append(" messages: ").append(toIndentedString(messages)).append("\n");
+ sb.append(" links: ").append(toIndentedString(links)).append("\n");
+ sb.append(" expiresAt: ").append(toIndentedString(expiresAt)).append("\n");
+ sb.append(" continueUrl: ").append(toIndentedString(continueUrl)).append("\n");
+ sb.append(" payment: ").append(toIndentedString(payment)).append("\n");
+ sb.append(" order: ").append(toIndentedString(order)).append("\n");
+
+ sb.append(" additionalProperties: ").append(toIndentedString(additionalProperties)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private CheckoutResponse instance;
+
+ public Builder() {
+ this(new CheckoutResponse());
+ }
+
+ protected Builder(CheckoutResponse instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(CheckoutResponse value) {
+ this.instance.setUcp(value.ucp);
+ this.instance.setId(value.id);
+ this.instance.setLineItems(value.lineItems);
+ this.instance.setBuyer(value.buyer);
+ this.instance.setStatus(value.status);
+ this.instance.setCurrency(value.currency);
+ this.instance.setTotals(value.totals);
+ this.instance.setMessages(value.messages);
+ this.instance.setLinks(value.links);
+ this.instance.setExpiresAt(value.expiresAt);
+ this.instance.setContinueUrl(value.continueUrl);
+ this.instance.setPayment(value.payment);
+ this.instance.setOrder(value.order);
+ return this;
+ }
+
+ public CheckoutResponse.Builder ucp(UCPCheckoutResponse ucp) {
+ this.instance.ucp(ucp);
+ return this;
+ }
+
+ public CheckoutResponse.Builder id(String id) {
+ this.instance.id(id);
+ return this;
+ }
+
+ public CheckoutResponse.Builder lineItems(List lineItems) {
+ this.instance.lineItems(lineItems);
+ return this;
+ }
+
+ public CheckoutResponse.Builder buyer(Buyer buyer) {
+ this.instance.buyer(buyer);
+ return this;
+ }
+
+ public CheckoutResponse.Builder status(StatusEnum status) {
+ this.instance.status(status);
+ return this;
+ }
+
+ public CheckoutResponse.Builder currency(String currency) {
+ this.instance.currency(currency);
+ return this;
+ }
+
+ public CheckoutResponse.Builder totals(List totals) {
+ this.instance.totals(totals);
+ return this;
+ }
+
+ public CheckoutResponse.Builder messages(List messages) {
+ this.instance.messages(messages);
+ return this;
+ }
+
+ public CheckoutResponse.Builder links(List links) {
+ this.instance.links(links);
+ return this;
+ }
+
+ public CheckoutResponse.Builder expiresAt(OffsetDateTime expiresAt) {
+ this.instance.expiresAt(expiresAt);
+ return this;
+ }
+
+ public CheckoutResponse.Builder continueUrl(URI continueUrl) {
+ this.instance.continueUrl(continueUrl);
+ return this;
+ }
+
+ public CheckoutResponse.Builder payment(PaymentResponse payment) {
+ this.instance.payment(payment);
+ return this;
+ }
+
+ public CheckoutResponse.Builder order(OrderConfirmation order) {
+ this.instance.order(order);
+ return this;
+ }
+
+ public CheckoutResponse.Builder additionalProperties(Map additionalProperties) {
+ this.instance.additionalProperties = additionalProperties;
+ return this;
+ }
+
+ /**
+ * returns a built CheckoutResponse instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public CheckoutResponse build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static CheckoutResponse.Builder builder() {
+ return new CheckoutResponse.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public CheckoutResponse.Builder toBuilder() {
+ CheckoutResponse.Builder builder = new CheckoutResponse.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/CheckoutUpdateRequest.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/CheckoutUpdateRequest.java
new file mode 100644
index 0000000..5e71db5
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/CheckoutUpdateRequest.java
@@ -0,0 +1,359 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.Buyer;
+import com.dev.ucp.service.shopping.model.LineItemUpdateRequest;
+import com.dev.ucp.service.shopping.model.PaymentUpdateRequest;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.databind.JsonNode;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+import java.util.Map;
+import java.util.HashMap;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+/**
+ * Base checkout schema. Extensions compose onto this using allOf.
+ */
+
+@Schema(name = "checkout_update_request", description = "Base checkout schema. Extensions compose onto this using allOf.")
+@JsonTypeName("checkout_update_request")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class CheckoutUpdateRequest {
+
+ private String id;
+
+ @Valid
+ private List<@Valid LineItemUpdateRequest> lineItems = new ArrayList<>();
+
+ private @Nullable Buyer buyer;
+
+ private String currency;
+
+ private PaymentUpdateRequest payment;
+
+ public CheckoutUpdateRequest() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public CheckoutUpdateRequest(String id, List<@Valid LineItemUpdateRequest> lineItems, String currency, PaymentUpdateRequest payment) {
+ this.id = id;
+ this.lineItems = lineItems;
+ this.currency = currency;
+ this.payment = payment;
+ }
+
+ public CheckoutUpdateRequest id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Unique identifier of the checkout session.
+ * @return id
+ */
+ @NotNull
+ @Schema(name = "id", description = "Unique identifier of the checkout session.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("id")
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public CheckoutUpdateRequest lineItems(List<@Valid LineItemUpdateRequest> lineItems) {
+ this.lineItems = lineItems;
+ return this;
+ }
+
+ public CheckoutUpdateRequest addLineItemsItem(LineItemUpdateRequest lineItemsItem) {
+ if (this.lineItems == null) {
+ this.lineItems = new ArrayList<>();
+ }
+ this.lineItems.add(lineItemsItem);
+ return this;
+ }
+
+ /**
+ * List of line items being checked out.
+ * @return lineItems
+ */
+ @NotNull @Valid
+ @Schema(name = "line_items", description = "List of line items being checked out.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("line_items")
+ public List<@Valid LineItemUpdateRequest> getLineItems() {
+ return lineItems;
+ }
+
+ public void setLineItems(List<@Valid LineItemUpdateRequest> lineItems) {
+ this.lineItems = lineItems;
+ }
+
+ public CheckoutUpdateRequest buyer(@Nullable Buyer buyer) {
+ this.buyer = buyer;
+ return this;
+ }
+
+ /**
+ * Get buyer
+ * @return buyer
+ */
+ @Valid
+ @Schema(name = "buyer", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("buyer")
+ public @Nullable Buyer getBuyer() {
+ return buyer;
+ }
+
+ public void setBuyer(@Nullable Buyer buyer) {
+ this.buyer = buyer;
+ }
+
+ public CheckoutUpdateRequest currency(String currency) {
+ this.currency = currency;
+ return this;
+ }
+
+ /**
+ * ISO 4217 currency code.
+ * @return currency
+ */
+ @NotNull
+ @Schema(name = "currency", description = "ISO 4217 currency code.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("currency")
+ public String getCurrency() {
+ return currency;
+ }
+
+ public void setCurrency(String currency) {
+ this.currency = currency;
+ }
+
+ public CheckoutUpdateRequest payment(PaymentUpdateRequest payment) {
+ this.payment = payment;
+ return this;
+ }
+
+ /**
+ * Get payment
+ * @return payment
+ */
+ @NotNull @Valid
+ @Schema(name = "payment", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("payment")
+ public PaymentUpdateRequest getPayment() {
+ return payment;
+ }
+
+ public void setPayment(PaymentUpdateRequest payment) {
+ this.payment = payment;
+ }
+ /**
+ * A container for additional, undeclared properties.
+ * This is a holder for any undeclared properties as specified with
+ * the 'additionalProperties' keyword in the OAS document.
+ */
+ private Map additionalProperties;
+
+ /**
+ * Set the additional (undeclared) property with the specified name and value.
+ * If the property does not already exist, create it otherwise replace it.
+ */
+ @JsonAnySetter
+ public CheckoutUpdateRequest putAdditionalProperty(String key, JsonNode value) {
+ if (this.additionalProperties == null) {
+ this.additionalProperties = new HashMap();
+ }
+ this.additionalProperties.put(key, value);
+ return this;
+ }
+
+ /**
+ * Return the additional (undeclared) property.
+ */
+ @JsonAnyGetter
+ public Map getAdditionalProperties() {
+ return additionalProperties;
+ }
+
+ /**
+ * Return the additional (undeclared) property with the specified name.
+ */
+ public JsonNode getAdditionalProperty(String key) {
+ if (this.additionalProperties == null) {
+ return null;
+ }
+ return this.additionalProperties.get(key);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ CheckoutUpdateRequest checkoutUpdateRequest = (CheckoutUpdateRequest) o;
+ return Objects.equals(this.id, checkoutUpdateRequest.id) &&
+ Objects.equals(this.lineItems, checkoutUpdateRequest.lineItems) &&
+ Objects.equals(this.buyer, checkoutUpdateRequest.buyer) &&
+ Objects.equals(this.currency, checkoutUpdateRequest.currency) &&
+ Objects.equals(this.payment, checkoutUpdateRequest.payment) &&
+ Objects.equals(this.additionalProperties, checkoutUpdateRequest.additionalProperties);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, lineItems, buyer, currency, payment, additionalProperties);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class CheckoutUpdateRequest {\n");
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" lineItems: ").append(toIndentedString(lineItems)).append("\n");
+ sb.append(" buyer: ").append(toIndentedString(buyer)).append("\n");
+ sb.append(" currency: ").append(toIndentedString(currency)).append("\n");
+ sb.append(" payment: ").append(toIndentedString(payment)).append("\n");
+
+ sb.append(" additionalProperties: ").append(toIndentedString(additionalProperties)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private CheckoutUpdateRequest instance;
+
+ public Builder() {
+ this(new CheckoutUpdateRequest());
+ }
+
+ protected Builder(CheckoutUpdateRequest instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(CheckoutUpdateRequest value) {
+ this.instance.setId(value.id);
+ this.instance.setLineItems(value.lineItems);
+ this.instance.setBuyer(value.buyer);
+ this.instance.setCurrency(value.currency);
+ this.instance.setPayment(value.payment);
+ return this;
+ }
+
+ public CheckoutUpdateRequest.Builder id(String id) {
+ this.instance.id(id);
+ return this;
+ }
+
+ public CheckoutUpdateRequest.Builder lineItems(List lineItems) {
+ this.instance.lineItems(lineItems);
+ return this;
+ }
+
+ public CheckoutUpdateRequest.Builder buyer(Buyer buyer) {
+ this.instance.buyer(buyer);
+ return this;
+ }
+
+ public CheckoutUpdateRequest.Builder currency(String currency) {
+ this.instance.currency(currency);
+ return this;
+ }
+
+ public CheckoutUpdateRequest.Builder payment(PaymentUpdateRequest payment) {
+ this.instance.payment(payment);
+ return this;
+ }
+
+ public CheckoutUpdateRequest.Builder additionalProperties(Map additionalProperties) {
+ this.instance.additionalProperties = additionalProperties;
+ return this;
+ }
+
+ /**
+ * returns a built CheckoutUpdateRequest instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public CheckoutUpdateRequest build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static CheckoutUpdateRequest.Builder builder() {
+ return new CheckoutUpdateRequest.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public CheckoutUpdateRequest.Builder toBuilder() {
+ CheckoutUpdateRequest.Builder builder = new CheckoutUpdateRequest.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/CompleteCheckoutRequest.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/CompleteCheckoutRequest.java
new file mode 100644
index 0000000..ec2cad3
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/CompleteCheckoutRequest.java
@@ -0,0 +1,251 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.CardPaymentInstrument;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.databind.JsonNode;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+import java.util.Map;
+import java.util.HashMap;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+/**
+ * CompleteCheckoutRequest
+ */
+
+@JsonTypeName("complete_checkout_request")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class CompleteCheckoutRequest {
+
+ private CardPaymentInstrument paymentData;
+
+ private @Nullable JsonNode riskSignals;
+
+ public CompleteCheckoutRequest() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public CompleteCheckoutRequest(CardPaymentInstrument paymentData) {
+ this.paymentData = paymentData;
+ }
+
+ public CompleteCheckoutRequest paymentData(CardPaymentInstrument paymentData) {
+ this.paymentData = paymentData;
+ return this;
+ }
+
+ /**
+ * Get paymentData
+ * @return paymentData
+ */
+ @NotNull @Valid
+ @Schema(name = "payment_data", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("payment_data")
+ public CardPaymentInstrument getPaymentData() {
+ return paymentData;
+ }
+
+ public void setPaymentData(CardPaymentInstrument paymentData) {
+ this.paymentData = paymentData;
+ }
+
+ public CompleteCheckoutRequest riskSignals(@Nullable JsonNode riskSignals) {
+ this.riskSignals = riskSignals;
+ return this;
+ }
+
+ /**
+ * Key-value pairs of risk signals.
+ * @return riskSignals
+ */
+ @Valid
+ @Schema(name = "risk_signals", description = "Key-value pairs of risk signals.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("risk_signals")
+ public @Nullable JsonNode getRiskSignals() {
+ return riskSignals;
+ }
+
+ public void setRiskSignals(@Nullable JsonNode riskSignals) {
+ this.riskSignals = riskSignals;
+ }
+ /**
+ * A container for additional, undeclared properties.
+ * This is a holder for any undeclared properties as specified with
+ * the 'additionalProperties' keyword in the OAS document.
+ */
+ private Map additionalProperties;
+
+ /**
+ * Set the additional (undeclared) property with the specified name and value.
+ * If the property does not already exist, create it otherwise replace it.
+ */
+ @JsonAnySetter
+ public CompleteCheckoutRequest putAdditionalProperty(String key, JsonNode value) {
+ if (this.additionalProperties == null) {
+ this.additionalProperties = new HashMap();
+ }
+ this.additionalProperties.put(key, value);
+ return this;
+ }
+
+ /**
+ * Return the additional (undeclared) property.
+ */
+ @JsonAnyGetter
+ public Map getAdditionalProperties() {
+ return additionalProperties;
+ }
+
+ /**
+ * Return the additional (undeclared) property with the specified name.
+ */
+ public JsonNode getAdditionalProperty(String key) {
+ if (this.additionalProperties == null) {
+ return null;
+ }
+ return this.additionalProperties.get(key);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ CompleteCheckoutRequest completeCheckoutRequest = (CompleteCheckoutRequest) o;
+ return Objects.equals(this.paymentData, completeCheckoutRequest.paymentData) &&
+ Objects.equals(this.riskSignals, completeCheckoutRequest.riskSignals) &&
+ Objects.equals(this.additionalProperties, completeCheckoutRequest.additionalProperties);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(paymentData, riskSignals, additionalProperties);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class CompleteCheckoutRequest {\n");
+ sb.append(" paymentData: ").append(toIndentedString(paymentData)).append("\n");
+ sb.append(" riskSignals: ").append(toIndentedString(riskSignals)).append("\n");
+
+ sb.append(" additionalProperties: ").append(toIndentedString(additionalProperties)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private CompleteCheckoutRequest instance;
+
+ public Builder() {
+ this(new CompleteCheckoutRequest());
+ }
+
+ protected Builder(CompleteCheckoutRequest instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(CompleteCheckoutRequest value) {
+ this.instance.setPaymentData(value.paymentData);
+ this.instance.setRiskSignals(value.riskSignals);
+ return this;
+ }
+
+ public CompleteCheckoutRequest.Builder paymentData(CardPaymentInstrument paymentData) {
+ this.instance.paymentData(paymentData);
+ return this;
+ }
+
+ public CompleteCheckoutRequest.Builder riskSignals(JsonNode riskSignals) {
+ this.instance.riskSignals(riskSignals);
+ return this;
+ }
+
+ public CompleteCheckoutRequest.Builder additionalProperties(Map additionalProperties) {
+ this.instance.additionalProperties = additionalProperties;
+ return this;
+ }
+
+ /**
+ * returns a built CompleteCheckoutRequest instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public CompleteCheckoutRequest build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static CompleteCheckoutRequest.Builder builder() {
+ return new CompleteCheckoutRequest.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public CompleteCheckoutRequest.Builder toBuilder() {
+ CompleteCheckoutRequest.Builder builder = new CompleteCheckoutRequest.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/DiscountRequest.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/DiscountRequest.java
new file mode 100644
index 0000000..09bed61
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/DiscountRequest.java
@@ -0,0 +1,212 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.DiscountRequestAppliedInner;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * Discount codes input and applied discounts output.
+ */
+
+@Schema(name = "discount_request", description = "Discount codes input and applied discounts output.")
+@JsonTypeName("discount_request")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:22.638361369Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class DiscountRequest {
+
+ @Valid
+ private List codes = new ArrayList<>();
+
+ @Valid
+ private List<@Valid DiscountRequestAppliedInner> applied = new ArrayList<>();
+
+ public DiscountRequest codes(List codes) {
+ this.codes = codes;
+ return this;
+ }
+
+ public DiscountRequest addCodesItem(String codesItem) {
+ if (this.codes == null) {
+ this.codes = new ArrayList<>();
+ }
+ this.codes.add(codesItem);
+ return this;
+ }
+
+ /**
+ * Discount codes to apply. Case-insensitive. Replaces previously submitted codes. Send empty array to clear.
+ * @return codes
+ */
+
+ @Schema(name = "codes", description = "Discount codes to apply. Case-insensitive. Replaces previously submitted codes. Send empty array to clear.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("codes")
+ public List getCodes() {
+ return codes;
+ }
+
+ public void setCodes(List codes) {
+ this.codes = codes;
+ }
+
+ public DiscountRequest applied(List<@Valid DiscountRequestAppliedInner> applied) {
+ this.applied = applied;
+ return this;
+ }
+
+ public DiscountRequest addAppliedItem(DiscountRequestAppliedInner appliedItem) {
+ if (this.applied == null) {
+ this.applied = new ArrayList<>();
+ }
+ this.applied.add(appliedItem);
+ return this;
+ }
+
+ /**
+ * Discounts successfully applied (code-based and automatic).
+ * @return applied
+ */
+ @Valid
+ @Schema(name = "applied", description = "Discounts successfully applied (code-based and automatic).", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("applied")
+ public List<@Valid DiscountRequestAppliedInner> getApplied() {
+ return applied;
+ }
+
+ public void setApplied(List<@Valid DiscountRequestAppliedInner> applied) {
+ this.applied = applied;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ DiscountRequest discountRequest = (DiscountRequest) o;
+ return Objects.equals(this.codes, discountRequest.codes) &&
+ Objects.equals(this.applied, discountRequest.applied);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(codes, applied);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class DiscountRequest {\n");
+ sb.append(" codes: ").append(toIndentedString(codes)).append("\n");
+ sb.append(" applied: ").append(toIndentedString(applied)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private DiscountRequest instance;
+
+ public Builder() {
+ this(new DiscountRequest());
+ }
+
+ protected Builder(DiscountRequest instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(DiscountRequest value) {
+ this.instance.setCodes(value.codes);
+ this.instance.setApplied(value.applied);
+ return this;
+ }
+
+ public DiscountRequest.Builder codes(List codes) {
+ this.instance.codes(codes);
+ return this;
+ }
+
+ public DiscountRequest.Builder applied(List applied) {
+ this.instance.applied(applied);
+ return this;
+ }
+
+ /**
+ * returns a built DiscountRequest instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public DiscountRequest build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static DiscountRequest.Builder builder() {
+ return new DiscountRequest.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public DiscountRequest.Builder toBuilder() {
+ DiscountRequest.Builder builder = new DiscountRequest.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/DiscountRequestAppliedInner.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/DiscountRequestAppliedInner.java
new file mode 100644
index 0000000..41f2ee1
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/DiscountRequestAppliedInner.java
@@ -0,0 +1,403 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.DiscountRequestAppliedInnerAllocationsInner;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * A discount that was successfully applied.
+ */
+
+@Schema(name = "discount_request_applied_inner", description = "A discount that was successfully applied.")
+@JsonTypeName("discount_request_applied_inner")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:22.638361369Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class DiscountRequestAppliedInner {
+
+ private @Nullable String code;
+
+ private String title;
+
+ private Integer amount;
+
+ private Boolean automatic = false;
+
+ /**
+ * Allocation method. 'each' = applied independently per item. 'across' = split proportionally by value.
+ */
+ public enum MethodEnum {
+ EACH("each"),
+
+ ACROSS("across");
+
+ private final String value;
+
+ MethodEnum(String value) {
+ this.value = value;
+ }
+
+ @JsonValue
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+ @JsonCreator
+ public static MethodEnum fromValue(String value) {
+ for (MethodEnum b : MethodEnum.values()) {
+ if (b.value.equals(value)) {
+ return b;
+ }
+ }
+ throw new IllegalArgumentException("Unexpected value '" + value + "'");
+ }
+ }
+
+ private @Nullable MethodEnum method;
+
+ private @Nullable Integer priority;
+
+ @Valid
+ private List<@Valid DiscountRequestAppliedInnerAllocationsInner> allocations = new ArrayList<>();
+
+ public DiscountRequestAppliedInner() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public DiscountRequestAppliedInner(String title, Integer amount) {
+ this.title = title;
+ this.amount = amount;
+ }
+
+ public DiscountRequestAppliedInner code(@Nullable String code) {
+ this.code = code;
+ return this;
+ }
+
+ /**
+ * The discount code. Omitted for automatic discounts.
+ * @return code
+ */
+
+ @Schema(name = "code", description = "The discount code. Omitted for automatic discounts.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("code")
+ public @Nullable String getCode() {
+ return code;
+ }
+
+ public void setCode(@Nullable String code) {
+ this.code = code;
+ }
+
+ public DiscountRequestAppliedInner title(String title) {
+ this.title = title;
+ return this;
+ }
+
+ /**
+ * Human-readable discount name (e.g., 'Summer Sale 20% Off').
+ * @return title
+ */
+ @NotNull
+ @Schema(name = "title", description = "Human-readable discount name (e.g., 'Summer Sale 20% Off').", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("title")
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public DiscountRequestAppliedInner amount(Integer amount) {
+ this.amount = amount;
+ return this;
+ }
+
+ /**
+ * Total discount amount in minor (cents) currency units.
+ * minimum: 0
+ * @return amount
+ */
+ @NotNull @Min(value = 0)
+ @Schema(name = "amount", description = "Total discount amount in minor (cents) currency units.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("amount")
+ public Integer getAmount() {
+ return amount;
+ }
+
+ public void setAmount(Integer amount) {
+ this.amount = amount;
+ }
+
+ public DiscountRequestAppliedInner automatic(Boolean automatic) {
+ this.automatic = automatic;
+ return this;
+ }
+
+ /**
+ * True if applied automatically by merchant rules (no code required).
+ * @return automatic
+ */
+
+ @Schema(name = "automatic", description = "True if applied automatically by merchant rules (no code required).", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("automatic")
+ public Boolean getAutomatic() {
+ return automatic;
+ }
+
+ public void setAutomatic(Boolean automatic) {
+ this.automatic = automatic;
+ }
+
+ public DiscountRequestAppliedInner method(@Nullable MethodEnum method) {
+ this.method = method;
+ return this;
+ }
+
+ /**
+ * Allocation method. 'each' = applied independently per item. 'across' = split proportionally by value.
+ * @return method
+ */
+
+ @Schema(name = "method", description = "Allocation method. 'each' = applied independently per item. 'across' = split proportionally by value.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("method")
+ public @Nullable MethodEnum getMethod() {
+ return method;
+ }
+
+ public void setMethod(@Nullable MethodEnum method) {
+ this.method = method;
+ }
+
+ public DiscountRequestAppliedInner priority(@Nullable Integer priority) {
+ this.priority = priority;
+ return this;
+ }
+
+ /**
+ * Stacking order for discount calculation. Lower numbers applied first (1 = first).
+ * minimum: 1
+ * @return priority
+ */
+ @Min(value = 1)
+ @Schema(name = "priority", description = "Stacking order for discount calculation. Lower numbers applied first (1 = first).", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("priority")
+ public @Nullable Integer getPriority() {
+ return priority;
+ }
+
+ public void setPriority(@Nullable Integer priority) {
+ this.priority = priority;
+ }
+
+ public DiscountRequestAppliedInner allocations(List<@Valid DiscountRequestAppliedInnerAllocationsInner> allocations) {
+ this.allocations = allocations;
+ return this;
+ }
+
+ public DiscountRequestAppliedInner addAllocationsItem(DiscountRequestAppliedInnerAllocationsInner allocationsItem) {
+ if (this.allocations == null) {
+ this.allocations = new ArrayList<>();
+ }
+ this.allocations.add(allocationsItem);
+ return this;
+ }
+
+ /**
+ * Breakdown of where this discount was allocated. Sum of allocation amounts equals total amount.
+ * @return allocations
+ */
+ @Valid
+ @Schema(name = "allocations", description = "Breakdown of where this discount was allocated. Sum of allocation amounts equals total amount.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("allocations")
+ public List<@Valid DiscountRequestAppliedInnerAllocationsInner> getAllocations() {
+ return allocations;
+ }
+
+ public void setAllocations(List<@Valid DiscountRequestAppliedInnerAllocationsInner> allocations) {
+ this.allocations = allocations;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ DiscountRequestAppliedInner discountRequestAppliedInner = (DiscountRequestAppliedInner) o;
+ return Objects.equals(this.code, discountRequestAppliedInner.code) &&
+ Objects.equals(this.title, discountRequestAppliedInner.title) &&
+ Objects.equals(this.amount, discountRequestAppliedInner.amount) &&
+ Objects.equals(this.automatic, discountRequestAppliedInner.automatic) &&
+ Objects.equals(this.method, discountRequestAppliedInner.method) &&
+ Objects.equals(this.priority, discountRequestAppliedInner.priority) &&
+ Objects.equals(this.allocations, discountRequestAppliedInner.allocations);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(code, title, amount, automatic, method, priority, allocations);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class DiscountRequestAppliedInner {\n");
+ sb.append(" code: ").append(toIndentedString(code)).append("\n");
+ sb.append(" title: ").append(toIndentedString(title)).append("\n");
+ sb.append(" amount: ").append(toIndentedString(amount)).append("\n");
+ sb.append(" automatic: ").append(toIndentedString(automatic)).append("\n");
+ sb.append(" method: ").append(toIndentedString(method)).append("\n");
+ sb.append(" priority: ").append(toIndentedString(priority)).append("\n");
+ sb.append(" allocations: ").append(toIndentedString(allocations)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private DiscountRequestAppliedInner instance;
+
+ public Builder() {
+ this(new DiscountRequestAppliedInner());
+ }
+
+ protected Builder(DiscountRequestAppliedInner instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(DiscountRequestAppliedInner value) {
+ this.instance.setCode(value.code);
+ this.instance.setTitle(value.title);
+ this.instance.setAmount(value.amount);
+ this.instance.setAutomatic(value.automatic);
+ this.instance.setMethod(value.method);
+ this.instance.setPriority(value.priority);
+ this.instance.setAllocations(value.allocations);
+ return this;
+ }
+
+ public DiscountRequestAppliedInner.Builder code(String code) {
+ this.instance.code(code);
+ return this;
+ }
+
+ public DiscountRequestAppliedInner.Builder title(String title) {
+ this.instance.title(title);
+ return this;
+ }
+
+ public DiscountRequestAppliedInner.Builder amount(Integer amount) {
+ this.instance.amount(amount);
+ return this;
+ }
+
+ public DiscountRequestAppliedInner.Builder automatic(Boolean automatic) {
+ this.instance.automatic(automatic);
+ return this;
+ }
+
+ public DiscountRequestAppliedInner.Builder method(MethodEnum method) {
+ this.instance.method(method);
+ return this;
+ }
+
+ public DiscountRequestAppliedInner.Builder priority(Integer priority) {
+ this.instance.priority(priority);
+ return this;
+ }
+
+ public DiscountRequestAppliedInner.Builder allocations(List allocations) {
+ this.instance.allocations(allocations);
+ return this;
+ }
+
+ /**
+ * returns a built DiscountRequestAppliedInner instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public DiscountRequestAppliedInner build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static DiscountRequestAppliedInner.Builder builder() {
+ return new DiscountRequestAppliedInner.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public DiscountRequestAppliedInner.Builder toBuilder() {
+ DiscountRequestAppliedInner.Builder builder = new DiscountRequestAppliedInner.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/DiscountRequestAppliedInnerAllocationsInner.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/DiscountRequestAppliedInnerAllocationsInner.java
new file mode 100644
index 0000000..86a6922
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/DiscountRequestAppliedInnerAllocationsInner.java
@@ -0,0 +1,203 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * Breakdown of how a discount amount was allocated to a specific target.
+ */
+
+@Schema(name = "discount_request_applied_inner_allocations_inner", description = "Breakdown of how a discount amount was allocated to a specific target.")
+@JsonTypeName("discount_request_applied_inner_allocations_inner")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:22.638361369Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class DiscountRequestAppliedInnerAllocationsInner {
+
+ private String path;
+
+ private Integer amount;
+
+ public DiscountRequestAppliedInnerAllocationsInner() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public DiscountRequestAppliedInnerAllocationsInner(String path, Integer amount) {
+ this.path = path;
+ this.amount = amount;
+ }
+
+ public DiscountRequestAppliedInnerAllocationsInner path(String path) {
+ this.path = path;
+ return this;
+ }
+
+ /**
+ * JSONPath to the allocation target (e.g., '$.line_items[0]', '$.totals.shipping').
+ * @return path
+ */
+ @NotNull
+ @Schema(name = "path", description = "JSONPath to the allocation target (e.g., '$.line_items[0]', '$.totals.shipping').", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("path")
+ public String getPath() {
+ return path;
+ }
+
+ public void setPath(String path) {
+ this.path = path;
+ }
+
+ public DiscountRequestAppliedInnerAllocationsInner amount(Integer amount) {
+ this.amount = amount;
+ return this;
+ }
+
+ /**
+ * Amount allocated to this target in minor (cents) currency units.
+ * minimum: 0
+ * @return amount
+ */
+ @NotNull @Min(value = 0)
+ @Schema(name = "amount", description = "Amount allocated to this target in minor (cents) currency units.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("amount")
+ public Integer getAmount() {
+ return amount;
+ }
+
+ public void setAmount(Integer amount) {
+ this.amount = amount;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ DiscountRequestAppliedInnerAllocationsInner discountRequestAppliedInnerAllocationsInner = (DiscountRequestAppliedInnerAllocationsInner) o;
+ return Objects.equals(this.path, discountRequestAppliedInnerAllocationsInner.path) &&
+ Objects.equals(this.amount, discountRequestAppliedInnerAllocationsInner.amount);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(path, amount);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class DiscountRequestAppliedInnerAllocationsInner {\n");
+ sb.append(" path: ").append(toIndentedString(path)).append("\n");
+ sb.append(" amount: ").append(toIndentedString(amount)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private DiscountRequestAppliedInnerAllocationsInner instance;
+
+ public Builder() {
+ this(new DiscountRequestAppliedInnerAllocationsInner());
+ }
+
+ protected Builder(DiscountRequestAppliedInnerAllocationsInner instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(DiscountRequestAppliedInnerAllocationsInner value) {
+ this.instance.setPath(value.path);
+ this.instance.setAmount(value.amount);
+ return this;
+ }
+
+ public DiscountRequestAppliedInnerAllocationsInner.Builder path(String path) {
+ this.instance.path(path);
+ return this;
+ }
+
+ public DiscountRequestAppliedInnerAllocationsInner.Builder amount(Integer amount) {
+ this.instance.amount(amount);
+ return this;
+ }
+
+ /**
+ * returns a built DiscountRequestAppliedInnerAllocationsInner instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public DiscountRequestAppliedInnerAllocationsInner build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static DiscountRequestAppliedInnerAllocationsInner.Builder builder() {
+ return new DiscountRequestAppliedInnerAllocationsInner.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public DiscountRequestAppliedInnerAllocationsInner.Builder toBuilder() {
+ DiscountRequestAppliedInnerAllocationsInner.Builder builder = new DiscountRequestAppliedInnerAllocationsInner.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/DiscountResponse.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/DiscountResponse.java
new file mode 100644
index 0000000..07a2868
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/DiscountResponse.java
@@ -0,0 +1,212 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.DiscountRequestAppliedInner;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * Discount codes input and applied discounts output.
+ */
+
+@Schema(name = "discount_response", description = "Discount codes input and applied discounts output.")
+@JsonTypeName("discount_response")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:22.638361369Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class DiscountResponse {
+
+ @Valid
+ private List codes = new ArrayList<>();
+
+ @Valid
+ private List<@Valid DiscountRequestAppliedInner> applied = new ArrayList<>();
+
+ public DiscountResponse codes(List codes) {
+ this.codes = codes;
+ return this;
+ }
+
+ public DiscountResponse addCodesItem(String codesItem) {
+ if (this.codes == null) {
+ this.codes = new ArrayList<>();
+ }
+ this.codes.add(codesItem);
+ return this;
+ }
+
+ /**
+ * Discount codes to apply. Case-insensitive. Replaces previously submitted codes. Send empty array to clear.
+ * @return codes
+ */
+
+ @Schema(name = "codes", description = "Discount codes to apply. Case-insensitive. Replaces previously submitted codes. Send empty array to clear.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("codes")
+ public List getCodes() {
+ return codes;
+ }
+
+ public void setCodes(List codes) {
+ this.codes = codes;
+ }
+
+ public DiscountResponse applied(List<@Valid DiscountRequestAppliedInner> applied) {
+ this.applied = applied;
+ return this;
+ }
+
+ public DiscountResponse addAppliedItem(DiscountRequestAppliedInner appliedItem) {
+ if (this.applied == null) {
+ this.applied = new ArrayList<>();
+ }
+ this.applied.add(appliedItem);
+ return this;
+ }
+
+ /**
+ * Discounts successfully applied (code-based and automatic).
+ * @return applied
+ */
+ @Valid
+ @Schema(name = "applied", description = "Discounts successfully applied (code-based and automatic).", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("applied")
+ public List<@Valid DiscountRequestAppliedInner> getApplied() {
+ return applied;
+ }
+
+ public void setApplied(List<@Valid DiscountRequestAppliedInner> applied) {
+ this.applied = applied;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ DiscountResponse discountResponse = (DiscountResponse) o;
+ return Objects.equals(this.codes, discountResponse.codes) &&
+ Objects.equals(this.applied, discountResponse.applied);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(codes, applied);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class DiscountResponse {\n");
+ sb.append(" codes: ").append(toIndentedString(codes)).append("\n");
+ sb.append(" applied: ").append(toIndentedString(applied)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private DiscountResponse instance;
+
+ public Builder() {
+ this(new DiscountResponse());
+ }
+
+ protected Builder(DiscountResponse instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(DiscountResponse value) {
+ this.instance.setCodes(value.codes);
+ this.instance.setApplied(value.applied);
+ return this;
+ }
+
+ public DiscountResponse.Builder codes(List codes) {
+ this.instance.codes(codes);
+ return this;
+ }
+
+ public DiscountResponse.Builder applied(List applied) {
+ this.instance.applied(applied);
+ return this;
+ }
+
+ /**
+ * returns a built DiscountResponse instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public DiscountResponse build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static DiscountResponse.Builder builder() {
+ return new DiscountResponse.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public DiscountResponse.Builder toBuilder() {
+ DiscountResponse.Builder builder = new DiscountResponse.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/Expectation.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/Expectation.java
new file mode 100644
index 0000000..97e99fd
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/Expectation.java
@@ -0,0 +1,374 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.ExpectationLineItemsInner;
+import com.dev.ucp.service.shopping.model.PostalAddress;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * Buyer-facing fulfillment expectation representing logical groupings of items (e.g., 'package'). Can be split, merged, or adjusted post-order to set buyer expectations for when/how items arrive.
+ */
+
+@Schema(name = "Expectation", description = "Buyer-facing fulfillment expectation representing logical groupings of items (e.g., 'package'). Can be split, merged, or adjusted post-order to set buyer expectations for when/how items arrive.")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class Expectation {
+
+ private String id;
+
+ @Valid
+ private List<@Valid ExpectationLineItemsInner> lineItems = new ArrayList<>();
+
+ /**
+ * Delivery method type (shipping, pickup, digital).
+ */
+ public enum MethodTypeEnum {
+ SHIPPING("shipping"),
+
+ PICKUP("pickup"),
+
+ DIGITAL("digital");
+
+ private final String value;
+
+ MethodTypeEnum(String value) {
+ this.value = value;
+ }
+
+ @JsonValue
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+ @JsonCreator
+ public static MethodTypeEnum fromValue(String value) {
+ for (MethodTypeEnum b : MethodTypeEnum.values()) {
+ if (b.value.equals(value)) {
+ return b;
+ }
+ }
+ throw new IllegalArgumentException("Unexpected value '" + value + "'");
+ }
+ }
+
+ private MethodTypeEnum methodType;
+
+ private PostalAddress destination;
+
+ private @Nullable String description;
+
+ private @Nullable String fulfillableOn;
+
+ public Expectation() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public Expectation(String id, List<@Valid ExpectationLineItemsInner> lineItems, MethodTypeEnum methodType, PostalAddress destination) {
+ this.id = id;
+ this.lineItems = lineItems;
+ this.methodType = methodType;
+ this.destination = destination;
+ }
+
+ public Expectation id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Expectation identifier.
+ * @return id
+ */
+ @NotNull
+ @Schema(name = "id", description = "Expectation identifier.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("id")
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public Expectation lineItems(List<@Valid ExpectationLineItemsInner> lineItems) {
+ this.lineItems = lineItems;
+ return this;
+ }
+
+ public Expectation addLineItemsItem(ExpectationLineItemsInner lineItemsItem) {
+ if (this.lineItems == null) {
+ this.lineItems = new ArrayList<>();
+ }
+ this.lineItems.add(lineItemsItem);
+ return this;
+ }
+
+ /**
+ * Which line items and quantities are in this expectation.
+ * @return lineItems
+ */
+ @NotNull @Valid
+ @Schema(name = "line_items", description = "Which line items and quantities are in this expectation.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("line_items")
+ public List<@Valid ExpectationLineItemsInner> getLineItems() {
+ return lineItems;
+ }
+
+ public void setLineItems(List<@Valid ExpectationLineItemsInner> lineItems) {
+ this.lineItems = lineItems;
+ }
+
+ public Expectation methodType(MethodTypeEnum methodType) {
+ this.methodType = methodType;
+ return this;
+ }
+
+ /**
+ * Delivery method type (shipping, pickup, digital).
+ * @return methodType
+ */
+ @NotNull
+ @Schema(name = "method_type", description = "Delivery method type (shipping, pickup, digital).", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("method_type")
+ public MethodTypeEnum getMethodType() {
+ return methodType;
+ }
+
+ public void setMethodType(MethodTypeEnum methodType) {
+ this.methodType = methodType;
+ }
+
+ public Expectation destination(PostalAddress destination) {
+ this.destination = destination;
+ return this;
+ }
+
+ /**
+ * Get destination
+ * @return destination
+ */
+ @NotNull @Valid
+ @Schema(name = "destination", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("destination")
+ public PostalAddress getDestination() {
+ return destination;
+ }
+
+ public void setDestination(PostalAddress destination) {
+ this.destination = destination;
+ }
+
+ public Expectation description(@Nullable String description) {
+ this.description = description;
+ return this;
+ }
+
+ /**
+ * Human-readable delivery description (e.g., 'Arrives in 5-8 business days').
+ * @return description
+ */
+
+ @Schema(name = "description", description = "Human-readable delivery description (e.g., 'Arrives in 5-8 business days').", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("description")
+ public @Nullable String getDescription() {
+ return description;
+ }
+
+ public void setDescription(@Nullable String description) {
+ this.description = description;
+ }
+
+ public Expectation fulfillableOn(@Nullable String fulfillableOn) {
+ this.fulfillableOn = fulfillableOn;
+ return this;
+ }
+
+ /**
+ * When this expectation can be fulfilled: 'now' or ISO 8601 timestamp for future date (backorder, pre-order).
+ * @return fulfillableOn
+ */
+
+ @Schema(name = "fulfillable_on", description = "When this expectation can be fulfilled: 'now' or ISO 8601 timestamp for future date (backorder, pre-order).", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("fulfillable_on")
+ public @Nullable String getFulfillableOn() {
+ return fulfillableOn;
+ }
+
+ public void setFulfillableOn(@Nullable String fulfillableOn) {
+ this.fulfillableOn = fulfillableOn;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ Expectation expectation = (Expectation) o;
+ return Objects.equals(this.id, expectation.id) &&
+ Objects.equals(this.lineItems, expectation.lineItems) &&
+ Objects.equals(this.methodType, expectation.methodType) &&
+ Objects.equals(this.destination, expectation.destination) &&
+ Objects.equals(this.description, expectation.description) &&
+ Objects.equals(this.fulfillableOn, expectation.fulfillableOn);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, lineItems, methodType, destination, description, fulfillableOn);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class Expectation {\n");
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" lineItems: ").append(toIndentedString(lineItems)).append("\n");
+ sb.append(" methodType: ").append(toIndentedString(methodType)).append("\n");
+ sb.append(" destination: ").append(toIndentedString(destination)).append("\n");
+ sb.append(" description: ").append(toIndentedString(description)).append("\n");
+ sb.append(" fulfillableOn: ").append(toIndentedString(fulfillableOn)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private Expectation instance;
+
+ public Builder() {
+ this(new Expectation());
+ }
+
+ protected Builder(Expectation instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(Expectation value) {
+ this.instance.setId(value.id);
+ this.instance.setLineItems(value.lineItems);
+ this.instance.setMethodType(value.methodType);
+ this.instance.setDestination(value.destination);
+ this.instance.setDescription(value.description);
+ this.instance.setFulfillableOn(value.fulfillableOn);
+ return this;
+ }
+
+ public Expectation.Builder id(String id) {
+ this.instance.id(id);
+ return this;
+ }
+
+ public Expectation.Builder lineItems(List lineItems) {
+ this.instance.lineItems(lineItems);
+ return this;
+ }
+
+ public Expectation.Builder methodType(MethodTypeEnum methodType) {
+ this.instance.methodType(methodType);
+ return this;
+ }
+
+ public Expectation.Builder destination(PostalAddress destination) {
+ this.instance.destination(destination);
+ return this;
+ }
+
+ public Expectation.Builder description(String description) {
+ this.instance.description(description);
+ return this;
+ }
+
+ public Expectation.Builder fulfillableOn(String fulfillableOn) {
+ this.instance.fulfillableOn(fulfillableOn);
+ return this;
+ }
+
+ /**
+ * returns a built Expectation instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public Expectation build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static Expectation.Builder builder() {
+ return new Expectation.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public Expectation.Builder toBuilder() {
+ Expectation.Builder builder = new Expectation.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/ExpectationLineItemsInner.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/ExpectationLineItemsInner.java
new file mode 100644
index 0000000..3a4b795
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/ExpectationLineItemsInner.java
@@ -0,0 +1,202 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * ExpectationLineItemsInner
+ */
+
+@JsonTypeName("Expectation_line_items_inner")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class ExpectationLineItemsInner {
+
+ private String id;
+
+ private Integer quantity;
+
+ public ExpectationLineItemsInner() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public ExpectationLineItemsInner(String id, Integer quantity) {
+ this.id = id;
+ this.quantity = quantity;
+ }
+
+ public ExpectationLineItemsInner id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Line item ID reference.
+ * @return id
+ */
+ @NotNull
+ @Schema(name = "id", description = "Line item ID reference.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("id")
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public ExpectationLineItemsInner quantity(Integer quantity) {
+ this.quantity = quantity;
+ return this;
+ }
+
+ /**
+ * Quantity of this item in this expectation.
+ * minimum: 1
+ * @return quantity
+ */
+ @NotNull @Min(value = 1)
+ @Schema(name = "quantity", description = "Quantity of this item in this expectation.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("quantity")
+ public Integer getQuantity() {
+ return quantity;
+ }
+
+ public void setQuantity(Integer quantity) {
+ this.quantity = quantity;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ ExpectationLineItemsInner expectationLineItemsInner = (ExpectationLineItemsInner) o;
+ return Objects.equals(this.id, expectationLineItemsInner.id) &&
+ Objects.equals(this.quantity, expectationLineItemsInner.quantity);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, quantity);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class ExpectationLineItemsInner {\n");
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" quantity: ").append(toIndentedString(quantity)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private ExpectationLineItemsInner instance;
+
+ public Builder() {
+ this(new ExpectationLineItemsInner());
+ }
+
+ protected Builder(ExpectationLineItemsInner instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(ExpectationLineItemsInner value) {
+ this.instance.setId(value.id);
+ this.instance.setQuantity(value.quantity);
+ return this;
+ }
+
+ public ExpectationLineItemsInner.Builder id(String id) {
+ this.instance.id(id);
+ return this;
+ }
+
+ public ExpectationLineItemsInner.Builder quantity(Integer quantity) {
+ this.instance.quantity(quantity);
+ return this;
+ }
+
+ /**
+ * returns a built ExpectationLineItemsInner instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public ExpectationLineItemsInner build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static ExpectationLineItemsInner.Builder builder() {
+ return new ExpectationLineItemsInner.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public ExpectationLineItemsInner.Builder toBuilder() {
+ ExpectationLineItemsInner.Builder builder = new ExpectationLineItemsInner.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentAvailableMethodResponse.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentAvailableMethodResponse.java
new file mode 100644
index 0000000..156d598
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentAvailableMethodResponse.java
@@ -0,0 +1,378 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import com.fasterxml.jackson.databind.JsonNode;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.openapitools.jackson.nullable.JsonNullable;
+import org.springframework.lang.Nullable;
+import java.util.NoSuchElementException;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+import java.util.Map;
+import java.util.HashMap;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+/**
+ * Inventory availability hint for a fulfillment method type.
+ */
+
+@Schema(name = "Fulfillment_Available_Method_Response", description = "Inventory availability hint for a fulfillment method type.")
+@JsonTypeName("Fulfillment_Available_Method_Response")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:22.638361369Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class FulfillmentAvailableMethodResponse {
+
+ /**
+ * Fulfillment method type this availability applies to.
+ */
+ public enum TypeEnum {
+ SHIPPING("shipping"),
+
+ PICKUP("pickup");
+
+ private final String value;
+
+ TypeEnum(String value) {
+ this.value = value;
+ }
+
+ @JsonValue
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+ @JsonCreator
+ public static TypeEnum fromValue(String value) {
+ for (TypeEnum b : TypeEnum.values()) {
+ if (b.value.equals(value)) {
+ return b;
+ }
+ }
+ throw new IllegalArgumentException("Unexpected value '" + value + "'");
+ }
+ }
+
+ private TypeEnum type;
+
+ @Valid
+ private List lineItemIds = new ArrayList<>();
+
+ private JsonNullable fulfillableOn = JsonNullable.undefined();
+
+ private @Nullable String description;
+
+ public FulfillmentAvailableMethodResponse() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public FulfillmentAvailableMethodResponse(TypeEnum type, List lineItemIds) {
+ this.type = type;
+ this.lineItemIds = lineItemIds;
+ }
+
+ public FulfillmentAvailableMethodResponse type(TypeEnum type) {
+ this.type = type;
+ return this;
+ }
+
+ /**
+ * Fulfillment method type this availability applies to.
+ * @return type
+ */
+ @NotNull
+ @Schema(name = "type", description = "Fulfillment method type this availability applies to.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("type")
+ public TypeEnum getType() {
+ return type;
+ }
+
+ public void setType(TypeEnum type) {
+ this.type = type;
+ }
+
+ public FulfillmentAvailableMethodResponse lineItemIds(List lineItemIds) {
+ this.lineItemIds = lineItemIds;
+ return this;
+ }
+
+ public FulfillmentAvailableMethodResponse addLineItemIdsItem(String lineItemIdsItem) {
+ if (this.lineItemIds == null) {
+ this.lineItemIds = new ArrayList<>();
+ }
+ this.lineItemIds.add(lineItemIdsItem);
+ return this;
+ }
+
+ /**
+ * Line items available for this fulfillment method.
+ * @return lineItemIds
+ */
+ @NotNull
+ @Schema(name = "line_item_ids", description = "Line items available for this fulfillment method.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("line_item_ids")
+ public List getLineItemIds() {
+ return lineItemIds;
+ }
+
+ public void setLineItemIds(List lineItemIds) {
+ this.lineItemIds = lineItemIds;
+ }
+
+ public FulfillmentAvailableMethodResponse fulfillableOn(String fulfillableOn) {
+ this.fulfillableOn = JsonNullable.of(fulfillableOn);
+ return this;
+ }
+
+ /**
+ * 'now' for immediate availability, or ISO 8601 date for future (preorders, transfers).
+ * @return fulfillableOn
+ */
+
+ @Schema(name = "fulfillable_on", description = "'now' for immediate availability, or ISO 8601 date for future (preorders, transfers).", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("fulfillable_on")
+ public JsonNullable getFulfillableOn() {
+ return fulfillableOn;
+ }
+
+ public void setFulfillableOn(JsonNullable fulfillableOn) {
+ this.fulfillableOn = fulfillableOn;
+ }
+
+ public FulfillmentAvailableMethodResponse description(@Nullable String description) {
+ this.description = description;
+ return this;
+ }
+
+ /**
+ * Human-readable availability info (e.g., 'Available for pickup at Downtown Store today').
+ * @return description
+ */
+
+ @Schema(name = "description", description = "Human-readable availability info (e.g., 'Available for pickup at Downtown Store today').", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("description")
+ public @Nullable String getDescription() {
+ return description;
+ }
+
+ public void setDescription(@Nullable String description) {
+ this.description = description;
+ }
+ /**
+ * A container for additional, undeclared properties.
+ * This is a holder for any undeclared properties as specified with
+ * the 'additionalProperties' keyword in the OAS document.
+ */
+ private Map additionalProperties;
+
+ /**
+ * Set the additional (undeclared) property with the specified name and value.
+ * If the property does not already exist, create it otherwise replace it.
+ */
+ @JsonAnySetter
+ public FulfillmentAvailableMethodResponse putAdditionalProperty(String key, JsonNode value) {
+ if (this.additionalProperties == null) {
+ this.additionalProperties = new HashMap();
+ }
+ this.additionalProperties.put(key, value);
+ return this;
+ }
+
+ /**
+ * Return the additional (undeclared) property.
+ */
+ @JsonAnyGetter
+ public Map getAdditionalProperties() {
+ return additionalProperties;
+ }
+
+ /**
+ * Return the additional (undeclared) property with the specified name.
+ */
+ public JsonNode getAdditionalProperty(String key) {
+ if (this.additionalProperties == null) {
+ return null;
+ }
+ return this.additionalProperties.get(key);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ FulfillmentAvailableMethodResponse fulfillmentAvailableMethodResponse = (FulfillmentAvailableMethodResponse) o;
+ return Objects.equals(this.type, fulfillmentAvailableMethodResponse.type) &&
+ Objects.equals(this.lineItemIds, fulfillmentAvailableMethodResponse.lineItemIds) &&
+ equalsNullable(this.fulfillableOn, fulfillmentAvailableMethodResponse.fulfillableOn) &&
+ Objects.equals(this.description, fulfillmentAvailableMethodResponse.description) &&
+ Objects.equals(this.additionalProperties, fulfillmentAvailableMethodResponse.additionalProperties);
+ }
+
+ private static boolean equalsNullable(JsonNullable a, JsonNullable b) {
+ return a == b || (a != null && b != null && a.isPresent() && b.isPresent() && Objects.deepEquals(a.get(), b.get()));
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(type, lineItemIds, hashCodeNullable(fulfillableOn), description, additionalProperties);
+ }
+
+ private static int hashCodeNullable(JsonNullable a) {
+ if (a == null) {
+ return 1;
+ }
+ return a.isPresent() ? Arrays.deepHashCode(new Object[]{a.get()}) : 31;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class FulfillmentAvailableMethodResponse {\n");
+ sb.append(" type: ").append(toIndentedString(type)).append("\n");
+ sb.append(" lineItemIds: ").append(toIndentedString(lineItemIds)).append("\n");
+ sb.append(" fulfillableOn: ").append(toIndentedString(fulfillableOn)).append("\n");
+ sb.append(" description: ").append(toIndentedString(description)).append("\n");
+
+ sb.append(" additionalProperties: ").append(toIndentedString(additionalProperties)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private FulfillmentAvailableMethodResponse instance;
+
+ public Builder() {
+ this(new FulfillmentAvailableMethodResponse());
+ }
+
+ protected Builder(FulfillmentAvailableMethodResponse instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(FulfillmentAvailableMethodResponse value) {
+ this.instance.setType(value.type);
+ this.instance.setLineItemIds(value.lineItemIds);
+ this.instance.setFulfillableOn(value.fulfillableOn);
+ this.instance.setDescription(value.description);
+ return this;
+ }
+
+ public FulfillmentAvailableMethodResponse.Builder type(TypeEnum type) {
+ this.instance.type(type);
+ return this;
+ }
+
+ public FulfillmentAvailableMethodResponse.Builder lineItemIds(List lineItemIds) {
+ this.instance.lineItemIds(lineItemIds);
+ return this;
+ }
+
+ public FulfillmentAvailableMethodResponse.Builder fulfillableOn(String fulfillableOn) {
+ this.instance.fulfillableOn(fulfillableOn);
+ return this;
+ }
+
+ public FulfillmentAvailableMethodResponse.Builder fulfillableOn(JsonNullable fulfillableOn) {
+ this.instance.fulfillableOn = fulfillableOn;
+ return this;
+ }
+
+ public FulfillmentAvailableMethodResponse.Builder description(String description) {
+ this.instance.description(description);
+ return this;
+ }
+
+ public FulfillmentAvailableMethodResponse.Builder additionalProperties(Map additionalProperties) {
+ this.instance.additionalProperties = additionalProperties;
+ return this;
+ }
+
+ /**
+ * returns a built FulfillmentAvailableMethodResponse instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public FulfillmentAvailableMethodResponse build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static FulfillmentAvailableMethodResponse.Builder builder() {
+ return new FulfillmentAvailableMethodResponse.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public FulfillmentAvailableMethodResponse.Builder toBuilder() {
+ FulfillmentAvailableMethodResponse.Builder builder = new FulfillmentAvailableMethodResponse.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentDestinationRequest.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentDestinationRequest.java
new file mode 100644
index 0000000..9a16a9c
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentDestinationRequest.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.PostalAddress;
+import com.dev.ucp.service.shopping.model.RetailLocationRequest;
+import com.dev.ucp.service.shopping.model.ShippingDestinationRequest;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.databind.JsonNode;
+import org.springframework.lang.Nullable;
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+import java.util.Map;
+import java.util.HashMap;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:22.638361369Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public interface FulfillmentDestinationRequest {
+}
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentDestinationResponse.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentDestinationResponse.java
new file mode 100644
index 0000000..5b51eb9
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentDestinationResponse.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.PostalAddress;
+import com.dev.ucp.service.shopping.model.RetailLocationResponse;
+import com.dev.ucp.service.shopping.model.ShippingDestinationResponse;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.databind.JsonNode;
+import org.springframework.lang.Nullable;
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+import java.util.Map;
+import java.util.HashMap;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:22.638361369Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public interface FulfillmentDestinationResponse {
+}
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentEvent.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentEvent.java
new file mode 100644
index 0000000..a017396
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentEvent.java
@@ -0,0 +1,401 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.FulfillmentEventLineItemsInner;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import java.net.URI;
+import java.time.OffsetDateTime;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * Append-only fulfillment event representing an actual shipment. References line items by ID.
+ */
+
+@Schema(name = "Fulfillment_Event", description = "Append-only fulfillment event representing an actual shipment. References line items by ID.")
+@JsonTypeName("Fulfillment_Event")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class FulfillmentEvent {
+
+ private String id;
+
+ @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
+ private OffsetDateTime occurredAt;
+
+ private String type;
+
+ @Valid
+ private List<@Valid FulfillmentEventLineItemsInner> lineItems = new ArrayList<>();
+
+ private @Nullable String trackingNumber;
+
+ private @Nullable URI trackingUrl;
+
+ private @Nullable String carrier;
+
+ private @Nullable String description;
+
+ public FulfillmentEvent() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public FulfillmentEvent(String id, OffsetDateTime occurredAt, String type, List<@Valid FulfillmentEventLineItemsInner> lineItems) {
+ this.id = id;
+ this.occurredAt = occurredAt;
+ this.type = type;
+ this.lineItems = lineItems;
+ }
+
+ public FulfillmentEvent id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Fulfillment event identifier.
+ * @return id
+ */
+ @NotNull
+ @Schema(name = "id", description = "Fulfillment event identifier.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("id")
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public FulfillmentEvent occurredAt(OffsetDateTime occurredAt) {
+ this.occurredAt = occurredAt;
+ return this;
+ }
+
+ /**
+ * RFC 3339 timestamp when this fulfillment event occurred.
+ * @return occurredAt
+ */
+ @NotNull @Valid
+ @Schema(name = "occurred_at", description = "RFC 3339 timestamp when this fulfillment event occurred.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("occurred_at")
+ public OffsetDateTime getOccurredAt() {
+ return occurredAt;
+ }
+
+ public void setOccurredAt(OffsetDateTime occurredAt) {
+ this.occurredAt = occurredAt;
+ }
+
+ public FulfillmentEvent type(String type) {
+ this.type = type;
+ return this;
+ }
+
+ /**
+ * Fulfillment event type. Common values include: processing (preparing to ship), shipped (handed to carrier), in_transit (in delivery network), delivered (received by buyer), failed_attempt (delivery attempt failed), canceled (fulfillment canceled), undeliverable (cannot be delivered), returned_to_sender (returned to merchant).
+ * @return type
+ */
+ @NotNull
+ @Schema(name = "type", description = "Fulfillment event type. Common values include: processing (preparing to ship), shipped (handed to carrier), in_transit (in delivery network), delivered (received by buyer), failed_attempt (delivery attempt failed), canceled (fulfillment canceled), undeliverable (cannot be delivered), returned_to_sender (returned to merchant).", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("type")
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public FulfillmentEvent lineItems(List<@Valid FulfillmentEventLineItemsInner> lineItems) {
+ this.lineItems = lineItems;
+ return this;
+ }
+
+ public FulfillmentEvent addLineItemsItem(FulfillmentEventLineItemsInner lineItemsItem) {
+ if (this.lineItems == null) {
+ this.lineItems = new ArrayList<>();
+ }
+ this.lineItems.add(lineItemsItem);
+ return this;
+ }
+
+ /**
+ * Which line items and quantities are fulfilled in this event.
+ * @return lineItems
+ */
+ @NotNull @Valid
+ @Schema(name = "line_items", description = "Which line items and quantities are fulfilled in this event.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("line_items")
+ public List<@Valid FulfillmentEventLineItemsInner> getLineItems() {
+ return lineItems;
+ }
+
+ public void setLineItems(List<@Valid FulfillmentEventLineItemsInner> lineItems) {
+ this.lineItems = lineItems;
+ }
+
+ public FulfillmentEvent trackingNumber(@Nullable String trackingNumber) {
+ this.trackingNumber = trackingNumber;
+ return this;
+ }
+
+ /**
+ * Carrier tracking number (required if type != processing).
+ * @return trackingNumber
+ */
+
+ @Schema(name = "tracking_number", description = "Carrier tracking number (required if type != processing).", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("tracking_number")
+ public @Nullable String getTrackingNumber() {
+ return trackingNumber;
+ }
+
+ public void setTrackingNumber(@Nullable String trackingNumber) {
+ this.trackingNumber = trackingNumber;
+ }
+
+ public FulfillmentEvent trackingUrl(@Nullable URI trackingUrl) {
+ this.trackingUrl = trackingUrl;
+ return this;
+ }
+
+ /**
+ * URL to track this shipment (required if type != processing).
+ * @return trackingUrl
+ */
+ @Valid
+ @Schema(name = "tracking_url", description = "URL to track this shipment (required if type != processing).", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("tracking_url")
+ public @Nullable URI getTrackingUrl() {
+ return trackingUrl;
+ }
+
+ public void setTrackingUrl(@Nullable URI trackingUrl) {
+ this.trackingUrl = trackingUrl;
+ }
+
+ public FulfillmentEvent carrier(@Nullable String carrier) {
+ this.carrier = carrier;
+ return this;
+ }
+
+ /**
+ * Carrier name (e.g., 'FedEx', 'USPS').
+ * @return carrier
+ */
+
+ @Schema(name = "carrier", description = "Carrier name (e.g., 'FedEx', 'USPS').", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("carrier")
+ public @Nullable String getCarrier() {
+ return carrier;
+ }
+
+ public void setCarrier(@Nullable String carrier) {
+ this.carrier = carrier;
+ }
+
+ public FulfillmentEvent description(@Nullable String description) {
+ this.description = description;
+ return this;
+ }
+
+ /**
+ * Human-readable description of the shipment status or delivery information (e.g., 'Delivered to front door', 'Out for delivery').
+ * @return description
+ */
+
+ @Schema(name = "description", description = "Human-readable description of the shipment status or delivery information (e.g., 'Delivered to front door', 'Out for delivery').", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("description")
+ public @Nullable String getDescription() {
+ return description;
+ }
+
+ public void setDescription(@Nullable String description) {
+ this.description = description;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ FulfillmentEvent fulfillmentEvent = (FulfillmentEvent) o;
+ return Objects.equals(this.id, fulfillmentEvent.id) &&
+ Objects.equals(this.occurredAt, fulfillmentEvent.occurredAt) &&
+ Objects.equals(this.type, fulfillmentEvent.type) &&
+ Objects.equals(this.lineItems, fulfillmentEvent.lineItems) &&
+ Objects.equals(this.trackingNumber, fulfillmentEvent.trackingNumber) &&
+ Objects.equals(this.trackingUrl, fulfillmentEvent.trackingUrl) &&
+ Objects.equals(this.carrier, fulfillmentEvent.carrier) &&
+ Objects.equals(this.description, fulfillmentEvent.description);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, occurredAt, type, lineItems, trackingNumber, trackingUrl, carrier, description);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class FulfillmentEvent {\n");
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" occurredAt: ").append(toIndentedString(occurredAt)).append("\n");
+ sb.append(" type: ").append(toIndentedString(type)).append("\n");
+ sb.append(" lineItems: ").append(toIndentedString(lineItems)).append("\n");
+ sb.append(" trackingNumber: ").append(toIndentedString(trackingNumber)).append("\n");
+ sb.append(" trackingUrl: ").append(toIndentedString(trackingUrl)).append("\n");
+ sb.append(" carrier: ").append(toIndentedString(carrier)).append("\n");
+ sb.append(" description: ").append(toIndentedString(description)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private FulfillmentEvent instance;
+
+ public Builder() {
+ this(new FulfillmentEvent());
+ }
+
+ protected Builder(FulfillmentEvent instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(FulfillmentEvent value) {
+ this.instance.setId(value.id);
+ this.instance.setOccurredAt(value.occurredAt);
+ this.instance.setType(value.type);
+ this.instance.setLineItems(value.lineItems);
+ this.instance.setTrackingNumber(value.trackingNumber);
+ this.instance.setTrackingUrl(value.trackingUrl);
+ this.instance.setCarrier(value.carrier);
+ this.instance.setDescription(value.description);
+ return this;
+ }
+
+ public FulfillmentEvent.Builder id(String id) {
+ this.instance.id(id);
+ return this;
+ }
+
+ public FulfillmentEvent.Builder occurredAt(OffsetDateTime occurredAt) {
+ this.instance.occurredAt(occurredAt);
+ return this;
+ }
+
+ public FulfillmentEvent.Builder type(String type) {
+ this.instance.type(type);
+ return this;
+ }
+
+ public FulfillmentEvent.Builder lineItems(List lineItems) {
+ this.instance.lineItems(lineItems);
+ return this;
+ }
+
+ public FulfillmentEvent.Builder trackingNumber(String trackingNumber) {
+ this.instance.trackingNumber(trackingNumber);
+ return this;
+ }
+
+ public FulfillmentEvent.Builder trackingUrl(URI trackingUrl) {
+ this.instance.trackingUrl(trackingUrl);
+ return this;
+ }
+
+ public FulfillmentEvent.Builder carrier(String carrier) {
+ this.instance.carrier(carrier);
+ return this;
+ }
+
+ public FulfillmentEvent.Builder description(String description) {
+ this.instance.description(description);
+ return this;
+ }
+
+ /**
+ * returns a built FulfillmentEvent instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public FulfillmentEvent build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static FulfillmentEvent.Builder builder() {
+ return new FulfillmentEvent.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public FulfillmentEvent.Builder toBuilder() {
+ FulfillmentEvent.Builder builder = new FulfillmentEvent.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentEventLineItemsInner.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentEventLineItemsInner.java
new file mode 100644
index 0000000..865d1bf
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentEventLineItemsInner.java
@@ -0,0 +1,202 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * FulfillmentEventLineItemsInner
+ */
+
+@JsonTypeName("Fulfillment_Event_line_items_inner")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class FulfillmentEventLineItemsInner {
+
+ private String id;
+
+ private Integer quantity;
+
+ public FulfillmentEventLineItemsInner() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public FulfillmentEventLineItemsInner(String id, Integer quantity) {
+ this.id = id;
+ this.quantity = quantity;
+ }
+
+ public FulfillmentEventLineItemsInner id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Line item ID reference.
+ * @return id
+ */
+ @NotNull
+ @Schema(name = "id", description = "Line item ID reference.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("id")
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public FulfillmentEventLineItemsInner quantity(Integer quantity) {
+ this.quantity = quantity;
+ return this;
+ }
+
+ /**
+ * Quantity fulfilled in this event.
+ * minimum: 1
+ * @return quantity
+ */
+ @NotNull @Min(value = 1)
+ @Schema(name = "quantity", description = "Quantity fulfilled in this event.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("quantity")
+ public Integer getQuantity() {
+ return quantity;
+ }
+
+ public void setQuantity(Integer quantity) {
+ this.quantity = quantity;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ FulfillmentEventLineItemsInner fulfillmentEventLineItemsInner = (FulfillmentEventLineItemsInner) o;
+ return Objects.equals(this.id, fulfillmentEventLineItemsInner.id) &&
+ Objects.equals(this.quantity, fulfillmentEventLineItemsInner.quantity);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, quantity);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class FulfillmentEventLineItemsInner {\n");
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" quantity: ").append(toIndentedString(quantity)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private FulfillmentEventLineItemsInner instance;
+
+ public Builder() {
+ this(new FulfillmentEventLineItemsInner());
+ }
+
+ protected Builder(FulfillmentEventLineItemsInner instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(FulfillmentEventLineItemsInner value) {
+ this.instance.setId(value.id);
+ this.instance.setQuantity(value.quantity);
+ return this;
+ }
+
+ public FulfillmentEventLineItemsInner.Builder id(String id) {
+ this.instance.id(id);
+ return this;
+ }
+
+ public FulfillmentEventLineItemsInner.Builder quantity(Integer quantity) {
+ this.instance.quantity(quantity);
+ return this;
+ }
+
+ /**
+ * returns a built FulfillmentEventLineItemsInner instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public FulfillmentEventLineItemsInner build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static FulfillmentEventLineItemsInner.Builder builder() {
+ return new FulfillmentEventLineItemsInner.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public FulfillmentEventLineItemsInner.Builder toBuilder() {
+ FulfillmentEventLineItemsInner.Builder builder = new FulfillmentEventLineItemsInner.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentGroupCreateRequest.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentGroupCreateRequest.java
new file mode 100644
index 0000000..dc29e41
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentGroupCreateRequest.java
@@ -0,0 +1,229 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.databind.JsonNode;
+import java.util.Arrays;
+import org.openapitools.jackson.nullable.JsonNullable;
+import org.springframework.lang.Nullable;
+import java.util.NoSuchElementException;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+import java.util.Map;
+import java.util.HashMap;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+/**
+ * A merchant-generated package/group of line items with fulfillment options.
+ */
+
+@Schema(name = "Fulfillment_Group_Create_Request", description = "A merchant-generated package/group of line items with fulfillment options.")
+@JsonTypeName("Fulfillment_Group_Create_Request")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:22.638361369Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class FulfillmentGroupCreateRequest {
+
+ private JsonNullable selectedOptionId = JsonNullable.undefined();
+
+ public FulfillmentGroupCreateRequest selectedOptionId(String selectedOptionId) {
+ this.selectedOptionId = JsonNullable.of(selectedOptionId);
+ return this;
+ }
+
+ /**
+ * ID of the selected fulfillment option for this group.
+ * @return selectedOptionId
+ */
+
+ @Schema(name = "selected_option_id", description = "ID of the selected fulfillment option for this group.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("selected_option_id")
+ public JsonNullable getSelectedOptionId() {
+ return selectedOptionId;
+ }
+
+ public void setSelectedOptionId(JsonNullable selectedOptionId) {
+ this.selectedOptionId = selectedOptionId;
+ }
+ /**
+ * A container for additional, undeclared properties.
+ * This is a holder for any undeclared properties as specified with
+ * the 'additionalProperties' keyword in the OAS document.
+ */
+ private Map additionalProperties;
+
+ /**
+ * Set the additional (undeclared) property with the specified name and value.
+ * If the property does not already exist, create it otherwise replace it.
+ */
+ @JsonAnySetter
+ public FulfillmentGroupCreateRequest putAdditionalProperty(String key, JsonNode value) {
+ if (this.additionalProperties == null) {
+ this.additionalProperties = new HashMap();
+ }
+ this.additionalProperties.put(key, value);
+ return this;
+ }
+
+ /**
+ * Return the additional (undeclared) property.
+ */
+ @JsonAnyGetter
+ public Map getAdditionalProperties() {
+ return additionalProperties;
+ }
+
+ /**
+ * Return the additional (undeclared) property with the specified name.
+ */
+ public JsonNode getAdditionalProperty(String key) {
+ if (this.additionalProperties == null) {
+ return null;
+ }
+ return this.additionalProperties.get(key);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ FulfillmentGroupCreateRequest fulfillmentGroupCreateRequest = (FulfillmentGroupCreateRequest) o;
+ return equalsNullable(this.selectedOptionId, fulfillmentGroupCreateRequest.selectedOptionId) &&
+ Objects.equals(this.additionalProperties, fulfillmentGroupCreateRequest.additionalProperties);
+ }
+
+ private static boolean equalsNullable(JsonNullable a, JsonNullable b) {
+ return a == b || (a != null && b != null && a.isPresent() && b.isPresent() && Objects.deepEquals(a.get(), b.get()));
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(hashCodeNullable(selectedOptionId), additionalProperties);
+ }
+
+ private static int hashCodeNullable(JsonNullable a) {
+ if (a == null) {
+ return 1;
+ }
+ return a.isPresent() ? Arrays.deepHashCode(new Object[]{a.get()}) : 31;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class FulfillmentGroupCreateRequest {\n");
+ sb.append(" selectedOptionId: ").append(toIndentedString(selectedOptionId)).append("\n");
+
+ sb.append(" additionalProperties: ").append(toIndentedString(additionalProperties)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private FulfillmentGroupCreateRequest instance;
+
+ public Builder() {
+ this(new FulfillmentGroupCreateRequest());
+ }
+
+ protected Builder(FulfillmentGroupCreateRequest instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(FulfillmentGroupCreateRequest value) {
+ this.instance.setSelectedOptionId(value.selectedOptionId);
+ return this;
+ }
+
+ public FulfillmentGroupCreateRequest.Builder selectedOptionId(String selectedOptionId) {
+ this.instance.selectedOptionId(selectedOptionId);
+ return this;
+ }
+
+ public FulfillmentGroupCreateRequest.Builder selectedOptionId(JsonNullable selectedOptionId) {
+ this.instance.selectedOptionId = selectedOptionId;
+ return this;
+ }
+
+ public FulfillmentGroupCreateRequest.Builder additionalProperties(Map additionalProperties) {
+ this.instance.additionalProperties = additionalProperties;
+ return this;
+ }
+
+ /**
+ * returns a built FulfillmentGroupCreateRequest instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public FulfillmentGroupCreateRequest build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static FulfillmentGroupCreateRequest.Builder builder() {
+ return new FulfillmentGroupCreateRequest.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public FulfillmentGroupCreateRequest.Builder toBuilder() {
+ FulfillmentGroupCreateRequest.Builder builder = new FulfillmentGroupCreateRequest.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentGroupResponse.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentGroupResponse.java
new file mode 100644
index 0000000..4d0e41d
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentGroupResponse.java
@@ -0,0 +1,352 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.FulfillmentOptionResponse;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.databind.JsonNode;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.openapitools.jackson.nullable.JsonNullable;
+import org.springframework.lang.Nullable;
+import java.util.NoSuchElementException;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+import java.util.Map;
+import java.util.HashMap;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+/**
+ * A merchant-generated package/group of line items with fulfillment options.
+ */
+
+@Schema(name = "Fulfillment_Group_Response", description = "A merchant-generated package/group of line items with fulfillment options.")
+@JsonTypeName("Fulfillment_Group_Response")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:22.638361369Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class FulfillmentGroupResponse {
+
+ private String id;
+
+ @Valid
+ private List lineItemIds = new ArrayList<>();
+
+ @Valid
+ private List options = new ArrayList<>();
+
+ private JsonNullable selectedOptionId = JsonNullable.undefined();
+
+ public FulfillmentGroupResponse() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public FulfillmentGroupResponse(String id, List lineItemIds) {
+ this.id = id;
+ this.lineItemIds = lineItemIds;
+ }
+
+ public FulfillmentGroupResponse id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Group identifier for referencing merchant-generated groups in updates.
+ * @return id
+ */
+ @NotNull
+ @Schema(name = "id", description = "Group identifier for referencing merchant-generated groups in updates.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("id")
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public FulfillmentGroupResponse lineItemIds(List lineItemIds) {
+ this.lineItemIds = lineItemIds;
+ return this;
+ }
+
+ public FulfillmentGroupResponse addLineItemIdsItem(String lineItemIdsItem) {
+ if (this.lineItemIds == null) {
+ this.lineItemIds = new ArrayList<>();
+ }
+ this.lineItemIds.add(lineItemIdsItem);
+ return this;
+ }
+
+ /**
+ * Line item IDs included in this group/package.
+ * @return lineItemIds
+ */
+ @NotNull
+ @Schema(name = "line_item_ids", description = "Line item IDs included in this group/package.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("line_item_ids")
+ public List getLineItemIds() {
+ return lineItemIds;
+ }
+
+ public void setLineItemIds(List lineItemIds) {
+ this.lineItemIds = lineItemIds;
+ }
+
+ public FulfillmentGroupResponse options(List options) {
+ this.options = options;
+ return this;
+ }
+
+ public FulfillmentGroupResponse addOptionsItem(FulfillmentOptionResponse optionsItem) {
+ if (this.options == null) {
+ this.options = new ArrayList<>();
+ }
+ this.options.add(optionsItem);
+ return this;
+ }
+
+ /**
+ * Available fulfillment options for this group.
+ * @return options
+ */
+ @Valid
+ @Schema(name = "options", description = "Available fulfillment options for this group.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("options")
+ public List getOptions() {
+ return options;
+ }
+
+ public void setOptions(List options) {
+ this.options = options;
+ }
+
+ public FulfillmentGroupResponse selectedOptionId(String selectedOptionId) {
+ this.selectedOptionId = JsonNullable.of(selectedOptionId);
+ return this;
+ }
+
+ /**
+ * ID of the selected fulfillment option for this group.
+ * @return selectedOptionId
+ */
+
+ @Schema(name = "selected_option_id", description = "ID of the selected fulfillment option for this group.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("selected_option_id")
+ public JsonNullable getSelectedOptionId() {
+ return selectedOptionId;
+ }
+
+ public void setSelectedOptionId(JsonNullable selectedOptionId) {
+ this.selectedOptionId = selectedOptionId;
+ }
+ /**
+ * A container for additional, undeclared properties.
+ * This is a holder for any undeclared properties as specified with
+ * the 'additionalProperties' keyword in the OAS document.
+ */
+ private Map additionalProperties;
+
+ /**
+ * Set the additional (undeclared) property with the specified name and value.
+ * If the property does not already exist, create it otherwise replace it.
+ */
+ @JsonAnySetter
+ public FulfillmentGroupResponse putAdditionalProperty(String key, JsonNode value) {
+ if (this.additionalProperties == null) {
+ this.additionalProperties = new HashMap();
+ }
+ this.additionalProperties.put(key, value);
+ return this;
+ }
+
+ /**
+ * Return the additional (undeclared) property.
+ */
+ @JsonAnyGetter
+ public Map getAdditionalProperties() {
+ return additionalProperties;
+ }
+
+ /**
+ * Return the additional (undeclared) property with the specified name.
+ */
+ public JsonNode getAdditionalProperty(String key) {
+ if (this.additionalProperties == null) {
+ return null;
+ }
+ return this.additionalProperties.get(key);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ FulfillmentGroupResponse fulfillmentGroupResponse = (FulfillmentGroupResponse) o;
+ return Objects.equals(this.id, fulfillmentGroupResponse.id) &&
+ Objects.equals(this.lineItemIds, fulfillmentGroupResponse.lineItemIds) &&
+ Objects.equals(this.options, fulfillmentGroupResponse.options) &&
+ equalsNullable(this.selectedOptionId, fulfillmentGroupResponse.selectedOptionId) &&
+ Objects.equals(this.additionalProperties, fulfillmentGroupResponse.additionalProperties);
+ }
+
+ private static boolean equalsNullable(JsonNullable a, JsonNullable b) {
+ return a == b || (a != null && b != null && a.isPresent() && b.isPresent() && Objects.deepEquals(a.get(), b.get()));
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, lineItemIds, options, hashCodeNullable(selectedOptionId), additionalProperties);
+ }
+
+ private static int hashCodeNullable(JsonNullable a) {
+ if (a == null) {
+ return 1;
+ }
+ return a.isPresent() ? Arrays.deepHashCode(new Object[]{a.get()}) : 31;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class FulfillmentGroupResponse {\n");
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" lineItemIds: ").append(toIndentedString(lineItemIds)).append("\n");
+ sb.append(" options: ").append(toIndentedString(options)).append("\n");
+ sb.append(" selectedOptionId: ").append(toIndentedString(selectedOptionId)).append("\n");
+
+ sb.append(" additionalProperties: ").append(toIndentedString(additionalProperties)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private FulfillmentGroupResponse instance;
+
+ public Builder() {
+ this(new FulfillmentGroupResponse());
+ }
+
+ protected Builder(FulfillmentGroupResponse instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(FulfillmentGroupResponse value) {
+ this.instance.setId(value.id);
+ this.instance.setLineItemIds(value.lineItemIds);
+ this.instance.setOptions(value.options);
+ this.instance.setSelectedOptionId(value.selectedOptionId);
+ return this;
+ }
+
+ public FulfillmentGroupResponse.Builder id(String id) {
+ this.instance.id(id);
+ return this;
+ }
+
+ public FulfillmentGroupResponse.Builder lineItemIds(List lineItemIds) {
+ this.instance.lineItemIds(lineItemIds);
+ return this;
+ }
+
+ public FulfillmentGroupResponse.Builder options(List options) {
+ this.instance.options(options);
+ return this;
+ }
+
+ public FulfillmentGroupResponse.Builder selectedOptionId(String selectedOptionId) {
+ this.instance.selectedOptionId(selectedOptionId);
+ return this;
+ }
+
+ public FulfillmentGroupResponse.Builder selectedOptionId(JsonNullable selectedOptionId) {
+ this.instance.selectedOptionId = selectedOptionId;
+ return this;
+ }
+
+ public FulfillmentGroupResponse.Builder additionalProperties(Map additionalProperties) {
+ this.instance.additionalProperties = additionalProperties;
+ return this;
+ }
+
+ /**
+ * returns a built FulfillmentGroupResponse instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public FulfillmentGroupResponse build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static FulfillmentGroupResponse.Builder builder() {
+ return new FulfillmentGroupResponse.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public FulfillmentGroupResponse.Builder toBuilder() {
+ FulfillmentGroupResponse.Builder builder = new FulfillmentGroupResponse.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentMethodCreateRequest.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentMethodCreateRequest.java
new file mode 100644
index 0000000..29714e3
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentMethodCreateRequest.java
@@ -0,0 +1,427 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.FulfillmentDestinationRequest;
+import com.dev.ucp.service.shopping.model.FulfillmentGroupCreateRequest;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import com.fasterxml.jackson.databind.JsonNode;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.openapitools.jackson.nullable.JsonNullable;
+import org.springframework.lang.Nullable;
+import java.util.NoSuchElementException;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+import java.util.Map;
+import java.util.HashMap;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+/**
+ * A fulfillment method (shipping or pickup) with destinations and groups.
+ */
+
+@Schema(name = "Fulfillment_Method_Create_Request", description = "A fulfillment method (shipping or pickup) with destinations and groups.")
+@JsonTypeName("Fulfillment_Method_Create_Request")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:22.638361369Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class FulfillmentMethodCreateRequest {
+
+ /**
+ * Fulfillment method type.
+ */
+ public enum TypeEnum {
+ SHIPPING("shipping"),
+
+ PICKUP("pickup");
+
+ private final String value;
+
+ TypeEnum(String value) {
+ this.value = value;
+ }
+
+ @JsonValue
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+ @JsonCreator
+ public static TypeEnum fromValue(String value) {
+ for (TypeEnum b : TypeEnum.values()) {
+ if (b.value.equals(value)) {
+ return b;
+ }
+ }
+ throw new IllegalArgumentException("Unexpected value '" + value + "'");
+ }
+ }
+
+ private TypeEnum type;
+
+ @Valid
+ private List lineItemIds = new ArrayList<>();
+
+ @Valid
+ private List<@Valid FulfillmentDestinationRequest> destinations = new ArrayList<>();
+
+ private JsonNullable selectedDestinationId = JsonNullable.undefined();
+
+ @Valid
+ private List groups = new ArrayList<>();
+
+ public FulfillmentMethodCreateRequest() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public FulfillmentMethodCreateRequest(TypeEnum type) {
+ this.type = type;
+ }
+
+ public FulfillmentMethodCreateRequest type(TypeEnum type) {
+ this.type = type;
+ return this;
+ }
+
+ /**
+ * Fulfillment method type.
+ * @return type
+ */
+ @NotNull
+ @Schema(name = "type", description = "Fulfillment method type.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("type")
+ public TypeEnum getType() {
+ return type;
+ }
+
+ public void setType(TypeEnum type) {
+ this.type = type;
+ }
+
+ public FulfillmentMethodCreateRequest lineItemIds(List lineItemIds) {
+ this.lineItemIds = lineItemIds;
+ return this;
+ }
+
+ public FulfillmentMethodCreateRequest addLineItemIdsItem(String lineItemIdsItem) {
+ if (this.lineItemIds == null) {
+ this.lineItemIds = new ArrayList<>();
+ }
+ this.lineItemIds.add(lineItemIdsItem);
+ return this;
+ }
+
+ /**
+ * Line item IDs fulfilled via this method.
+ * @return lineItemIds
+ */
+
+ @Schema(name = "line_item_ids", description = "Line item IDs fulfilled via this method.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("line_item_ids")
+ public List getLineItemIds() {
+ return lineItemIds;
+ }
+
+ public void setLineItemIds(List lineItemIds) {
+ this.lineItemIds = lineItemIds;
+ }
+
+ public FulfillmentMethodCreateRequest destinations(List<@Valid FulfillmentDestinationRequest> destinations) {
+ this.destinations = destinations;
+ return this;
+ }
+
+ public FulfillmentMethodCreateRequest addDestinationsItem(FulfillmentDestinationRequest destinationsItem) {
+ if (this.destinations == null) {
+ this.destinations = new ArrayList<>();
+ }
+ this.destinations.add(destinationsItem);
+ return this;
+ }
+
+ /**
+ * Available destinations. For shipping: addresses. For pickup: retail locations.
+ * @return destinations
+ */
+ @Valid
+ @Schema(name = "destinations", description = "Available destinations. For shipping: addresses. For pickup: retail locations.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("destinations")
+ public List<@Valid FulfillmentDestinationRequest> getDestinations() {
+ return destinations;
+ }
+
+ public void setDestinations(List<@Valid FulfillmentDestinationRequest> destinations) {
+ this.destinations = destinations;
+ }
+
+ public FulfillmentMethodCreateRequest selectedDestinationId(String selectedDestinationId) {
+ this.selectedDestinationId = JsonNullable.of(selectedDestinationId);
+ return this;
+ }
+
+ /**
+ * ID of the selected destination.
+ * @return selectedDestinationId
+ */
+
+ @Schema(name = "selected_destination_id", description = "ID of the selected destination.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("selected_destination_id")
+ public JsonNullable getSelectedDestinationId() {
+ return selectedDestinationId;
+ }
+
+ public void setSelectedDestinationId(JsonNullable selectedDestinationId) {
+ this.selectedDestinationId = selectedDestinationId;
+ }
+
+ public FulfillmentMethodCreateRequest groups(List groups) {
+ this.groups = groups;
+ return this;
+ }
+
+ public FulfillmentMethodCreateRequest addGroupsItem(FulfillmentGroupCreateRequest groupsItem) {
+ if (this.groups == null) {
+ this.groups = new ArrayList<>();
+ }
+ this.groups.add(groupsItem);
+ return this;
+ }
+
+ /**
+ * Fulfillment groups for selecting options. Agent sets selected_option_id on groups to choose shipping method.
+ * @return groups
+ */
+ @Valid
+ @Schema(name = "groups", description = "Fulfillment groups for selecting options. Agent sets selected_option_id on groups to choose shipping method.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("groups")
+ public List getGroups() {
+ return groups;
+ }
+
+ public void setGroups(List groups) {
+ this.groups = groups;
+ }
+ /**
+ * A container for additional, undeclared properties.
+ * This is a holder for any undeclared properties as specified with
+ * the 'additionalProperties' keyword in the OAS document.
+ */
+ private Map additionalProperties;
+
+ /**
+ * Set the additional (undeclared) property with the specified name and value.
+ * If the property does not already exist, create it otherwise replace it.
+ */
+ @JsonAnySetter
+ public FulfillmentMethodCreateRequest putAdditionalProperty(String key, JsonNode value) {
+ if (this.additionalProperties == null) {
+ this.additionalProperties = new HashMap();
+ }
+ this.additionalProperties.put(key, value);
+ return this;
+ }
+
+ /**
+ * Return the additional (undeclared) property.
+ */
+ @JsonAnyGetter
+ public Map getAdditionalProperties() {
+ return additionalProperties;
+ }
+
+ /**
+ * Return the additional (undeclared) property with the specified name.
+ */
+ public JsonNode getAdditionalProperty(String key) {
+ if (this.additionalProperties == null) {
+ return null;
+ }
+ return this.additionalProperties.get(key);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ FulfillmentMethodCreateRequest fulfillmentMethodCreateRequest = (FulfillmentMethodCreateRequest) o;
+ return Objects.equals(this.type, fulfillmentMethodCreateRequest.type) &&
+ Objects.equals(this.lineItemIds, fulfillmentMethodCreateRequest.lineItemIds) &&
+ Objects.equals(this.destinations, fulfillmentMethodCreateRequest.destinations) &&
+ equalsNullable(this.selectedDestinationId, fulfillmentMethodCreateRequest.selectedDestinationId) &&
+ Objects.equals(this.groups, fulfillmentMethodCreateRequest.groups) &&
+ Objects.equals(this.additionalProperties, fulfillmentMethodCreateRequest.additionalProperties);
+ }
+
+ private static boolean equalsNullable(JsonNullable a, JsonNullable b) {
+ return a == b || (a != null && b != null && a.isPresent() && b.isPresent() && Objects.deepEquals(a.get(), b.get()));
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(type, lineItemIds, destinations, hashCodeNullable(selectedDestinationId), groups, additionalProperties);
+ }
+
+ private static int hashCodeNullable(JsonNullable a) {
+ if (a == null) {
+ return 1;
+ }
+ return a.isPresent() ? Arrays.deepHashCode(new Object[]{a.get()}) : 31;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class FulfillmentMethodCreateRequest {\n");
+ sb.append(" type: ").append(toIndentedString(type)).append("\n");
+ sb.append(" lineItemIds: ").append(toIndentedString(lineItemIds)).append("\n");
+ sb.append(" destinations: ").append(toIndentedString(destinations)).append("\n");
+ sb.append(" selectedDestinationId: ").append(toIndentedString(selectedDestinationId)).append("\n");
+ sb.append(" groups: ").append(toIndentedString(groups)).append("\n");
+
+ sb.append(" additionalProperties: ").append(toIndentedString(additionalProperties)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private FulfillmentMethodCreateRequest instance;
+
+ public Builder() {
+ this(new FulfillmentMethodCreateRequest());
+ }
+
+ protected Builder(FulfillmentMethodCreateRequest instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(FulfillmentMethodCreateRequest value) {
+ this.instance.setType(value.type);
+ this.instance.setLineItemIds(value.lineItemIds);
+ this.instance.setDestinations(value.destinations);
+ this.instance.setSelectedDestinationId(value.selectedDestinationId);
+ this.instance.setGroups(value.groups);
+ return this;
+ }
+
+ public FulfillmentMethodCreateRequest.Builder type(TypeEnum type) {
+ this.instance.type(type);
+ return this;
+ }
+
+ public FulfillmentMethodCreateRequest.Builder lineItemIds(List lineItemIds) {
+ this.instance.lineItemIds(lineItemIds);
+ return this;
+ }
+
+ public FulfillmentMethodCreateRequest.Builder destinations(List destinations) {
+ this.instance.destinations(destinations);
+ return this;
+ }
+
+ public FulfillmentMethodCreateRequest.Builder selectedDestinationId(String selectedDestinationId) {
+ this.instance.selectedDestinationId(selectedDestinationId);
+ return this;
+ }
+
+ public FulfillmentMethodCreateRequest.Builder selectedDestinationId(JsonNullable selectedDestinationId) {
+ this.instance.selectedDestinationId = selectedDestinationId;
+ return this;
+ }
+
+ public FulfillmentMethodCreateRequest.Builder groups(List groups) {
+ this.instance.groups(groups);
+ return this;
+ }
+
+ public FulfillmentMethodCreateRequest.Builder additionalProperties(Map additionalProperties) {
+ this.instance.additionalProperties = additionalProperties;
+ return this;
+ }
+
+ /**
+ * returns a built FulfillmentMethodCreateRequest instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public FulfillmentMethodCreateRequest build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static FulfillmentMethodCreateRequest.Builder builder() {
+ return new FulfillmentMethodCreateRequest.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public FulfillmentMethodCreateRequest.Builder toBuilder() {
+ FulfillmentMethodCreateRequest.Builder builder = new FulfillmentMethodCreateRequest.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentMethodResponse.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentMethodResponse.java
new file mode 100644
index 0000000..4ccde5a
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentMethodResponse.java
@@ -0,0 +1,459 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.FulfillmentDestinationResponse;
+import com.dev.ucp.service.shopping.model.FulfillmentGroupResponse;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import com.fasterxml.jackson.databind.JsonNode;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.openapitools.jackson.nullable.JsonNullable;
+import org.springframework.lang.Nullable;
+import java.util.NoSuchElementException;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+import java.util.Map;
+import java.util.HashMap;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+/**
+ * A fulfillment method (shipping or pickup) with destinations and groups.
+ */
+
+@Schema(name = "Fulfillment_Method_Response", description = "A fulfillment method (shipping or pickup) with destinations and groups.")
+@JsonTypeName("Fulfillment_Method_Response")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:22.638361369Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class FulfillmentMethodResponse {
+
+ private String id;
+
+ /**
+ * Fulfillment method type.
+ */
+ public enum TypeEnum {
+ SHIPPING("shipping"),
+
+ PICKUP("pickup");
+
+ private final String value;
+
+ TypeEnum(String value) {
+ this.value = value;
+ }
+
+ @JsonValue
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+ @JsonCreator
+ public static TypeEnum fromValue(String value) {
+ for (TypeEnum b : TypeEnum.values()) {
+ if (b.value.equals(value)) {
+ return b;
+ }
+ }
+ throw new IllegalArgumentException("Unexpected value '" + value + "'");
+ }
+ }
+
+ private TypeEnum type;
+
+ @Valid
+ private List lineItemIds = new ArrayList<>();
+
+ @Valid
+ private List<@Valid FulfillmentDestinationResponse> destinations = new ArrayList<>();
+
+ private JsonNullable selectedDestinationId = JsonNullable.undefined();
+
+ @Valid
+ private List groups = new ArrayList<>();
+
+ public FulfillmentMethodResponse() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public FulfillmentMethodResponse(String id, TypeEnum type, List lineItemIds) {
+ this.id = id;
+ this.type = type;
+ this.lineItemIds = lineItemIds;
+ }
+
+ public FulfillmentMethodResponse id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Unique fulfillment method identifier.
+ * @return id
+ */
+ @NotNull
+ @Schema(name = "id", description = "Unique fulfillment method identifier.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("id")
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public FulfillmentMethodResponse type(TypeEnum type) {
+ this.type = type;
+ return this;
+ }
+
+ /**
+ * Fulfillment method type.
+ * @return type
+ */
+ @NotNull
+ @Schema(name = "type", description = "Fulfillment method type.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("type")
+ public TypeEnum getType() {
+ return type;
+ }
+
+ public void setType(TypeEnum type) {
+ this.type = type;
+ }
+
+ public FulfillmentMethodResponse lineItemIds(List lineItemIds) {
+ this.lineItemIds = lineItemIds;
+ return this;
+ }
+
+ public FulfillmentMethodResponse addLineItemIdsItem(String lineItemIdsItem) {
+ if (this.lineItemIds == null) {
+ this.lineItemIds = new ArrayList<>();
+ }
+ this.lineItemIds.add(lineItemIdsItem);
+ return this;
+ }
+
+ /**
+ * Line item IDs fulfilled via this method.
+ * @return lineItemIds
+ */
+ @NotNull
+ @Schema(name = "line_item_ids", description = "Line item IDs fulfilled via this method.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("line_item_ids")
+ public List getLineItemIds() {
+ return lineItemIds;
+ }
+
+ public void setLineItemIds(List lineItemIds) {
+ this.lineItemIds = lineItemIds;
+ }
+
+ public FulfillmentMethodResponse destinations(List<@Valid FulfillmentDestinationResponse> destinations) {
+ this.destinations = destinations;
+ return this;
+ }
+
+ public FulfillmentMethodResponse addDestinationsItem(FulfillmentDestinationResponse destinationsItem) {
+ if (this.destinations == null) {
+ this.destinations = new ArrayList<>();
+ }
+ this.destinations.add(destinationsItem);
+ return this;
+ }
+
+ /**
+ * Available destinations. For shipping: addresses. For pickup: retail locations.
+ * @return destinations
+ */
+ @Valid
+ @Schema(name = "destinations", description = "Available destinations. For shipping: addresses. For pickup: retail locations.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("destinations")
+ public List<@Valid FulfillmentDestinationResponse> getDestinations() {
+ return destinations;
+ }
+
+ public void setDestinations(List<@Valid FulfillmentDestinationResponse> destinations) {
+ this.destinations = destinations;
+ }
+
+ public FulfillmentMethodResponse selectedDestinationId(String selectedDestinationId) {
+ this.selectedDestinationId = JsonNullable.of(selectedDestinationId);
+ return this;
+ }
+
+ /**
+ * ID of the selected destination.
+ * @return selectedDestinationId
+ */
+
+ @Schema(name = "selected_destination_id", description = "ID of the selected destination.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("selected_destination_id")
+ public JsonNullable getSelectedDestinationId() {
+ return selectedDestinationId;
+ }
+
+ public void setSelectedDestinationId(JsonNullable selectedDestinationId) {
+ this.selectedDestinationId = selectedDestinationId;
+ }
+
+ public FulfillmentMethodResponse groups(List groups) {
+ this.groups = groups;
+ return this;
+ }
+
+ public FulfillmentMethodResponse addGroupsItem(FulfillmentGroupResponse groupsItem) {
+ if (this.groups == null) {
+ this.groups = new ArrayList<>();
+ }
+ this.groups.add(groupsItem);
+ return this;
+ }
+
+ /**
+ * Fulfillment groups for selecting options. Agent sets selected_option_id on groups to choose shipping method.
+ * @return groups
+ */
+ @Valid
+ @Schema(name = "groups", description = "Fulfillment groups for selecting options. Agent sets selected_option_id on groups to choose shipping method.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("groups")
+ public List getGroups() {
+ return groups;
+ }
+
+ public void setGroups(List groups) {
+ this.groups = groups;
+ }
+ /**
+ * A container for additional, undeclared properties.
+ * This is a holder for any undeclared properties as specified with
+ * the 'additionalProperties' keyword in the OAS document.
+ */
+ private Map additionalProperties;
+
+ /**
+ * Set the additional (undeclared) property with the specified name and value.
+ * If the property does not already exist, create it otherwise replace it.
+ */
+ @JsonAnySetter
+ public FulfillmentMethodResponse putAdditionalProperty(String key, JsonNode value) {
+ if (this.additionalProperties == null) {
+ this.additionalProperties = new HashMap();
+ }
+ this.additionalProperties.put(key, value);
+ return this;
+ }
+
+ /**
+ * Return the additional (undeclared) property.
+ */
+ @JsonAnyGetter
+ public Map getAdditionalProperties() {
+ return additionalProperties;
+ }
+
+ /**
+ * Return the additional (undeclared) property with the specified name.
+ */
+ public JsonNode getAdditionalProperty(String key) {
+ if (this.additionalProperties == null) {
+ return null;
+ }
+ return this.additionalProperties.get(key);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ FulfillmentMethodResponse fulfillmentMethodResponse = (FulfillmentMethodResponse) o;
+ return Objects.equals(this.id, fulfillmentMethodResponse.id) &&
+ Objects.equals(this.type, fulfillmentMethodResponse.type) &&
+ Objects.equals(this.lineItemIds, fulfillmentMethodResponse.lineItemIds) &&
+ Objects.equals(this.destinations, fulfillmentMethodResponse.destinations) &&
+ equalsNullable(this.selectedDestinationId, fulfillmentMethodResponse.selectedDestinationId) &&
+ Objects.equals(this.groups, fulfillmentMethodResponse.groups) &&
+ Objects.equals(this.additionalProperties, fulfillmentMethodResponse.additionalProperties);
+ }
+
+ private static boolean equalsNullable(JsonNullable a, JsonNullable b) {
+ return a == b || (a != null && b != null && a.isPresent() && b.isPresent() && Objects.deepEquals(a.get(), b.get()));
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, type, lineItemIds, destinations, hashCodeNullable(selectedDestinationId), groups, additionalProperties);
+ }
+
+ private static int hashCodeNullable(JsonNullable a) {
+ if (a == null) {
+ return 1;
+ }
+ return a.isPresent() ? Arrays.deepHashCode(new Object[]{a.get()}) : 31;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class FulfillmentMethodResponse {\n");
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" type: ").append(toIndentedString(type)).append("\n");
+ sb.append(" lineItemIds: ").append(toIndentedString(lineItemIds)).append("\n");
+ sb.append(" destinations: ").append(toIndentedString(destinations)).append("\n");
+ sb.append(" selectedDestinationId: ").append(toIndentedString(selectedDestinationId)).append("\n");
+ sb.append(" groups: ").append(toIndentedString(groups)).append("\n");
+
+ sb.append(" additionalProperties: ").append(toIndentedString(additionalProperties)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private FulfillmentMethodResponse instance;
+
+ public Builder() {
+ this(new FulfillmentMethodResponse());
+ }
+
+ protected Builder(FulfillmentMethodResponse instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(FulfillmentMethodResponse value) {
+ this.instance.setId(value.id);
+ this.instance.setType(value.type);
+ this.instance.setLineItemIds(value.lineItemIds);
+ this.instance.setDestinations(value.destinations);
+ this.instance.setSelectedDestinationId(value.selectedDestinationId);
+ this.instance.setGroups(value.groups);
+ return this;
+ }
+
+ public FulfillmentMethodResponse.Builder id(String id) {
+ this.instance.id(id);
+ return this;
+ }
+
+ public FulfillmentMethodResponse.Builder type(TypeEnum type) {
+ this.instance.type(type);
+ return this;
+ }
+
+ public FulfillmentMethodResponse.Builder lineItemIds(List lineItemIds) {
+ this.instance.lineItemIds(lineItemIds);
+ return this;
+ }
+
+ public FulfillmentMethodResponse.Builder destinations(List destinations) {
+ this.instance.destinations(destinations);
+ return this;
+ }
+
+ public FulfillmentMethodResponse.Builder selectedDestinationId(String selectedDestinationId) {
+ this.instance.selectedDestinationId(selectedDestinationId);
+ return this;
+ }
+
+ public FulfillmentMethodResponse.Builder selectedDestinationId(JsonNullable selectedDestinationId) {
+ this.instance.selectedDestinationId = selectedDestinationId;
+ return this;
+ }
+
+ public FulfillmentMethodResponse.Builder groups(List groups) {
+ this.instance.groups(groups);
+ return this;
+ }
+
+ public FulfillmentMethodResponse.Builder additionalProperties(Map additionalProperties) {
+ this.instance.additionalProperties = additionalProperties;
+ return this;
+ }
+
+ /**
+ * returns a built FulfillmentMethodResponse instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public FulfillmentMethodResponse build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static FulfillmentMethodResponse.Builder builder() {
+ return new FulfillmentMethodResponse.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public FulfillmentMethodResponse.Builder toBuilder() {
+ FulfillmentMethodResponse.Builder builder = new FulfillmentMethodResponse.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentOptionResponse.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentOptionResponse.java
new file mode 100644
index 0000000..59e6b5e
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentOptionResponse.java
@@ -0,0 +1,420 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.TotalResponse;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.databind.JsonNode;
+import java.time.OffsetDateTime;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+import java.util.Map;
+import java.util.HashMap;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+/**
+ * A fulfillment option within a group (e.g., Standard Shipping $5, Express $15).
+ */
+
+@Schema(name = "Fulfillment_Option_Response", description = "A fulfillment option within a group (e.g., Standard Shipping $5, Express $15).")
+@JsonTypeName("Fulfillment_Option_Response")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:22.638361369Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class FulfillmentOptionResponse {
+
+ private String id;
+
+ private String title;
+
+ private @Nullable String description;
+
+ private @Nullable String carrier;
+
+ @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
+ private @Nullable OffsetDateTime earliestFulfillmentTime;
+
+ @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
+ private @Nullable OffsetDateTime latestFulfillmentTime;
+
+ @Valid
+ private List<@Valid TotalResponse> totals = new ArrayList<>();
+
+ public FulfillmentOptionResponse() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public FulfillmentOptionResponse(String id, String title, List<@Valid TotalResponse> totals) {
+ this.id = id;
+ this.title = title;
+ this.totals = totals;
+ }
+
+ public FulfillmentOptionResponse id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Unique fulfillment option identifier.
+ * @return id
+ */
+ @NotNull
+ @Schema(name = "id", description = "Unique fulfillment option identifier.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("id")
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public FulfillmentOptionResponse title(String title) {
+ this.title = title;
+ return this;
+ }
+
+ /**
+ * Short label (e.g., 'Express Shipping', 'Curbside Pickup').
+ * @return title
+ */
+ @NotNull
+ @Schema(name = "title", description = "Short label (e.g., 'Express Shipping', 'Curbside Pickup').", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("title")
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public FulfillmentOptionResponse description(@Nullable String description) {
+ this.description = description;
+ return this;
+ }
+
+ /**
+ * Complete context for buyer decision (e.g., 'Arrives Dec 12-15 via FedEx').
+ * @return description
+ */
+
+ @Schema(name = "description", description = "Complete context for buyer decision (e.g., 'Arrives Dec 12-15 via FedEx').", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("description")
+ public @Nullable String getDescription() {
+ return description;
+ }
+
+ public void setDescription(@Nullable String description) {
+ this.description = description;
+ }
+
+ public FulfillmentOptionResponse carrier(@Nullable String carrier) {
+ this.carrier = carrier;
+ return this;
+ }
+
+ /**
+ * Carrier name (for shipping).
+ * @return carrier
+ */
+
+ @Schema(name = "carrier", description = "Carrier name (for shipping).", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("carrier")
+ public @Nullable String getCarrier() {
+ return carrier;
+ }
+
+ public void setCarrier(@Nullable String carrier) {
+ this.carrier = carrier;
+ }
+
+ public FulfillmentOptionResponse earliestFulfillmentTime(@Nullable OffsetDateTime earliestFulfillmentTime) {
+ this.earliestFulfillmentTime = earliestFulfillmentTime;
+ return this;
+ }
+
+ /**
+ * Earliest fulfillment date.
+ * @return earliestFulfillmentTime
+ */
+ @Valid
+ @Schema(name = "earliest_fulfillment_time", description = "Earliest fulfillment date.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("earliest_fulfillment_time")
+ public @Nullable OffsetDateTime getEarliestFulfillmentTime() {
+ return earliestFulfillmentTime;
+ }
+
+ public void setEarliestFulfillmentTime(@Nullable OffsetDateTime earliestFulfillmentTime) {
+ this.earliestFulfillmentTime = earliestFulfillmentTime;
+ }
+
+ public FulfillmentOptionResponse latestFulfillmentTime(@Nullable OffsetDateTime latestFulfillmentTime) {
+ this.latestFulfillmentTime = latestFulfillmentTime;
+ return this;
+ }
+
+ /**
+ * Latest fulfillment date.
+ * @return latestFulfillmentTime
+ */
+ @Valid
+ @Schema(name = "latest_fulfillment_time", description = "Latest fulfillment date.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("latest_fulfillment_time")
+ public @Nullable OffsetDateTime getLatestFulfillmentTime() {
+ return latestFulfillmentTime;
+ }
+
+ public void setLatestFulfillmentTime(@Nullable OffsetDateTime latestFulfillmentTime) {
+ this.latestFulfillmentTime = latestFulfillmentTime;
+ }
+
+ public FulfillmentOptionResponse totals(List<@Valid TotalResponse> totals) {
+ this.totals = totals;
+ return this;
+ }
+
+ public FulfillmentOptionResponse addTotalsItem(TotalResponse totalsItem) {
+ if (this.totals == null) {
+ this.totals = new ArrayList<>();
+ }
+ this.totals.add(totalsItem);
+ return this;
+ }
+
+ /**
+ * Fulfillment option totals breakdown.
+ * @return totals
+ */
+ @NotNull @Valid
+ @Schema(name = "totals", description = "Fulfillment option totals breakdown.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("totals")
+ public List<@Valid TotalResponse> getTotals() {
+ return totals;
+ }
+
+ public void setTotals(List<@Valid TotalResponse> totals) {
+ this.totals = totals;
+ }
+ /**
+ * A container for additional, undeclared properties.
+ * This is a holder for any undeclared properties as specified with
+ * the 'additionalProperties' keyword in the OAS document.
+ */
+ private Map additionalProperties;
+
+ /**
+ * Set the additional (undeclared) property with the specified name and value.
+ * If the property does not already exist, create it otherwise replace it.
+ */
+ @JsonAnySetter
+ public FulfillmentOptionResponse putAdditionalProperty(String key, JsonNode value) {
+ if (this.additionalProperties == null) {
+ this.additionalProperties = new HashMap();
+ }
+ this.additionalProperties.put(key, value);
+ return this;
+ }
+
+ /**
+ * Return the additional (undeclared) property.
+ */
+ @JsonAnyGetter
+ public Map getAdditionalProperties() {
+ return additionalProperties;
+ }
+
+ /**
+ * Return the additional (undeclared) property with the specified name.
+ */
+ public JsonNode getAdditionalProperty(String key) {
+ if (this.additionalProperties == null) {
+ return null;
+ }
+ return this.additionalProperties.get(key);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ FulfillmentOptionResponse fulfillmentOptionResponse = (FulfillmentOptionResponse) o;
+ return Objects.equals(this.id, fulfillmentOptionResponse.id) &&
+ Objects.equals(this.title, fulfillmentOptionResponse.title) &&
+ Objects.equals(this.description, fulfillmentOptionResponse.description) &&
+ Objects.equals(this.carrier, fulfillmentOptionResponse.carrier) &&
+ Objects.equals(this.earliestFulfillmentTime, fulfillmentOptionResponse.earliestFulfillmentTime) &&
+ Objects.equals(this.latestFulfillmentTime, fulfillmentOptionResponse.latestFulfillmentTime) &&
+ Objects.equals(this.totals, fulfillmentOptionResponse.totals) &&
+ Objects.equals(this.additionalProperties, fulfillmentOptionResponse.additionalProperties);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, title, description, carrier, earliestFulfillmentTime, latestFulfillmentTime, totals, additionalProperties);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class FulfillmentOptionResponse {\n");
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" title: ").append(toIndentedString(title)).append("\n");
+ sb.append(" description: ").append(toIndentedString(description)).append("\n");
+ sb.append(" carrier: ").append(toIndentedString(carrier)).append("\n");
+ sb.append(" earliestFulfillmentTime: ").append(toIndentedString(earliestFulfillmentTime)).append("\n");
+ sb.append(" latestFulfillmentTime: ").append(toIndentedString(latestFulfillmentTime)).append("\n");
+ sb.append(" totals: ").append(toIndentedString(totals)).append("\n");
+
+ sb.append(" additionalProperties: ").append(toIndentedString(additionalProperties)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private FulfillmentOptionResponse instance;
+
+ public Builder() {
+ this(new FulfillmentOptionResponse());
+ }
+
+ protected Builder(FulfillmentOptionResponse instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(FulfillmentOptionResponse value) {
+ this.instance.setId(value.id);
+ this.instance.setTitle(value.title);
+ this.instance.setDescription(value.description);
+ this.instance.setCarrier(value.carrier);
+ this.instance.setEarliestFulfillmentTime(value.earliestFulfillmentTime);
+ this.instance.setLatestFulfillmentTime(value.latestFulfillmentTime);
+ this.instance.setTotals(value.totals);
+ return this;
+ }
+
+ public FulfillmentOptionResponse.Builder id(String id) {
+ this.instance.id(id);
+ return this;
+ }
+
+ public FulfillmentOptionResponse.Builder title(String title) {
+ this.instance.title(title);
+ return this;
+ }
+
+ public FulfillmentOptionResponse.Builder description(String description) {
+ this.instance.description(description);
+ return this;
+ }
+
+ public FulfillmentOptionResponse.Builder carrier(String carrier) {
+ this.instance.carrier(carrier);
+ return this;
+ }
+
+ public FulfillmentOptionResponse.Builder earliestFulfillmentTime(OffsetDateTime earliestFulfillmentTime) {
+ this.instance.earliestFulfillmentTime(earliestFulfillmentTime);
+ return this;
+ }
+
+ public FulfillmentOptionResponse.Builder latestFulfillmentTime(OffsetDateTime latestFulfillmentTime) {
+ this.instance.latestFulfillmentTime(latestFulfillmentTime);
+ return this;
+ }
+
+ public FulfillmentOptionResponse.Builder totals(List totals) {
+ this.instance.totals(totals);
+ return this;
+ }
+
+ public FulfillmentOptionResponse.Builder additionalProperties(Map additionalProperties) {
+ this.instance.additionalProperties = additionalProperties;
+ return this;
+ }
+
+ /**
+ * returns a built FulfillmentOptionResponse instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public FulfillmentOptionResponse build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static FulfillmentOptionResponse.Builder builder() {
+ return new FulfillmentOptionResponse.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public FulfillmentOptionResponse.Builder toBuilder() {
+ FulfillmentOptionResponse.Builder builder = new FulfillmentOptionResponse.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentRequest.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentRequest.java
new file mode 100644
index 0000000..3c9bfa0
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentRequest.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.FulfillmentMethodCreateRequest;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * Container for fulfillment methods and availability.
+ */
+
+@Schema(name = "fulfillment_request", description = "Container for fulfillment methods and availability.")
+@JsonTypeName("fulfillment_request")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:22.638361369Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class FulfillmentRequest {
+
+ @Valid
+ private List methods = new ArrayList<>();
+
+ public FulfillmentRequest methods(List methods) {
+ this.methods = methods;
+ return this;
+ }
+
+ public FulfillmentRequest addMethodsItem(FulfillmentMethodCreateRequest methodsItem) {
+ if (this.methods == null) {
+ this.methods = new ArrayList<>();
+ }
+ this.methods.add(methodsItem);
+ return this;
+ }
+
+ /**
+ * Fulfillment methods for cart items.
+ * @return methods
+ */
+ @Valid
+ @Schema(name = "methods", description = "Fulfillment methods for cart items.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("methods")
+ public List getMethods() {
+ return methods;
+ }
+
+ public void setMethods(List methods) {
+ this.methods = methods;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ FulfillmentRequest fulfillmentRequest = (FulfillmentRequest) o;
+ return Objects.equals(this.methods, fulfillmentRequest.methods);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(methods);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class FulfillmentRequest {\n");
+ sb.append(" methods: ").append(toIndentedString(methods)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private FulfillmentRequest instance;
+
+ public Builder() {
+ this(new FulfillmentRequest());
+ }
+
+ protected Builder(FulfillmentRequest instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(FulfillmentRequest value) {
+ this.instance.setMethods(value.methods);
+ return this;
+ }
+
+ public FulfillmentRequest.Builder methods(List methods) {
+ this.instance.methods(methods);
+ return this;
+ }
+
+ /**
+ * returns a built FulfillmentRequest instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public FulfillmentRequest build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static FulfillmentRequest.Builder builder() {
+ return new FulfillmentRequest.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public FulfillmentRequest.Builder toBuilder() {
+ FulfillmentRequest.Builder builder = new FulfillmentRequest.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentResponse.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentResponse.java
new file mode 100644
index 0000000..9a856ca
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/FulfillmentResponse.java
@@ -0,0 +1,213 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.FulfillmentAvailableMethodResponse;
+import com.dev.ucp.service.shopping.model.FulfillmentMethodResponse;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * Container for fulfillment methods and availability.
+ */
+
+@Schema(name = "fulfillment_response", description = "Container for fulfillment methods and availability.")
+@JsonTypeName("fulfillment_response")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:22.638361369Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class FulfillmentResponse {
+
+ @Valid
+ private List methods = new ArrayList<>();
+
+ @Valid
+ private List availableMethods = new ArrayList<>();
+
+ public FulfillmentResponse methods(List methods) {
+ this.methods = methods;
+ return this;
+ }
+
+ public FulfillmentResponse addMethodsItem(FulfillmentMethodResponse methodsItem) {
+ if (this.methods == null) {
+ this.methods = new ArrayList<>();
+ }
+ this.methods.add(methodsItem);
+ return this;
+ }
+
+ /**
+ * Fulfillment methods for cart items.
+ * @return methods
+ */
+ @Valid
+ @Schema(name = "methods", description = "Fulfillment methods for cart items.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("methods")
+ public List getMethods() {
+ return methods;
+ }
+
+ public void setMethods(List methods) {
+ this.methods = methods;
+ }
+
+ public FulfillmentResponse availableMethods(List availableMethods) {
+ this.availableMethods = availableMethods;
+ return this;
+ }
+
+ public FulfillmentResponse addAvailableMethodsItem(FulfillmentAvailableMethodResponse availableMethodsItem) {
+ if (this.availableMethods == null) {
+ this.availableMethods = new ArrayList<>();
+ }
+ this.availableMethods.add(availableMethodsItem);
+ return this;
+ }
+
+ /**
+ * Inventory availability hints.
+ * @return availableMethods
+ */
+ @Valid
+ @Schema(name = "available_methods", description = "Inventory availability hints.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("available_methods")
+ public List getAvailableMethods() {
+ return availableMethods;
+ }
+
+ public void setAvailableMethods(List availableMethods) {
+ this.availableMethods = availableMethods;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ FulfillmentResponse fulfillmentResponse = (FulfillmentResponse) o;
+ return Objects.equals(this.methods, fulfillmentResponse.methods) &&
+ Objects.equals(this.availableMethods, fulfillmentResponse.availableMethods);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(methods, availableMethods);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class FulfillmentResponse {\n");
+ sb.append(" methods: ").append(toIndentedString(methods)).append("\n");
+ sb.append(" availableMethods: ").append(toIndentedString(availableMethods)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private FulfillmentResponse instance;
+
+ public Builder() {
+ this(new FulfillmentResponse());
+ }
+
+ protected Builder(FulfillmentResponse instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(FulfillmentResponse value) {
+ this.instance.setMethods(value.methods);
+ this.instance.setAvailableMethods(value.availableMethods);
+ return this;
+ }
+
+ public FulfillmentResponse.Builder methods(List methods) {
+ this.instance.methods(methods);
+ return this;
+ }
+
+ public FulfillmentResponse.Builder availableMethods(List availableMethods) {
+ this.instance.availableMethods(availableMethods);
+ return this;
+ }
+
+ /**
+ * returns a built FulfillmentResponse instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public FulfillmentResponse build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static FulfillmentResponse.Builder builder() {
+ return new FulfillmentResponse.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public FulfillmentResponse.Builder toBuilder() {
+ FulfillmentResponse.Builder builder = new FulfillmentResponse.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/ItemCreateRequest.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/ItemCreateRequest.java
new file mode 100644
index 0000000..7809655
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/ItemCreateRequest.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * ItemCreateRequest
+ */
+
+@JsonTypeName("Item_Create_Request")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class ItemCreateRequest {
+
+ private String id;
+
+ public ItemCreateRequest() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public ItemCreateRequest(String id) {
+ this.id = id;
+ }
+
+ public ItemCreateRequest id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Should be recognized by both the Platform, and the Business. For Google it should match the id provided in the \"id\" field in the product feed.
+ * @return id
+ */
+ @NotNull
+ @Schema(name = "id", description = "Should be recognized by both the Platform, and the Business. For Google it should match the id provided in the \"id\" field in the product feed.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("id")
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ ItemCreateRequest itemCreateRequest = (ItemCreateRequest) o;
+ return Objects.equals(this.id, itemCreateRequest.id);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class ItemCreateRequest {\n");
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private ItemCreateRequest instance;
+
+ public Builder() {
+ this(new ItemCreateRequest());
+ }
+
+ protected Builder(ItemCreateRequest instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(ItemCreateRequest value) {
+ this.instance.setId(value.id);
+ return this;
+ }
+
+ public ItemCreateRequest.Builder id(String id) {
+ this.instance.id(id);
+ return this;
+ }
+
+ /**
+ * returns a built ItemCreateRequest instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public ItemCreateRequest build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static ItemCreateRequest.Builder builder() {
+ return new ItemCreateRequest.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public ItemCreateRequest.Builder toBuilder() {
+ ItemCreateRequest.Builder builder = new ItemCreateRequest.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/ItemResponse.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/ItemResponse.java
new file mode 100644
index 0000000..ce38370
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/ItemResponse.java
@@ -0,0 +1,264 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import java.net.URI;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * ItemResponse
+ */
+
+@JsonTypeName("Item_Response_1")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class ItemResponse {
+
+ private String id;
+
+ private String title;
+
+ private Integer price;
+
+ private @Nullable URI imageUrl;
+
+ public ItemResponse() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public ItemResponse(String id, String title, Integer price) {
+ this.id = id;
+ this.title = title;
+ this.price = price;
+ }
+
+ public ItemResponse id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Should be recognized by both the Platform, and the Business. For Google it should match the id provided in the \"id\" field in the product feed.
+ * @return id
+ */
+ @NotNull
+ @Schema(name = "id", description = "Should be recognized by both the Platform, and the Business. For Google it should match the id provided in the \"id\" field in the product feed.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("id")
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public ItemResponse title(String title) {
+ this.title = title;
+ return this;
+ }
+
+ /**
+ * Product title.
+ * @return title
+ */
+ @NotNull
+ @Schema(name = "title", description = "Product title.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("title")
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public ItemResponse price(Integer price) {
+ this.price = price;
+ return this;
+ }
+
+ /**
+ * Unit price in minor (cents) currency units.
+ * minimum: 0
+ * @return price
+ */
+ @NotNull @Min(value = 0)
+ @Schema(name = "price", description = "Unit price in minor (cents) currency units.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("price")
+ public Integer getPrice() {
+ return price;
+ }
+
+ public void setPrice(Integer price) {
+ this.price = price;
+ }
+
+ public ItemResponse imageUrl(@Nullable URI imageUrl) {
+ this.imageUrl = imageUrl;
+ return this;
+ }
+
+ /**
+ * Product image URI.
+ * @return imageUrl
+ */
+ @Valid
+ @Schema(name = "image_url", description = "Product image URI.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("image_url")
+ public @Nullable URI getImageUrl() {
+ return imageUrl;
+ }
+
+ public void setImageUrl(@Nullable URI imageUrl) {
+ this.imageUrl = imageUrl;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ ItemResponse itemResponse1 = (ItemResponse) o;
+ return Objects.equals(this.id, itemResponse1.id) &&
+ Objects.equals(this.title, itemResponse1.title) &&
+ Objects.equals(this.price, itemResponse1.price) &&
+ Objects.equals(this.imageUrl, itemResponse1.imageUrl);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, title, price, imageUrl);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class ItemResponse {\n");
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" title: ").append(toIndentedString(title)).append("\n");
+ sb.append(" price: ").append(toIndentedString(price)).append("\n");
+ sb.append(" imageUrl: ").append(toIndentedString(imageUrl)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private ItemResponse instance;
+
+ public Builder() {
+ this(new ItemResponse());
+ }
+
+ protected Builder(ItemResponse instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(ItemResponse value) {
+ this.instance.setId(value.id);
+ this.instance.setTitle(value.title);
+ this.instance.setPrice(value.price);
+ this.instance.setImageUrl(value.imageUrl);
+ return this;
+ }
+
+ public ItemResponse.Builder id(String id) {
+ this.instance.id(id);
+ return this;
+ }
+
+ public ItemResponse.Builder title(String title) {
+ this.instance.title(title);
+ return this;
+ }
+
+ public ItemResponse.Builder price(Integer price) {
+ this.instance.price(price);
+ return this;
+ }
+
+ public ItemResponse.Builder imageUrl(URI imageUrl) {
+ this.instance.imageUrl(imageUrl);
+ return this;
+ }
+
+ /**
+ * returns a built ItemResponse instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public ItemResponse build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static ItemResponse.Builder builder() {
+ return new ItemResponse.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public ItemResponse.Builder toBuilder() {
+ ItemResponse.Builder builder = new ItemResponse.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/ItemUpdateRequest.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/ItemUpdateRequest.java
new file mode 100644
index 0000000..fcfdde9
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/ItemUpdateRequest.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * ItemUpdateRequest
+ */
+
+@JsonTypeName("Item_Update_Request")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class ItemUpdateRequest {
+
+ private String id;
+
+ public ItemUpdateRequest() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public ItemUpdateRequest(String id) {
+ this.id = id;
+ }
+
+ public ItemUpdateRequest id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Should be recognized by both the Platform, and the Business. For Google it should match the id provided in the \"id\" field in the product feed.
+ * @return id
+ */
+ @NotNull
+ @Schema(name = "id", description = "Should be recognized by both the Platform, and the Business. For Google it should match the id provided in the \"id\" field in the product feed.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("id")
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ ItemUpdateRequest itemUpdateRequest = (ItemUpdateRequest) o;
+ return Objects.equals(this.id, itemUpdateRequest.id);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class ItemUpdateRequest {\n");
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private ItemUpdateRequest instance;
+
+ public Builder() {
+ this(new ItemUpdateRequest());
+ }
+
+ protected Builder(ItemUpdateRequest instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(ItemUpdateRequest value) {
+ this.instance.setId(value.id);
+ return this;
+ }
+
+ public ItemUpdateRequest.Builder id(String id) {
+ this.instance.id(id);
+ return this;
+ }
+
+ /**
+ * returns a built ItemUpdateRequest instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public ItemUpdateRequest build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static ItemUpdateRequest.Builder builder() {
+ return new ItemUpdateRequest.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public ItemUpdateRequest.Builder toBuilder() {
+ ItemUpdateRequest.Builder builder = new ItemUpdateRequest.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/LineItemCreateRequest.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/LineItemCreateRequest.java
new file mode 100644
index 0000000..5376ca1
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/LineItemCreateRequest.java
@@ -0,0 +1,204 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.ItemCreateRequest;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * Line item object. Expected to use the currency of the parent object.
+ */
+
+@Schema(name = "Line_Item_Create_Request", description = "Line item object. Expected to use the currency of the parent object.")
+@JsonTypeName("Line_Item_Create_Request")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class LineItemCreateRequest {
+
+ private ItemCreateRequest item;
+
+ private Integer quantity;
+
+ public LineItemCreateRequest() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public LineItemCreateRequest(ItemCreateRequest item, Integer quantity) {
+ this.item = item;
+ this.quantity = quantity;
+ }
+
+ public LineItemCreateRequest item(ItemCreateRequest item) {
+ this.item = item;
+ return this;
+ }
+
+ /**
+ * Get item
+ * @return item
+ */
+ @NotNull @Valid
+ @Schema(name = "item", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("item")
+ public ItemCreateRequest getItem() {
+ return item;
+ }
+
+ public void setItem(ItemCreateRequest item) {
+ this.item = item;
+ }
+
+ public LineItemCreateRequest quantity(Integer quantity) {
+ this.quantity = quantity;
+ return this;
+ }
+
+ /**
+ * Quantity of the item being purchased.
+ * minimum: 1
+ * @return quantity
+ */
+ @NotNull @Min(value = 1)
+ @Schema(name = "quantity", description = "Quantity of the item being purchased.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("quantity")
+ public Integer getQuantity() {
+ return quantity;
+ }
+
+ public void setQuantity(Integer quantity) {
+ this.quantity = quantity;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ LineItemCreateRequest lineItemCreateRequest = (LineItemCreateRequest) o;
+ return Objects.equals(this.item, lineItemCreateRequest.item) &&
+ Objects.equals(this.quantity, lineItemCreateRequest.quantity);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(item, quantity);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class LineItemCreateRequest {\n");
+ sb.append(" item: ").append(toIndentedString(item)).append("\n");
+ sb.append(" quantity: ").append(toIndentedString(quantity)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private LineItemCreateRequest instance;
+
+ public Builder() {
+ this(new LineItemCreateRequest());
+ }
+
+ protected Builder(LineItemCreateRequest instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(LineItemCreateRequest value) {
+ this.instance.setItem(value.item);
+ this.instance.setQuantity(value.quantity);
+ return this;
+ }
+
+ public LineItemCreateRequest.Builder item(ItemCreateRequest item) {
+ this.instance.item(item);
+ return this;
+ }
+
+ public LineItemCreateRequest.Builder quantity(Integer quantity) {
+ this.instance.quantity(quantity);
+ return this;
+ }
+
+ /**
+ * returns a built LineItemCreateRequest instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public LineItemCreateRequest build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static LineItemCreateRequest.Builder builder() {
+ return new LineItemCreateRequest.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public LineItemCreateRequest.Builder toBuilder() {
+ LineItemCreateRequest.Builder builder = new LineItemCreateRequest.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/LineItemResponse.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/LineItemResponse.java
new file mode 100644
index 0000000..b0e936a
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/LineItemResponse.java
@@ -0,0 +1,309 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.ItemResponse;
+import com.dev.ucp.service.shopping.model.TotalResponse;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * Line item object. Expected to use the currency of the parent object.
+ */
+
+@Schema(name = "Line_Item_Response", description = "Line item object. Expected to use the currency of the parent object.")
+@JsonTypeName("Line_Item_Response")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class LineItemResponse {
+
+ private String id;
+
+ private ItemResponse item;
+
+ private Integer quantity;
+
+ @Valid
+ private List<@Valid TotalResponse> totals = new ArrayList<>();
+
+ private @Nullable String parentId;
+
+ public LineItemResponse() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public LineItemResponse(String id, ItemResponse item, Integer quantity, List<@Valid TotalResponse> totals) {
+ this.id = id;
+ this.item = item;
+ this.quantity = quantity;
+ this.totals = totals;
+ }
+
+ public LineItemResponse id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Get id
+ * @return id
+ */
+ @NotNull
+ @Schema(name = "id", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("id")
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public LineItemResponse item(ItemResponse item) {
+ this.item = item;
+ return this;
+ }
+
+ /**
+ * Get item
+ * @return item
+ */
+ @NotNull @Valid
+ @Schema(name = "item", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("item")
+ public ItemResponse getItem() {
+ return item;
+ }
+
+ public void setItem(ItemResponse item) {
+ this.item = item;
+ }
+
+ public LineItemResponse quantity(Integer quantity) {
+ this.quantity = quantity;
+ return this;
+ }
+
+ /**
+ * Quantity of the item being purchased.
+ * minimum: 1
+ * @return quantity
+ */
+ @NotNull @Min(value = 1)
+ @Schema(name = "quantity", description = "Quantity of the item being purchased.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("quantity")
+ public Integer getQuantity() {
+ return quantity;
+ }
+
+ public void setQuantity(Integer quantity) {
+ this.quantity = quantity;
+ }
+
+ public LineItemResponse totals(List<@Valid TotalResponse> totals) {
+ this.totals = totals;
+ return this;
+ }
+
+ public LineItemResponse addTotalsItem(TotalResponse totalsItem) {
+ if (this.totals == null) {
+ this.totals = new ArrayList<>();
+ }
+ this.totals.add(totalsItem);
+ return this;
+ }
+
+ /**
+ * Line item totals breakdown.
+ * @return totals
+ */
+ @NotNull @Valid
+ @Schema(name = "totals", description = "Line item totals breakdown.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("totals")
+ public List<@Valid TotalResponse> getTotals() {
+ return totals;
+ }
+
+ public void setTotals(List<@Valid TotalResponse> totals) {
+ this.totals = totals;
+ }
+
+ public LineItemResponse parentId(@Nullable String parentId) {
+ this.parentId = parentId;
+ return this;
+ }
+
+ /**
+ * Parent line item identifier for any nested structures.
+ * @return parentId
+ */
+
+ @Schema(name = "parent_id", description = "Parent line item identifier for any nested structures.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("parent_id")
+ public @Nullable String getParentId() {
+ return parentId;
+ }
+
+ public void setParentId(@Nullable String parentId) {
+ this.parentId = parentId;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ LineItemResponse lineItemResponse = (LineItemResponse) o;
+ return Objects.equals(this.id, lineItemResponse.id) &&
+ Objects.equals(this.item, lineItemResponse.item) &&
+ Objects.equals(this.quantity, lineItemResponse.quantity) &&
+ Objects.equals(this.totals, lineItemResponse.totals) &&
+ Objects.equals(this.parentId, lineItemResponse.parentId);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, item, quantity, totals, parentId);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class LineItemResponse {\n");
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" item: ").append(toIndentedString(item)).append("\n");
+ sb.append(" quantity: ").append(toIndentedString(quantity)).append("\n");
+ sb.append(" totals: ").append(toIndentedString(totals)).append("\n");
+ sb.append(" parentId: ").append(toIndentedString(parentId)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private LineItemResponse instance;
+
+ public Builder() {
+ this(new LineItemResponse());
+ }
+
+ protected Builder(LineItemResponse instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(LineItemResponse value) {
+ this.instance.setId(value.id);
+ this.instance.setItem(value.item);
+ this.instance.setQuantity(value.quantity);
+ this.instance.setTotals(value.totals);
+ this.instance.setParentId(value.parentId);
+ return this;
+ }
+
+ public LineItemResponse.Builder id(String id) {
+ this.instance.id(id);
+ return this;
+ }
+
+ public LineItemResponse.Builder item(ItemResponse item) {
+ this.instance.item(item);
+ return this;
+ }
+
+ public LineItemResponse.Builder quantity(Integer quantity) {
+ this.instance.quantity(quantity);
+ return this;
+ }
+
+ public LineItemResponse.Builder totals(List totals) {
+ this.instance.totals(totals);
+ return this;
+ }
+
+ public LineItemResponse.Builder parentId(String parentId) {
+ this.instance.parentId(parentId);
+ return this;
+ }
+
+ /**
+ * returns a built LineItemResponse instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public LineItemResponse build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static LineItemResponse.Builder builder() {
+ return new LineItemResponse.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public LineItemResponse.Builder toBuilder() {
+ LineItemResponse.Builder builder = new LineItemResponse.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/LineItemUpdateRequest.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/LineItemUpdateRequest.java
new file mode 100644
index 0000000..3310a25
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/LineItemUpdateRequest.java
@@ -0,0 +1,264 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.ItemUpdateRequest;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * Line item object. Expected to use the currency of the parent object.
+ */
+
+@Schema(name = "Line_Item_Update_Request", description = "Line item object. Expected to use the currency of the parent object.")
+@JsonTypeName("Line_Item_Update_Request")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class LineItemUpdateRequest {
+
+ private @Nullable String id;
+
+ private ItemUpdateRequest item;
+
+ private Integer quantity;
+
+ private @Nullable String parentId;
+
+ public LineItemUpdateRequest() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public LineItemUpdateRequest(ItemUpdateRequest item, Integer quantity) {
+ this.item = item;
+ this.quantity = quantity;
+ }
+
+ public LineItemUpdateRequest id(@Nullable String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Get id
+ * @return id
+ */
+
+ @Schema(name = "id", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("id")
+ public @Nullable String getId() {
+ return id;
+ }
+
+ public void setId(@Nullable String id) {
+ this.id = id;
+ }
+
+ public LineItemUpdateRequest item(ItemUpdateRequest item) {
+ this.item = item;
+ return this;
+ }
+
+ /**
+ * Get item
+ * @return item
+ */
+ @NotNull @Valid
+ @Schema(name = "item", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("item")
+ public ItemUpdateRequest getItem() {
+ return item;
+ }
+
+ public void setItem(ItemUpdateRequest item) {
+ this.item = item;
+ }
+
+ public LineItemUpdateRequest quantity(Integer quantity) {
+ this.quantity = quantity;
+ return this;
+ }
+
+ /**
+ * Quantity of the item being purchased.
+ * minimum: 1
+ * @return quantity
+ */
+ @NotNull @Min(value = 1)
+ @Schema(name = "quantity", description = "Quantity of the item being purchased.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("quantity")
+ public Integer getQuantity() {
+ return quantity;
+ }
+
+ public void setQuantity(Integer quantity) {
+ this.quantity = quantity;
+ }
+
+ public LineItemUpdateRequest parentId(@Nullable String parentId) {
+ this.parentId = parentId;
+ return this;
+ }
+
+ /**
+ * Parent line item identifier for any nested structures.
+ * @return parentId
+ */
+
+ @Schema(name = "parent_id", description = "Parent line item identifier for any nested structures.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("parent_id")
+ public @Nullable String getParentId() {
+ return parentId;
+ }
+
+ public void setParentId(@Nullable String parentId) {
+ this.parentId = parentId;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ LineItemUpdateRequest lineItemUpdateRequest = (LineItemUpdateRequest) o;
+ return Objects.equals(this.id, lineItemUpdateRequest.id) &&
+ Objects.equals(this.item, lineItemUpdateRequest.item) &&
+ Objects.equals(this.quantity, lineItemUpdateRequest.quantity) &&
+ Objects.equals(this.parentId, lineItemUpdateRequest.parentId);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, item, quantity, parentId);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class LineItemUpdateRequest {\n");
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" item: ").append(toIndentedString(item)).append("\n");
+ sb.append(" quantity: ").append(toIndentedString(quantity)).append("\n");
+ sb.append(" parentId: ").append(toIndentedString(parentId)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private LineItemUpdateRequest instance;
+
+ public Builder() {
+ this(new LineItemUpdateRequest());
+ }
+
+ protected Builder(LineItemUpdateRequest instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(LineItemUpdateRequest value) {
+ this.instance.setId(value.id);
+ this.instance.setItem(value.item);
+ this.instance.setQuantity(value.quantity);
+ this.instance.setParentId(value.parentId);
+ return this;
+ }
+
+ public LineItemUpdateRequest.Builder id(String id) {
+ this.instance.id(id);
+ return this;
+ }
+
+ public LineItemUpdateRequest.Builder item(ItemUpdateRequest item) {
+ this.instance.item(item);
+ return this;
+ }
+
+ public LineItemUpdateRequest.Builder quantity(Integer quantity) {
+ this.instance.quantity(quantity);
+ return this;
+ }
+
+ public LineItemUpdateRequest.Builder parentId(String parentId) {
+ this.instance.parentId(parentId);
+ return this;
+ }
+
+ /**
+ * returns a built LineItemUpdateRequest instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public LineItemUpdateRequest build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static LineItemUpdateRequest.Builder builder() {
+ return new LineItemUpdateRequest.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public LineItemUpdateRequest.Builder toBuilder() {
+ LineItemUpdateRequest.Builder builder = new LineItemUpdateRequest.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/Link.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/Link.java
new file mode 100644
index 0000000..e8e4e59
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/Link.java
@@ -0,0 +1,230 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import java.net.URI;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * Link
+ */
+
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class Link {
+
+ private String type;
+
+ private URI url;
+
+ private @Nullable String title;
+
+ public Link() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public Link(String type, URI url) {
+ this.type = type;
+ this.url = url;
+ }
+
+ public Link type(String type) {
+ this.type = type;
+ return this;
+ }
+
+ /**
+ * Type of link. Well-known values: `privacy_policy`, `terms_of_service`, `refund_policy`, `shipping_policy`, `faq`. Consumers SHOULD handle unknown values gracefully by displaying them using the `title` field or omitting the link.
+ * @return type
+ */
+ @NotNull
+ @Schema(name = "type", description = "Type of link. Well-known values: `privacy_policy`, `terms_of_service`, `refund_policy`, `shipping_policy`, `faq`. Consumers SHOULD handle unknown values gracefully by displaying them using the `title` field or omitting the link.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("type")
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public Link url(URI url) {
+ this.url = url;
+ return this;
+ }
+
+ /**
+ * The actual URL pointing to the content to be displayed.
+ * @return url
+ */
+ @NotNull @Valid
+ @Schema(name = "url", description = "The actual URL pointing to the content to be displayed.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("url")
+ public URI getUrl() {
+ return url;
+ }
+
+ public void setUrl(URI url) {
+ this.url = url;
+ }
+
+ public Link title(@Nullable String title) {
+ this.title = title;
+ return this;
+ }
+
+ /**
+ * Optional display text for the link. When provided, use this instead of generating from type.
+ * @return title
+ */
+
+ @Schema(name = "title", description = "Optional display text for the link. When provided, use this instead of generating from type.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("title")
+ public @Nullable String getTitle() {
+ return title;
+ }
+
+ public void setTitle(@Nullable String title) {
+ this.title = title;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ Link link = (Link) o;
+ return Objects.equals(this.type, link.type) &&
+ Objects.equals(this.url, link.url) &&
+ Objects.equals(this.title, link.title);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(type, url, title);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class Link {\n");
+ sb.append(" type: ").append(toIndentedString(type)).append("\n");
+ sb.append(" url: ").append(toIndentedString(url)).append("\n");
+ sb.append(" title: ").append(toIndentedString(title)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private Link instance;
+
+ public Builder() {
+ this(new Link());
+ }
+
+ protected Builder(Link instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(Link value) {
+ this.instance.setType(value.type);
+ this.instance.setUrl(value.url);
+ this.instance.setTitle(value.title);
+ return this;
+ }
+
+ public Link.Builder type(String type) {
+ this.instance.type(type);
+ return this;
+ }
+
+ public Link.Builder url(URI url) {
+ this.instance.url(url);
+ return this;
+ }
+
+ public Link.Builder title(String title) {
+ this.instance.title(title);
+ return this;
+ }
+
+ /**
+ * returns a built Link instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public Link build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static Link.Builder builder() {
+ return new Link.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public Link.Builder toBuilder() {
+ Link.Builder builder = new Link.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/Message.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/Message.java
new file mode 100644
index 0000000..5fe3a1f
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/Message.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.MessageError;
+import com.dev.ucp.service.shopping.model.MessageInfo;
+import com.dev.ucp.service.shopping.model.MessageWarning;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+import com.fasterxml.jackson.databind.JsonNode;
+import org.springframework.lang.Nullable;
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+import java.util.Map;
+import java.util.HashMap;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public interface Message {
+}
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/MessageError.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/MessageError.java
new file mode 100644
index 0000000..f679f95
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/MessageError.java
@@ -0,0 +1,430 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import org.springframework.lang.Nullable;
+import com.fasterxml.jackson.databind.JsonNode;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * MessageError
+ */
+
+@JsonTypeName("Message_Error")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class MessageError implements Message {
+
+ /**
+ * Message type discriminator.
+ */
+ public enum TypeEnum {
+ ERROR("error");
+
+ private final String value;
+
+ TypeEnum(String value) {
+ this.value = value;
+ }
+
+ @JsonValue
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+ @JsonCreator
+ public static TypeEnum fromValue(String value) {
+ for (TypeEnum b : TypeEnum.values()) {
+ if (b.value.equals(value)) {
+ return b;
+ }
+ }
+ throw new IllegalArgumentException("Unexpected value '" + value + "'");
+ }
+ }
+
+ private TypeEnum type;
+
+ private String code;
+
+ private @Nullable String path;
+
+ /**
+ * Content format, default = plain.
+ */
+ public enum ContentTypeEnum {
+ PLAIN("plain"),
+
+ MARKDOWN("markdown");
+
+ private final String value;
+
+ ContentTypeEnum(String value) {
+ this.value = value;
+ }
+
+ @JsonValue
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+ @JsonCreator
+ public static ContentTypeEnum fromValue(String value) {
+ for (ContentTypeEnum b : ContentTypeEnum.values()) {
+ if (b.value.equals(value)) {
+ return b;
+ }
+ }
+ throw new IllegalArgumentException("Unexpected value '" + value + "'");
+ }
+ }
+
+ private ContentTypeEnum contentType = ContentTypeEnum.PLAIN;
+
+ private String content;
+
+ /**
+ * Declares who resolves this error. 'recoverable': agent can fix via API. 'requires_buyer_input': merchant requires information their API doesn't support collecting programmatically (checkout incomplete). 'requires_buyer_review': buyer must authorize before order placement due to policy, regulatory, or entitlement rules (checkout complete). Errors with 'requires_*' severity contribute to 'status: requires_escalation'.
+ */
+ public enum SeverityEnum {
+ RECOVERABLE("recoverable"),
+
+ REQUIRES_BUYER_INPUT("requires_buyer_input"),
+
+ REQUIRES_BUYER_REVIEW("requires_buyer_review");
+
+ private final String value;
+
+ SeverityEnum(String value) {
+ this.value = value;
+ }
+
+ @JsonValue
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+ @JsonCreator
+ public static SeverityEnum fromValue(String value) {
+ for (SeverityEnum b : SeverityEnum.values()) {
+ if (b.value.equals(value)) {
+ return b;
+ }
+ }
+ throw new IllegalArgumentException("Unexpected value '" + value + "'");
+ }
+ }
+
+ private SeverityEnum severity;
+
+ public MessageError() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public MessageError(TypeEnum type, String code, String content, SeverityEnum severity) {
+ this.type = type;
+ this.code = code;
+ this.content = content;
+ this.severity = severity;
+ }
+
+ public MessageError type(TypeEnum type) {
+ this.type = type;
+ return this;
+ }
+
+ /**
+ * Message type discriminator.
+ * @return type
+ */
+ @NotNull
+ @Schema(name = "type", description = "Message type discriminator.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("type")
+ public TypeEnum getType() {
+ return type;
+ }
+
+ public void setType(TypeEnum type) {
+ this.type = type;
+ }
+
+ public MessageError code(String code) {
+ this.code = code;
+ return this;
+ }
+
+ /**
+ * Error code. Possible values include: missing, invalid, out_of_stock, payment_declined, requires_sign_in, requires_3ds, requires_identity_linking. Freeform codes also allowed.
+ * @return code
+ */
+ @NotNull
+ @Schema(name = "code", description = "Error code. Possible values include: missing, invalid, out_of_stock, payment_declined, requires_sign_in, requires_3ds, requires_identity_linking. Freeform codes also allowed.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("code")
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public MessageError path(@Nullable String path) {
+ this.path = path;
+ return this;
+ }
+
+ /**
+ * RFC 9535 JSONPath to the component the message refers to (e.g., $.items[1]).
+ * @return path
+ */
+
+ @Schema(name = "path", description = "RFC 9535 JSONPath to the component the message refers to (e.g., $.items[1]).", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("path")
+ public @Nullable String getPath() {
+ return path;
+ }
+
+ public void setPath(@Nullable String path) {
+ this.path = path;
+ }
+
+ public MessageError contentType(ContentTypeEnum contentType) {
+ this.contentType = contentType;
+ return this;
+ }
+
+ /**
+ * Content format, default = plain.
+ * @return contentType
+ */
+
+ @Schema(name = "content_type", description = "Content format, default = plain.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("content_type")
+ public ContentTypeEnum getContentType() {
+ return contentType;
+ }
+
+ public void setContentType(ContentTypeEnum contentType) {
+ this.contentType = contentType;
+ }
+
+ public MessageError content(String content) {
+ this.content = content;
+ return this;
+ }
+
+ /**
+ * Human-readable message.
+ * @return content
+ */
+ @NotNull
+ @Schema(name = "content", description = "Human-readable message.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("content")
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+
+ public MessageError severity(SeverityEnum severity) {
+ this.severity = severity;
+ return this;
+ }
+
+ /**
+ * Declares who resolves this error. 'recoverable': agent can fix via API. 'requires_buyer_input': merchant requires information their API doesn't support collecting programmatically (checkout incomplete). 'requires_buyer_review': buyer must authorize before order placement due to policy, regulatory, or entitlement rules (checkout complete). Errors with 'requires_*' severity contribute to 'status: requires_escalation'.
+ * @return severity
+ */
+ @NotNull
+ @Schema(name = "severity", description = "Declares who resolves this error. 'recoverable': agent can fix via API. 'requires_buyer_input': merchant requires information their API doesn't support collecting programmatically (checkout incomplete). 'requires_buyer_review': buyer must authorize before order placement due to policy, regulatory, or entitlement rules (checkout complete). Errors with 'requires_*' severity contribute to 'status: requires_escalation'.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("severity")
+ public SeverityEnum getSeverity() {
+ return severity;
+ }
+
+ public void setSeverity(SeverityEnum severity) {
+ this.severity = severity;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ MessageError messageError = (MessageError) o;
+ return Objects.equals(this.type, messageError.type) &&
+ Objects.equals(this.code, messageError.code) &&
+ Objects.equals(this.path, messageError.path) &&
+ Objects.equals(this.contentType, messageError.contentType) &&
+ Objects.equals(this.content, messageError.content) &&
+ Objects.equals(this.severity, messageError.severity);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(type, code, path, contentType, content, severity);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class MessageError {\n");
+ sb.append(" type: ").append(toIndentedString(type)).append("\n");
+ sb.append(" code: ").append(toIndentedString(code)).append("\n");
+ sb.append(" path: ").append(toIndentedString(path)).append("\n");
+ sb.append(" contentType: ").append(toIndentedString(contentType)).append("\n");
+ sb.append(" content: ").append(toIndentedString(content)).append("\n");
+ sb.append(" severity: ").append(toIndentedString(severity)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private MessageError instance;
+
+ public Builder() {
+ this(new MessageError());
+ }
+
+ protected Builder(MessageError instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(MessageError value) {
+ this.instance.setType(value.type);
+ this.instance.setCode(value.code);
+ this.instance.setPath(value.path);
+ this.instance.setContentType(value.contentType);
+ this.instance.setContent(value.content);
+ this.instance.setSeverity(value.severity);
+ return this;
+ }
+
+ public MessageError.Builder type(TypeEnum type) {
+ this.instance.type(type);
+ return this;
+ }
+
+ public MessageError.Builder code(String code) {
+ this.instance.code(code);
+ return this;
+ }
+
+ public MessageError.Builder path(String path) {
+ this.instance.path(path);
+ return this;
+ }
+
+ public MessageError.Builder contentType(ContentTypeEnum contentType) {
+ this.instance.contentType(contentType);
+ return this;
+ }
+
+ public MessageError.Builder content(String content) {
+ this.instance.content(content);
+ return this;
+ }
+
+ public MessageError.Builder severity(SeverityEnum severity) {
+ this.instance.severity(severity);
+ return this;
+ }
+
+ /**
+ * returns a built MessageError instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public MessageError build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static MessageError.Builder builder() {
+ return new MessageError.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public MessageError.Builder toBuilder() {
+ MessageError.Builder builder = new MessageError.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/MessageInfo.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/MessageInfo.java
new file mode 100644
index 0000000..a837c57
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/MessageInfo.java
@@ -0,0 +1,361 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import org.springframework.lang.Nullable;
+import com.fasterxml.jackson.databind.JsonNode;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * MessageInfo
+ */
+
+@JsonTypeName("Message_Info")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class MessageInfo implements Message {
+
+ /**
+ * Message type discriminator.
+ */
+ public enum TypeEnum {
+ INFO("info");
+
+ private final String value;
+
+ TypeEnum(String value) {
+ this.value = value;
+ }
+
+ @JsonValue
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+ @JsonCreator
+ public static TypeEnum fromValue(String value) {
+ for (TypeEnum b : TypeEnum.values()) {
+ if (b.value.equals(value)) {
+ return b;
+ }
+ }
+ throw new IllegalArgumentException("Unexpected value '" + value + "'");
+ }
+ }
+
+ private TypeEnum type;
+
+ private @Nullable String path;
+
+ private @Nullable String code;
+
+ /**
+ * Content format, default = plain.
+ */
+ public enum ContentTypeEnum {
+ PLAIN("plain"),
+
+ MARKDOWN("markdown");
+
+ private final String value;
+
+ ContentTypeEnum(String value) {
+ this.value = value;
+ }
+
+ @JsonValue
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+ @JsonCreator
+ public static ContentTypeEnum fromValue(String value) {
+ for (ContentTypeEnum b : ContentTypeEnum.values()) {
+ if (b.value.equals(value)) {
+ return b;
+ }
+ }
+ throw new IllegalArgumentException("Unexpected value '" + value + "'");
+ }
+ }
+
+ private ContentTypeEnum contentType = ContentTypeEnum.PLAIN;
+
+ private String content;
+
+ public MessageInfo() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public MessageInfo(TypeEnum type, String content) {
+ this.type = type;
+ this.content = content;
+ }
+
+ public MessageInfo type(TypeEnum type) {
+ this.type = type;
+ return this;
+ }
+
+ /**
+ * Message type discriminator.
+ * @return type
+ */
+ @NotNull
+ @Schema(name = "type", description = "Message type discriminator.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("type")
+ public TypeEnum getType() {
+ return type;
+ }
+
+ public void setType(TypeEnum type) {
+ this.type = type;
+ }
+
+ public MessageInfo path(@Nullable String path) {
+ this.path = path;
+ return this;
+ }
+
+ /**
+ * RFC 9535 JSONPath to the component the message refers to.
+ * @return path
+ */
+
+ @Schema(name = "path", description = "RFC 9535 JSONPath to the component the message refers to.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("path")
+ public @Nullable String getPath() {
+ return path;
+ }
+
+ public void setPath(@Nullable String path) {
+ this.path = path;
+ }
+
+ public MessageInfo code(@Nullable String code) {
+ this.code = code;
+ return this;
+ }
+
+ /**
+ * Info code for programmatic handling.
+ * @return code
+ */
+
+ @Schema(name = "code", description = "Info code for programmatic handling.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("code")
+ public @Nullable String getCode() {
+ return code;
+ }
+
+ public void setCode(@Nullable String code) {
+ this.code = code;
+ }
+
+ public MessageInfo contentType(ContentTypeEnum contentType) {
+ this.contentType = contentType;
+ return this;
+ }
+
+ /**
+ * Content format, default = plain.
+ * @return contentType
+ */
+
+ @Schema(name = "content_type", description = "Content format, default = plain.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("content_type")
+ public ContentTypeEnum getContentType() {
+ return contentType;
+ }
+
+ public void setContentType(ContentTypeEnum contentType) {
+ this.contentType = contentType;
+ }
+
+ public MessageInfo content(String content) {
+ this.content = content;
+ return this;
+ }
+
+ /**
+ * Human-readable message.
+ * @return content
+ */
+ @NotNull
+ @Schema(name = "content", description = "Human-readable message.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("content")
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ MessageInfo messageInfo = (MessageInfo) o;
+ return Objects.equals(this.type, messageInfo.type) &&
+ Objects.equals(this.path, messageInfo.path) &&
+ Objects.equals(this.code, messageInfo.code) &&
+ Objects.equals(this.contentType, messageInfo.contentType) &&
+ Objects.equals(this.content, messageInfo.content);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(type, path, code, contentType, content);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class MessageInfo {\n");
+ sb.append(" type: ").append(toIndentedString(type)).append("\n");
+ sb.append(" path: ").append(toIndentedString(path)).append("\n");
+ sb.append(" code: ").append(toIndentedString(code)).append("\n");
+ sb.append(" contentType: ").append(toIndentedString(contentType)).append("\n");
+ sb.append(" content: ").append(toIndentedString(content)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private MessageInfo instance;
+
+ public Builder() {
+ this(new MessageInfo());
+ }
+
+ protected Builder(MessageInfo instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(MessageInfo value) {
+ this.instance.setType(value.type);
+ this.instance.setPath(value.path);
+ this.instance.setCode(value.code);
+ this.instance.setContentType(value.contentType);
+ this.instance.setContent(value.content);
+ return this;
+ }
+
+ public MessageInfo.Builder type(TypeEnum type) {
+ this.instance.type(type);
+ return this;
+ }
+
+ public MessageInfo.Builder path(String path) {
+ this.instance.path(path);
+ return this;
+ }
+
+ public MessageInfo.Builder code(String code) {
+ this.instance.code(code);
+ return this;
+ }
+
+ public MessageInfo.Builder contentType(ContentTypeEnum contentType) {
+ this.instance.contentType(contentType);
+ return this;
+ }
+
+ public MessageInfo.Builder content(String content) {
+ this.instance.content(content);
+ return this;
+ }
+
+ /**
+ * returns a built MessageInfo instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public MessageInfo build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static MessageInfo.Builder builder() {
+ return new MessageInfo.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public MessageInfo.Builder toBuilder() {
+ MessageInfo.Builder builder = new MessageInfo.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/MessageWarning.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/MessageWarning.java
new file mode 100644
index 0000000..410ac2f
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/MessageWarning.java
@@ -0,0 +1,362 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import org.springframework.lang.Nullable;
+import com.fasterxml.jackson.databind.JsonNode;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * MessageWarning
+ */
+
+@JsonTypeName("Message_Warning")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class MessageWarning implements Message {
+
+ /**
+ * Message type discriminator.
+ */
+ public enum TypeEnum {
+ WARNING("warning");
+
+ private final String value;
+
+ TypeEnum(String value) {
+ this.value = value;
+ }
+
+ @JsonValue
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+ @JsonCreator
+ public static TypeEnum fromValue(String value) {
+ for (TypeEnum b : TypeEnum.values()) {
+ if (b.value.equals(value)) {
+ return b;
+ }
+ }
+ throw new IllegalArgumentException("Unexpected value '" + value + "'");
+ }
+ }
+
+ private TypeEnum type;
+
+ private @Nullable String path;
+
+ private String code;
+
+ private String content;
+
+ /**
+ * Content format, default = plain.
+ */
+ public enum ContentTypeEnum {
+ PLAIN("plain"),
+
+ MARKDOWN("markdown");
+
+ private final String value;
+
+ ContentTypeEnum(String value) {
+ this.value = value;
+ }
+
+ @JsonValue
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+ @JsonCreator
+ public static ContentTypeEnum fromValue(String value) {
+ for (ContentTypeEnum b : ContentTypeEnum.values()) {
+ if (b.value.equals(value)) {
+ return b;
+ }
+ }
+ throw new IllegalArgumentException("Unexpected value '" + value + "'");
+ }
+ }
+
+ private ContentTypeEnum contentType = ContentTypeEnum.PLAIN;
+
+ public MessageWarning() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public MessageWarning(TypeEnum type, String code, String content) {
+ this.type = type;
+ this.code = code;
+ this.content = content;
+ }
+
+ public MessageWarning type(TypeEnum type) {
+ this.type = type;
+ return this;
+ }
+
+ /**
+ * Message type discriminator.
+ * @return type
+ */
+ @NotNull
+ @Schema(name = "type", description = "Message type discriminator.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("type")
+ public TypeEnum getType() {
+ return type;
+ }
+
+ public void setType(TypeEnum type) {
+ this.type = type;
+ }
+
+ public MessageWarning path(@Nullable String path) {
+ this.path = path;
+ return this;
+ }
+
+ /**
+ * JSONPath (RFC 9535) to related field (e.g., $.line_items[0]).
+ * @return path
+ */
+
+ @Schema(name = "path", description = "JSONPath (RFC 9535) to related field (e.g., $.line_items[0]).", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("path")
+ public @Nullable String getPath() {
+ return path;
+ }
+
+ public void setPath(@Nullable String path) {
+ this.path = path;
+ }
+
+ public MessageWarning code(String code) {
+ this.code = code;
+ return this;
+ }
+
+ /**
+ * Warning code. Machine-readable identifier for the warning type (e.g., final_sale, prop65, fulfillment_changed, age_restricted, etc.).
+ * @return code
+ */
+ @NotNull
+ @Schema(name = "code", description = "Warning code. Machine-readable identifier for the warning type (e.g., final_sale, prop65, fulfillment_changed, age_restricted, etc.).", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("code")
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public MessageWarning content(String content) {
+ this.content = content;
+ return this;
+ }
+
+ /**
+ * Human-readable warning message that MUST be displayed.
+ * @return content
+ */
+ @NotNull
+ @Schema(name = "content", description = "Human-readable warning message that MUST be displayed.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("content")
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+
+ public MessageWarning contentType(ContentTypeEnum contentType) {
+ this.contentType = contentType;
+ return this;
+ }
+
+ /**
+ * Content format, default = plain.
+ * @return contentType
+ */
+
+ @Schema(name = "content_type", description = "Content format, default = plain.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("content_type")
+ public ContentTypeEnum getContentType() {
+ return contentType;
+ }
+
+ public void setContentType(ContentTypeEnum contentType) {
+ this.contentType = contentType;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ MessageWarning messageWarning = (MessageWarning) o;
+ return Objects.equals(this.type, messageWarning.type) &&
+ Objects.equals(this.path, messageWarning.path) &&
+ Objects.equals(this.code, messageWarning.code) &&
+ Objects.equals(this.content, messageWarning.content) &&
+ Objects.equals(this.contentType, messageWarning.contentType);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(type, path, code, content, contentType);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class MessageWarning {\n");
+ sb.append(" type: ").append(toIndentedString(type)).append("\n");
+ sb.append(" path: ").append(toIndentedString(path)).append("\n");
+ sb.append(" code: ").append(toIndentedString(code)).append("\n");
+ sb.append(" content: ").append(toIndentedString(content)).append("\n");
+ sb.append(" contentType: ").append(toIndentedString(contentType)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private MessageWarning instance;
+
+ public Builder() {
+ this(new MessageWarning());
+ }
+
+ protected Builder(MessageWarning instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(MessageWarning value) {
+ this.instance.setType(value.type);
+ this.instance.setPath(value.path);
+ this.instance.setCode(value.code);
+ this.instance.setContent(value.content);
+ this.instance.setContentType(value.contentType);
+ return this;
+ }
+
+ public MessageWarning.Builder type(TypeEnum type) {
+ this.instance.type(type);
+ return this;
+ }
+
+ public MessageWarning.Builder path(String path) {
+ this.instance.path(path);
+ return this;
+ }
+
+ public MessageWarning.Builder code(String code) {
+ this.instance.code(code);
+ return this;
+ }
+
+ public MessageWarning.Builder content(String content) {
+ this.instance.content(content);
+ return this;
+ }
+
+ public MessageWarning.Builder contentType(ContentTypeEnum contentType) {
+ this.instance.contentType(contentType);
+ return this;
+ }
+
+ /**
+ * returns a built MessageWarning instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public MessageWarning build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static MessageWarning.Builder builder() {
+ return new MessageWarning.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public MessageWarning.Builder toBuilder() {
+ MessageWarning.Builder builder = new MessageWarning.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/Order.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/Order.java
new file mode 100644
index 0000000..8cab183
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/Order.java
@@ -0,0 +1,423 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.Adjustment;
+import com.dev.ucp.service.shopping.model.OrderFulfillment;
+import com.dev.ucp.service.shopping.model.OrderLineItem;
+import com.dev.ucp.service.shopping.model.TotalResponse;
+import com.dev.ucp.service.shopping.model.UCPOrderResponse;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * Order schema with immutable line items, buyer-facing fulfillment expectations, and append-only event logs.
+ */
+
+@Schema(name = "order", description = "Order schema with immutable line items, buyer-facing fulfillment expectations, and append-only event logs.")
+@JsonTypeName("order")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class Order {
+
+ private UCPOrderResponse ucp;
+
+ private String id;
+
+ private String checkoutId;
+
+ private URI permalinkUrl;
+
+ @Valid
+ private List<@Valid OrderLineItem> lineItems = new ArrayList<>();
+
+ private OrderFulfillment fulfillment;
+
+ @Valid
+ private List<@Valid Adjustment> adjustments = new ArrayList<>();
+
+ @Valid
+ private List<@Valid TotalResponse> totals = new ArrayList<>();
+
+ public Order() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public Order(UCPOrderResponse ucp, String id, String checkoutId, URI permalinkUrl, List<@Valid OrderLineItem> lineItems, OrderFulfillment fulfillment, List<@Valid TotalResponse> totals) {
+ this.ucp = ucp;
+ this.id = id;
+ this.checkoutId = checkoutId;
+ this.permalinkUrl = permalinkUrl;
+ this.lineItems = lineItems;
+ this.fulfillment = fulfillment;
+ this.totals = totals;
+ }
+
+ public Order ucp(UCPOrderResponse ucp) {
+ this.ucp = ucp;
+ return this;
+ }
+
+ /**
+ * Get ucp
+ * @return ucp
+ */
+ @NotNull @Valid
+ @Schema(name = "ucp", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("ucp")
+ public UCPOrderResponse getUcp() {
+ return ucp;
+ }
+
+ public void setUcp(UCPOrderResponse ucp) {
+ this.ucp = ucp;
+ }
+
+ public Order id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Unique order identifier.
+ * @return id
+ */
+ @NotNull
+ @Schema(name = "id", description = "Unique order identifier.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("id")
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public Order checkoutId(String checkoutId) {
+ this.checkoutId = checkoutId;
+ return this;
+ }
+
+ /**
+ * Associated checkout ID for reconciliation.
+ * @return checkoutId
+ */
+ @NotNull
+ @Schema(name = "checkout_id", description = "Associated checkout ID for reconciliation.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("checkout_id")
+ public String getCheckoutId() {
+ return checkoutId;
+ }
+
+ public void setCheckoutId(String checkoutId) {
+ this.checkoutId = checkoutId;
+ }
+
+ public Order permalinkUrl(URI permalinkUrl) {
+ this.permalinkUrl = permalinkUrl;
+ return this;
+ }
+
+ /**
+ * Permalink to access the order on merchant site.
+ * @return permalinkUrl
+ */
+ @NotNull @Valid
+ @Schema(name = "permalink_url", description = "Permalink to access the order on merchant site.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("permalink_url")
+ public URI getPermalinkUrl() {
+ return permalinkUrl;
+ }
+
+ public void setPermalinkUrl(URI permalinkUrl) {
+ this.permalinkUrl = permalinkUrl;
+ }
+
+ public Order lineItems(List<@Valid OrderLineItem> lineItems) {
+ this.lineItems = lineItems;
+ return this;
+ }
+
+ public Order addLineItemsItem(OrderLineItem lineItemsItem) {
+ if (this.lineItems == null) {
+ this.lineItems = new ArrayList<>();
+ }
+ this.lineItems.add(lineItemsItem);
+ return this;
+ }
+
+ /**
+ * Immutable line items — source of truth for what was ordered.
+ * @return lineItems
+ */
+ @NotNull @Valid
+ @Schema(name = "line_items", description = "Immutable line items — source of truth for what was ordered.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("line_items")
+ public List<@Valid OrderLineItem> getLineItems() {
+ return lineItems;
+ }
+
+ public void setLineItems(List<@Valid OrderLineItem> lineItems) {
+ this.lineItems = lineItems;
+ }
+
+ public Order fulfillment(OrderFulfillment fulfillment) {
+ this.fulfillment = fulfillment;
+ return this;
+ }
+
+ /**
+ * Get fulfillment
+ * @return fulfillment
+ */
+ @NotNull @Valid
+ @Schema(name = "fulfillment", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("fulfillment")
+ public OrderFulfillment getFulfillment() {
+ return fulfillment;
+ }
+
+ public void setFulfillment(OrderFulfillment fulfillment) {
+ this.fulfillment = fulfillment;
+ }
+
+ public Order adjustments(List<@Valid Adjustment> adjustments) {
+ this.adjustments = adjustments;
+ return this;
+ }
+
+ public Order addAdjustmentsItem(Adjustment adjustmentsItem) {
+ if (this.adjustments == null) {
+ this.adjustments = new ArrayList<>();
+ }
+ this.adjustments.add(adjustmentsItem);
+ return this;
+ }
+
+ /**
+ * Append-only event log of money movements (refunds, returns, credits, disputes, cancellations, etc.) that exist independently of fulfillment.
+ * @return adjustments
+ */
+ @Valid
+ @Schema(name = "adjustments", description = "Append-only event log of money movements (refunds, returns, credits, disputes, cancellations, etc.) that exist independently of fulfillment.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("adjustments")
+ public List<@Valid Adjustment> getAdjustments() {
+ return adjustments;
+ }
+
+ public void setAdjustments(List<@Valid Adjustment> adjustments) {
+ this.adjustments = adjustments;
+ }
+
+ public Order totals(List<@Valid TotalResponse> totals) {
+ this.totals = totals;
+ return this;
+ }
+
+ public Order addTotalsItem(TotalResponse totalsItem) {
+ if (this.totals == null) {
+ this.totals = new ArrayList<>();
+ }
+ this.totals.add(totalsItem);
+ return this;
+ }
+
+ /**
+ * Different totals for the order.
+ * @return totals
+ */
+ @NotNull @Valid
+ @Schema(name = "totals", description = "Different totals for the order.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("totals")
+ public List<@Valid TotalResponse> getTotals() {
+ return totals;
+ }
+
+ public void setTotals(List<@Valid TotalResponse> totals) {
+ this.totals = totals;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ Order order = (Order) o;
+ return Objects.equals(this.ucp, order.ucp) &&
+ Objects.equals(this.id, order.id) &&
+ Objects.equals(this.checkoutId, order.checkoutId) &&
+ Objects.equals(this.permalinkUrl, order.permalinkUrl) &&
+ Objects.equals(this.lineItems, order.lineItems) &&
+ Objects.equals(this.fulfillment, order.fulfillment) &&
+ Objects.equals(this.adjustments, order.adjustments) &&
+ Objects.equals(this.totals, order.totals);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(ucp, id, checkoutId, permalinkUrl, lineItems, fulfillment, adjustments, totals);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class Order {\n");
+ sb.append(" ucp: ").append(toIndentedString(ucp)).append("\n");
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" checkoutId: ").append(toIndentedString(checkoutId)).append("\n");
+ sb.append(" permalinkUrl: ").append(toIndentedString(permalinkUrl)).append("\n");
+ sb.append(" lineItems: ").append(toIndentedString(lineItems)).append("\n");
+ sb.append(" fulfillment: ").append(toIndentedString(fulfillment)).append("\n");
+ sb.append(" adjustments: ").append(toIndentedString(adjustments)).append("\n");
+ sb.append(" totals: ").append(toIndentedString(totals)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private Order instance;
+
+ public Builder() {
+ this(new Order());
+ }
+
+ protected Builder(Order instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(Order value) {
+ this.instance.setUcp(value.ucp);
+ this.instance.setId(value.id);
+ this.instance.setCheckoutId(value.checkoutId);
+ this.instance.setPermalinkUrl(value.permalinkUrl);
+ this.instance.setLineItems(value.lineItems);
+ this.instance.setFulfillment(value.fulfillment);
+ this.instance.setAdjustments(value.adjustments);
+ this.instance.setTotals(value.totals);
+ return this;
+ }
+
+ public Order.Builder ucp(UCPOrderResponse ucp) {
+ this.instance.ucp(ucp);
+ return this;
+ }
+
+ public Order.Builder id(String id) {
+ this.instance.id(id);
+ return this;
+ }
+
+ public Order.Builder checkoutId(String checkoutId) {
+ this.instance.checkoutId(checkoutId);
+ return this;
+ }
+
+ public Order.Builder permalinkUrl(URI permalinkUrl) {
+ this.instance.permalinkUrl(permalinkUrl);
+ return this;
+ }
+
+ public Order.Builder lineItems(List lineItems) {
+ this.instance.lineItems(lineItems);
+ return this;
+ }
+
+ public Order.Builder fulfillment(OrderFulfillment fulfillment) {
+ this.instance.fulfillment(fulfillment);
+ return this;
+ }
+
+ public Order.Builder adjustments(List adjustments) {
+ this.instance.adjustments(adjustments);
+ return this;
+ }
+
+ public Order.Builder totals(List totals) {
+ this.instance.totals(totals);
+ return this;
+ }
+
+ /**
+ * returns a built Order instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public Order build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static Order.Builder builder() {
+ return new Order.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public Order.Builder toBuilder() {
+ Order.Builder builder = new Order.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/OrderConfirmation.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/OrderConfirmation.java
new file mode 100644
index 0000000..158a12e
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/OrderConfirmation.java
@@ -0,0 +1,203 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import java.net.URI;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * Details about an order created for this checkout session.
+ */
+
+@Schema(name = "Order_Confirmation", description = "Details about an order created for this checkout session.")
+@JsonTypeName("Order_Confirmation")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class OrderConfirmation {
+
+ private String id;
+
+ private URI permalinkUrl;
+
+ public OrderConfirmation() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public OrderConfirmation(String id, URI permalinkUrl) {
+ this.id = id;
+ this.permalinkUrl = permalinkUrl;
+ }
+
+ public OrderConfirmation id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Unique order identifier.
+ * @return id
+ */
+ @NotNull
+ @Schema(name = "id", description = "Unique order identifier.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("id")
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public OrderConfirmation permalinkUrl(URI permalinkUrl) {
+ this.permalinkUrl = permalinkUrl;
+ return this;
+ }
+
+ /**
+ * Permalink to access the order on merchant site.
+ * @return permalinkUrl
+ */
+ @NotNull @Valid
+ @Schema(name = "permalink_url", description = "Permalink to access the order on merchant site.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("permalink_url")
+ public URI getPermalinkUrl() {
+ return permalinkUrl;
+ }
+
+ public void setPermalinkUrl(URI permalinkUrl) {
+ this.permalinkUrl = permalinkUrl;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ OrderConfirmation orderConfirmation = (OrderConfirmation) o;
+ return Objects.equals(this.id, orderConfirmation.id) &&
+ Objects.equals(this.permalinkUrl, orderConfirmation.permalinkUrl);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, permalinkUrl);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class OrderConfirmation {\n");
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" permalinkUrl: ").append(toIndentedString(permalinkUrl)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private OrderConfirmation instance;
+
+ public Builder() {
+ this(new OrderConfirmation());
+ }
+
+ protected Builder(OrderConfirmation instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(OrderConfirmation value) {
+ this.instance.setId(value.id);
+ this.instance.setPermalinkUrl(value.permalinkUrl);
+ return this;
+ }
+
+ public OrderConfirmation.Builder id(String id) {
+ this.instance.id(id);
+ return this;
+ }
+
+ public OrderConfirmation.Builder permalinkUrl(URI permalinkUrl) {
+ this.instance.permalinkUrl(permalinkUrl);
+ return this;
+ }
+
+ /**
+ * returns a built OrderConfirmation instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public OrderConfirmation build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static OrderConfirmation.Builder builder() {
+ return new OrderConfirmation.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public OrderConfirmation.Builder toBuilder() {
+ OrderConfirmation.Builder builder = new OrderConfirmation.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/OrderEventWebhook200Response.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/OrderEventWebhook200Response.java
new file mode 100644
index 0000000..0192101
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/OrderEventWebhook200Response.java
@@ -0,0 +1,176 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.databind.JsonNode;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * OrderEventWebhook200Response
+ */
+
+@JsonTypeName("order_event_webhook_200_response")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class OrderEventWebhook200Response {
+
+ private JsonNullable ucp = JsonNullable.undefined();
+
+ public OrderEventWebhook200Response() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public OrderEventWebhook200Response(JsonNode ucp) {
+ this.ucp = JsonNullable.of(ucp);
+ }
+
+ public OrderEventWebhook200Response ucp(JsonNode ucp) {
+ this.ucp = JsonNullable.of(ucp);
+ return this;
+ }
+
+ /**
+ * Protocol metadata for discovery profiles and responses. Uses slim schema pattern with context-specific required fields.
+ * @return ucp
+ */
+ @NotNull @Valid
+ @Schema(name = "ucp", description = "Protocol metadata for discovery profiles and responses. Uses slim schema pattern with context-specific required fields.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("ucp")
+ public JsonNullable getUcp() {
+ return ucp;
+ }
+
+ public void setUcp(JsonNullable ucp) {
+ this.ucp = ucp;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ OrderEventWebhook200Response orderEventWebhook200Response = (OrderEventWebhook200Response) o;
+ return Objects.equals(this.ucp, orderEventWebhook200Response.ucp);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(ucp);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class OrderEventWebhook200Response {\n");
+ sb.append(" ucp: ").append(toIndentedString(ucp)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private OrderEventWebhook200Response instance;
+
+ public Builder() {
+ this(new OrderEventWebhook200Response());
+ }
+
+ protected Builder(OrderEventWebhook200Response instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(OrderEventWebhook200Response value) {
+ this.instance.setUcp(value.ucp);
+ return this;
+ }
+
+ public OrderEventWebhook200Response.Builder ucp(JsonNode ucp) {
+ this.instance.ucp(ucp);
+ return this;
+ }
+
+ public OrderEventWebhook200Response.Builder ucp(JsonNullable ucp) {
+ this.instance.ucp = ucp;
+ return this;
+ }
+
+ /**
+ * returns a built OrderEventWebhook200Response instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public OrderEventWebhook200Response build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static OrderEventWebhook200Response.Builder builder() {
+ return new OrderEventWebhook200Response.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public OrderEventWebhook200Response.Builder toBuilder() {
+ OrderEventWebhook200Response.Builder builder = new OrderEventWebhook200Response.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/OrderEventWebhookRequest.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/OrderEventWebhookRequest.java
new file mode 100644
index 0000000..6df5e80
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/OrderEventWebhookRequest.java
@@ -0,0 +1,537 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.Adjustment;
+import com.dev.ucp.service.shopping.model.OrderFulfillment;
+import com.dev.ucp.service.shopping.model.OrderLineItem;
+import com.dev.ucp.service.shopping.model.TotalResponse;
+import com.dev.ucp.service.shopping.model.UCPOrderResponse;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.databind.JsonNode;
+import java.net.URI;
+import java.time.OffsetDateTime;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+import java.util.Map;
+import java.util.HashMap;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+/**
+ * OrderEventWebhookRequest
+ */
+
+@JsonTypeName("order_event_webhook_request")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class OrderEventWebhookRequest {
+
+ private UCPOrderResponse ucp;
+
+ private String id;
+
+ private String checkoutId;
+
+ private URI permalinkUrl;
+
+ @Valid
+ private List<@Valid OrderLineItem> lineItems = new ArrayList<>();
+
+ private OrderFulfillment fulfillment;
+
+ @Valid
+ private List<@Valid Adjustment> adjustments = new ArrayList<>();
+
+ @Valid
+ private List<@Valid TotalResponse> totals = new ArrayList<>();
+
+ private String eventId;
+
+ @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
+ private OffsetDateTime createdTime;
+
+ public OrderEventWebhookRequest() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public OrderEventWebhookRequest(UCPOrderResponse ucp, String id, String checkoutId, URI permalinkUrl, List<@Valid OrderLineItem> lineItems, OrderFulfillment fulfillment, List<@Valid TotalResponse> totals, String eventId, OffsetDateTime createdTime) {
+ this.ucp = ucp;
+ this.id = id;
+ this.checkoutId = checkoutId;
+ this.permalinkUrl = permalinkUrl;
+ this.lineItems = lineItems;
+ this.fulfillment = fulfillment;
+ this.totals = totals;
+ this.eventId = eventId;
+ this.createdTime = createdTime;
+ }
+
+ public OrderEventWebhookRequest ucp(UCPOrderResponse ucp) {
+ this.ucp = ucp;
+ return this;
+ }
+
+ /**
+ * Get ucp
+ * @return ucp
+ */
+ @NotNull @Valid
+ @Schema(name = "ucp", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("ucp")
+ public UCPOrderResponse getUcp() {
+ return ucp;
+ }
+
+ public void setUcp(UCPOrderResponse ucp) {
+ this.ucp = ucp;
+ }
+
+ public OrderEventWebhookRequest id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Unique order identifier.
+ * @return id
+ */
+ @NotNull
+ @Schema(name = "id", description = "Unique order identifier.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("id")
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public OrderEventWebhookRequest checkoutId(String checkoutId) {
+ this.checkoutId = checkoutId;
+ return this;
+ }
+
+ /**
+ * Associated checkout ID for reconciliation.
+ * @return checkoutId
+ */
+ @NotNull
+ @Schema(name = "checkout_id", description = "Associated checkout ID for reconciliation.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("checkout_id")
+ public String getCheckoutId() {
+ return checkoutId;
+ }
+
+ public void setCheckoutId(String checkoutId) {
+ this.checkoutId = checkoutId;
+ }
+
+ public OrderEventWebhookRequest permalinkUrl(URI permalinkUrl) {
+ this.permalinkUrl = permalinkUrl;
+ return this;
+ }
+
+ /**
+ * Permalink to access the order on merchant site.
+ * @return permalinkUrl
+ */
+ @NotNull @Valid
+ @Schema(name = "permalink_url", description = "Permalink to access the order on merchant site.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("permalink_url")
+ public URI getPermalinkUrl() {
+ return permalinkUrl;
+ }
+
+ public void setPermalinkUrl(URI permalinkUrl) {
+ this.permalinkUrl = permalinkUrl;
+ }
+
+ public OrderEventWebhookRequest lineItems(List<@Valid OrderLineItem> lineItems) {
+ this.lineItems = lineItems;
+ return this;
+ }
+
+ public OrderEventWebhookRequest addLineItemsItem(OrderLineItem lineItemsItem) {
+ if (this.lineItems == null) {
+ this.lineItems = new ArrayList<>();
+ }
+ this.lineItems.add(lineItemsItem);
+ return this;
+ }
+
+ /**
+ * Immutable line items — source of truth for what was ordered.
+ * @return lineItems
+ */
+ @NotNull @Valid
+ @Schema(name = "line_items", description = "Immutable line items — source of truth for what was ordered.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("line_items")
+ public List<@Valid OrderLineItem> getLineItems() {
+ return lineItems;
+ }
+
+ public void setLineItems(List<@Valid OrderLineItem> lineItems) {
+ this.lineItems = lineItems;
+ }
+
+ public OrderEventWebhookRequest fulfillment(OrderFulfillment fulfillment) {
+ this.fulfillment = fulfillment;
+ return this;
+ }
+
+ /**
+ * Get fulfillment
+ * @return fulfillment
+ */
+ @NotNull @Valid
+ @Schema(name = "fulfillment", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("fulfillment")
+ public OrderFulfillment getFulfillment() {
+ return fulfillment;
+ }
+
+ public void setFulfillment(OrderFulfillment fulfillment) {
+ this.fulfillment = fulfillment;
+ }
+
+ public OrderEventWebhookRequest adjustments(List<@Valid Adjustment> adjustments) {
+ this.adjustments = adjustments;
+ return this;
+ }
+
+ public OrderEventWebhookRequest addAdjustmentsItem(Adjustment adjustmentsItem) {
+ if (this.adjustments == null) {
+ this.adjustments = new ArrayList<>();
+ }
+ this.adjustments.add(adjustmentsItem);
+ return this;
+ }
+
+ /**
+ * Append-only event log of money movements (refunds, returns, credits, disputes, cancellations, etc.) that exist independently of fulfillment.
+ * @return adjustments
+ */
+ @Valid
+ @Schema(name = "adjustments", description = "Append-only event log of money movements (refunds, returns, credits, disputes, cancellations, etc.) that exist independently of fulfillment.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("adjustments")
+ public List<@Valid Adjustment> getAdjustments() {
+ return adjustments;
+ }
+
+ public void setAdjustments(List<@Valid Adjustment> adjustments) {
+ this.adjustments = adjustments;
+ }
+
+ public OrderEventWebhookRequest totals(List<@Valid TotalResponse> totals) {
+ this.totals = totals;
+ return this;
+ }
+
+ public OrderEventWebhookRequest addTotalsItem(TotalResponse totalsItem) {
+ if (this.totals == null) {
+ this.totals = new ArrayList<>();
+ }
+ this.totals.add(totalsItem);
+ return this;
+ }
+
+ /**
+ * Different totals for the order.
+ * @return totals
+ */
+ @NotNull @Valid
+ @Schema(name = "totals", description = "Different totals for the order.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("totals")
+ public List<@Valid TotalResponse> getTotals() {
+ return totals;
+ }
+
+ public void setTotals(List<@Valid TotalResponse> totals) {
+ this.totals = totals;
+ }
+
+ public OrderEventWebhookRequest eventId(String eventId) {
+ this.eventId = eventId;
+ return this;
+ }
+
+ /**
+ * Unique event identifier.
+ * @return eventId
+ */
+ @NotNull
+ @Schema(name = "event_id", description = "Unique event identifier.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("event_id")
+ public String getEventId() {
+ return eventId;
+ }
+
+ public void setEventId(String eventId) {
+ this.eventId = eventId;
+ }
+
+ public OrderEventWebhookRequest createdTime(OffsetDateTime createdTime) {
+ this.createdTime = createdTime;
+ return this;
+ }
+
+ /**
+ * Event creation timestamp in RFC 3339 format.
+ * @return createdTime
+ */
+ @NotNull @Valid
+ @Schema(name = "created_time", description = "Event creation timestamp in RFC 3339 format.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("created_time")
+ public OffsetDateTime getCreatedTime() {
+ return createdTime;
+ }
+
+ public void setCreatedTime(OffsetDateTime createdTime) {
+ this.createdTime = createdTime;
+ }
+ /**
+ * A container for additional, undeclared properties.
+ * This is a holder for any undeclared properties as specified with
+ * the 'additionalProperties' keyword in the OAS document.
+ */
+ private Map additionalProperties;
+
+ /**
+ * Set the additional (undeclared) property with the specified name and value.
+ * If the property does not already exist, create it otherwise replace it.
+ */
+ @JsonAnySetter
+ public OrderEventWebhookRequest putAdditionalProperty(String key, JsonNode value) {
+ if (this.additionalProperties == null) {
+ this.additionalProperties = new HashMap();
+ }
+ this.additionalProperties.put(key, value);
+ return this;
+ }
+
+ /**
+ * Return the additional (undeclared) property.
+ */
+ @JsonAnyGetter
+ public Map getAdditionalProperties() {
+ return additionalProperties;
+ }
+
+ /**
+ * Return the additional (undeclared) property with the specified name.
+ */
+ public JsonNode getAdditionalProperty(String key) {
+ if (this.additionalProperties == null) {
+ return null;
+ }
+ return this.additionalProperties.get(key);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ OrderEventWebhookRequest orderEventWebhookRequest = (OrderEventWebhookRequest) o;
+ return Objects.equals(this.ucp, orderEventWebhookRequest.ucp) &&
+ Objects.equals(this.id, orderEventWebhookRequest.id) &&
+ Objects.equals(this.checkoutId, orderEventWebhookRequest.checkoutId) &&
+ Objects.equals(this.permalinkUrl, orderEventWebhookRequest.permalinkUrl) &&
+ Objects.equals(this.lineItems, orderEventWebhookRequest.lineItems) &&
+ Objects.equals(this.fulfillment, orderEventWebhookRequest.fulfillment) &&
+ Objects.equals(this.adjustments, orderEventWebhookRequest.adjustments) &&
+ Objects.equals(this.totals, orderEventWebhookRequest.totals) &&
+ Objects.equals(this.eventId, orderEventWebhookRequest.eventId) &&
+ Objects.equals(this.createdTime, orderEventWebhookRequest.createdTime) &&
+ Objects.equals(this.additionalProperties, orderEventWebhookRequest.additionalProperties);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(ucp, id, checkoutId, permalinkUrl, lineItems, fulfillment, adjustments, totals, eventId, createdTime, additionalProperties);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class OrderEventWebhookRequest {\n");
+ sb.append(" ucp: ").append(toIndentedString(ucp)).append("\n");
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" checkoutId: ").append(toIndentedString(checkoutId)).append("\n");
+ sb.append(" permalinkUrl: ").append(toIndentedString(permalinkUrl)).append("\n");
+ sb.append(" lineItems: ").append(toIndentedString(lineItems)).append("\n");
+ sb.append(" fulfillment: ").append(toIndentedString(fulfillment)).append("\n");
+ sb.append(" adjustments: ").append(toIndentedString(adjustments)).append("\n");
+ sb.append(" totals: ").append(toIndentedString(totals)).append("\n");
+ sb.append(" eventId: ").append(toIndentedString(eventId)).append("\n");
+ sb.append(" createdTime: ").append(toIndentedString(createdTime)).append("\n");
+
+ sb.append(" additionalProperties: ").append(toIndentedString(additionalProperties)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private OrderEventWebhookRequest instance;
+
+ public Builder() {
+ this(new OrderEventWebhookRequest());
+ }
+
+ protected Builder(OrderEventWebhookRequest instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(OrderEventWebhookRequest value) {
+ this.instance.setUcp(value.ucp);
+ this.instance.setId(value.id);
+ this.instance.setCheckoutId(value.checkoutId);
+ this.instance.setPermalinkUrl(value.permalinkUrl);
+ this.instance.setLineItems(value.lineItems);
+ this.instance.setFulfillment(value.fulfillment);
+ this.instance.setAdjustments(value.adjustments);
+ this.instance.setTotals(value.totals);
+ this.instance.setEventId(value.eventId);
+ this.instance.setCreatedTime(value.createdTime);
+ return this;
+ }
+
+ public OrderEventWebhookRequest.Builder ucp(UCPOrderResponse ucp) {
+ this.instance.ucp(ucp);
+ return this;
+ }
+
+ public OrderEventWebhookRequest.Builder id(String id) {
+ this.instance.id(id);
+ return this;
+ }
+
+ public OrderEventWebhookRequest.Builder checkoutId(String checkoutId) {
+ this.instance.checkoutId(checkoutId);
+ return this;
+ }
+
+ public OrderEventWebhookRequest.Builder permalinkUrl(URI permalinkUrl) {
+ this.instance.permalinkUrl(permalinkUrl);
+ return this;
+ }
+
+ public OrderEventWebhookRequest.Builder lineItems(List lineItems) {
+ this.instance.lineItems(lineItems);
+ return this;
+ }
+
+ public OrderEventWebhookRequest.Builder fulfillment(OrderFulfillment fulfillment) {
+ this.instance.fulfillment(fulfillment);
+ return this;
+ }
+
+ public OrderEventWebhookRequest.Builder adjustments(List adjustments) {
+ this.instance.adjustments(adjustments);
+ return this;
+ }
+
+ public OrderEventWebhookRequest.Builder totals(List totals) {
+ this.instance.totals(totals);
+ return this;
+ }
+
+ public OrderEventWebhookRequest.Builder eventId(String eventId) {
+ this.instance.eventId(eventId);
+ return this;
+ }
+
+ public OrderEventWebhookRequest.Builder createdTime(OffsetDateTime createdTime) {
+ this.instance.createdTime(createdTime);
+ return this;
+ }
+
+ public OrderEventWebhookRequest.Builder additionalProperties(Map additionalProperties) {
+ this.instance.additionalProperties = additionalProperties;
+ return this;
+ }
+
+ /**
+ * returns a built OrderEventWebhookRequest instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public OrderEventWebhookRequest build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static OrderEventWebhookRequest.Builder builder() {
+ return new OrderEventWebhookRequest.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public OrderEventWebhookRequest.Builder toBuilder() {
+ OrderEventWebhookRequest.Builder builder = new OrderEventWebhookRequest.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/OrderFulfillment.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/OrderFulfillment.java
new file mode 100644
index 0000000..ada92c0
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/OrderFulfillment.java
@@ -0,0 +1,213 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.Expectation;
+import com.dev.ucp.service.shopping.model.FulfillmentEvent;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * Fulfillment data: buyer expectations and what actually happened.
+ */
+
+@Schema(name = "order_fulfillment", description = "Fulfillment data: buyer expectations and what actually happened.")
+@JsonTypeName("order_fulfillment")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class OrderFulfillment {
+
+ @Valid
+ private List<@Valid Expectation> expectations = new ArrayList<>();
+
+ @Valid
+ private List<@Valid FulfillmentEvent> events = new ArrayList<>();
+
+ public OrderFulfillment expectations(List<@Valid Expectation> expectations) {
+ this.expectations = expectations;
+ return this;
+ }
+
+ public OrderFulfillment addExpectationsItem(Expectation expectationsItem) {
+ if (this.expectations == null) {
+ this.expectations = new ArrayList<>();
+ }
+ this.expectations.add(expectationsItem);
+ return this;
+ }
+
+ /**
+ * Buyer-facing groups representing when/how items will be delivered. Can be split, merged, or adjusted post-order.
+ * @return expectations
+ */
+ @Valid
+ @Schema(name = "expectations", description = "Buyer-facing groups representing when/how items will be delivered. Can be split, merged, or adjusted post-order.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("expectations")
+ public List<@Valid Expectation> getExpectations() {
+ return expectations;
+ }
+
+ public void setExpectations(List<@Valid Expectation> expectations) {
+ this.expectations = expectations;
+ }
+
+ public OrderFulfillment events(List<@Valid FulfillmentEvent> events) {
+ this.events = events;
+ return this;
+ }
+
+ public OrderFulfillment addEventsItem(FulfillmentEvent eventsItem) {
+ if (this.events == null) {
+ this.events = new ArrayList<>();
+ }
+ this.events.add(eventsItem);
+ return this;
+ }
+
+ /**
+ * Append-only event log of actual shipments. Each event references line items by ID.
+ * @return events
+ */
+ @Valid
+ @Schema(name = "events", description = "Append-only event log of actual shipments. Each event references line items by ID.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("events")
+ public List<@Valid FulfillmentEvent> getEvents() {
+ return events;
+ }
+
+ public void setEvents(List<@Valid FulfillmentEvent> events) {
+ this.events = events;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ OrderFulfillment orderFulfillment = (OrderFulfillment) o;
+ return Objects.equals(this.expectations, orderFulfillment.expectations) &&
+ Objects.equals(this.events, orderFulfillment.events);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(expectations, events);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class OrderFulfillment {\n");
+ sb.append(" expectations: ").append(toIndentedString(expectations)).append("\n");
+ sb.append(" events: ").append(toIndentedString(events)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private OrderFulfillment instance;
+
+ public Builder() {
+ this(new OrderFulfillment());
+ }
+
+ protected Builder(OrderFulfillment instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(OrderFulfillment value) {
+ this.instance.setExpectations(value.expectations);
+ this.instance.setEvents(value.events);
+ return this;
+ }
+
+ public OrderFulfillment.Builder expectations(List expectations) {
+ this.instance.expectations(expectations);
+ return this;
+ }
+
+ public OrderFulfillment.Builder events(List events) {
+ this.instance.events(events);
+ return this;
+ }
+
+ /**
+ * returns a built OrderFulfillment instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public OrderFulfillment build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static OrderFulfillment.Builder builder() {
+ return new OrderFulfillment.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public OrderFulfillment.Builder toBuilder() {
+ OrderFulfillment.Builder builder = new OrderFulfillment.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/OrderLineItem.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/OrderLineItem.java
new file mode 100644
index 0000000..5995e4d
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/OrderLineItem.java
@@ -0,0 +1,377 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.ItemResponse;
+import com.dev.ucp.service.shopping.model.OrderLineItemQuantity;
+import com.dev.ucp.service.shopping.model.TotalResponse;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * OrderLineItem
+ */
+
+@JsonTypeName("Order_Line_Item")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class OrderLineItem {
+
+ private String id;
+
+ private ItemResponse item;
+
+ private OrderLineItemQuantity quantity;
+
+ @Valid
+ private List<@Valid TotalResponse> totals = new ArrayList<>();
+
+ /**
+ * Derived status: fulfilled if quantity.fulfilled == quantity.total, partial if quantity.fulfilled > 0, otherwise processing.
+ */
+ public enum StatusEnum {
+ PROCESSING("processing"),
+
+ PARTIAL("partial"),
+
+ FULFILLED("fulfilled");
+
+ private final String value;
+
+ StatusEnum(String value) {
+ this.value = value;
+ }
+
+ @JsonValue
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+
+ @JsonCreator
+ public static StatusEnum fromValue(String value) {
+ for (StatusEnum b : StatusEnum.values()) {
+ if (b.value.equals(value)) {
+ return b;
+ }
+ }
+ throw new IllegalArgumentException("Unexpected value '" + value + "'");
+ }
+ }
+
+ private StatusEnum status;
+
+ private @Nullable String parentId;
+
+ public OrderLineItem() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public OrderLineItem(String id, ItemResponse item, OrderLineItemQuantity quantity, List<@Valid TotalResponse> totals, StatusEnum status) {
+ this.id = id;
+ this.item = item;
+ this.quantity = quantity;
+ this.totals = totals;
+ this.status = status;
+ }
+
+ public OrderLineItem id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Line item identifier.
+ * @return id
+ */
+ @NotNull
+ @Schema(name = "id", description = "Line item identifier.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("id")
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public OrderLineItem item(ItemResponse item) {
+ this.item = item;
+ return this;
+ }
+
+ /**
+ * Get item
+ * @return item
+ */
+ @NotNull @Valid
+ @Schema(name = "item", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("item")
+ public ItemResponse getItem() {
+ return item;
+ }
+
+ public void setItem(ItemResponse item) {
+ this.item = item;
+ }
+
+ public OrderLineItem quantity(OrderLineItemQuantity quantity) {
+ this.quantity = quantity;
+ return this;
+ }
+
+ /**
+ * Get quantity
+ * @return quantity
+ */
+ @NotNull @Valid
+ @Schema(name = "quantity", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("quantity")
+ public OrderLineItemQuantity getQuantity() {
+ return quantity;
+ }
+
+ public void setQuantity(OrderLineItemQuantity quantity) {
+ this.quantity = quantity;
+ }
+
+ public OrderLineItem totals(List<@Valid TotalResponse> totals) {
+ this.totals = totals;
+ return this;
+ }
+
+ public OrderLineItem addTotalsItem(TotalResponse totalsItem) {
+ if (this.totals == null) {
+ this.totals = new ArrayList<>();
+ }
+ this.totals.add(totalsItem);
+ return this;
+ }
+
+ /**
+ * Line item totals breakdown.
+ * @return totals
+ */
+ @NotNull @Valid
+ @Schema(name = "totals", description = "Line item totals breakdown.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("totals")
+ public List<@Valid TotalResponse> getTotals() {
+ return totals;
+ }
+
+ public void setTotals(List<@Valid TotalResponse> totals) {
+ this.totals = totals;
+ }
+
+ public OrderLineItem status(StatusEnum status) {
+ this.status = status;
+ return this;
+ }
+
+ /**
+ * Derived status: fulfilled if quantity.fulfilled == quantity.total, partial if quantity.fulfilled > 0, otherwise processing.
+ * @return status
+ */
+ @NotNull
+ @Schema(name = "status", description = "Derived status: fulfilled if quantity.fulfilled == quantity.total, partial if quantity.fulfilled > 0, otherwise processing.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("status")
+ public StatusEnum getStatus() {
+ return status;
+ }
+
+ public void setStatus(StatusEnum status) {
+ this.status = status;
+ }
+
+ public OrderLineItem parentId(@Nullable String parentId) {
+ this.parentId = parentId;
+ return this;
+ }
+
+ /**
+ * Parent line item identifier for any nested structures.
+ * @return parentId
+ */
+
+ @Schema(name = "parent_id", description = "Parent line item identifier for any nested structures.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("parent_id")
+ public @Nullable String getParentId() {
+ return parentId;
+ }
+
+ public void setParentId(@Nullable String parentId) {
+ this.parentId = parentId;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ OrderLineItem orderLineItem = (OrderLineItem) o;
+ return Objects.equals(this.id, orderLineItem.id) &&
+ Objects.equals(this.item, orderLineItem.item) &&
+ Objects.equals(this.quantity, orderLineItem.quantity) &&
+ Objects.equals(this.totals, orderLineItem.totals) &&
+ Objects.equals(this.status, orderLineItem.status) &&
+ Objects.equals(this.parentId, orderLineItem.parentId);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, item, quantity, totals, status, parentId);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class OrderLineItem {\n");
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" item: ").append(toIndentedString(item)).append("\n");
+ sb.append(" quantity: ").append(toIndentedString(quantity)).append("\n");
+ sb.append(" totals: ").append(toIndentedString(totals)).append("\n");
+ sb.append(" status: ").append(toIndentedString(status)).append("\n");
+ sb.append(" parentId: ").append(toIndentedString(parentId)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private OrderLineItem instance;
+
+ public Builder() {
+ this(new OrderLineItem());
+ }
+
+ protected Builder(OrderLineItem instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(OrderLineItem value) {
+ this.instance.setId(value.id);
+ this.instance.setItem(value.item);
+ this.instance.setQuantity(value.quantity);
+ this.instance.setTotals(value.totals);
+ this.instance.setStatus(value.status);
+ this.instance.setParentId(value.parentId);
+ return this;
+ }
+
+ public OrderLineItem.Builder id(String id) {
+ this.instance.id(id);
+ return this;
+ }
+
+ public OrderLineItem.Builder item(ItemResponse item) {
+ this.instance.item(item);
+ return this;
+ }
+
+ public OrderLineItem.Builder quantity(OrderLineItemQuantity quantity) {
+ this.instance.quantity(quantity);
+ return this;
+ }
+
+ public OrderLineItem.Builder totals(List totals) {
+ this.instance.totals(totals);
+ return this;
+ }
+
+ public OrderLineItem.Builder status(StatusEnum status) {
+ this.instance.status(status);
+ return this;
+ }
+
+ public OrderLineItem.Builder parentId(String parentId) {
+ this.instance.parentId(parentId);
+ return this;
+ }
+
+ /**
+ * returns a built OrderLineItem instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public OrderLineItem build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static OrderLineItem.Builder builder() {
+ return new OrderLineItem.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public OrderLineItem.Builder toBuilder() {
+ OrderLineItem.Builder builder = new OrderLineItem.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/OrderLineItemQuantity.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/OrderLineItemQuantity.java
new file mode 100644
index 0000000..b7163e2
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/OrderLineItemQuantity.java
@@ -0,0 +1,204 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * Quantity tracking. Both total and fulfilled are derived from events.
+ */
+
+@Schema(name = "Order_Line_Item_quantity", description = "Quantity tracking. Both total and fulfilled are derived from events.")
+@JsonTypeName("Order_Line_Item_quantity")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class OrderLineItemQuantity {
+
+ private Integer total;
+
+ private Integer fulfilled;
+
+ public OrderLineItemQuantity() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public OrderLineItemQuantity(Integer total, Integer fulfilled) {
+ this.total = total;
+ this.fulfilled = fulfilled;
+ }
+
+ public OrderLineItemQuantity total(Integer total) {
+ this.total = total;
+ return this;
+ }
+
+ /**
+ * Current total quantity.
+ * minimum: 0
+ * @return total
+ */
+ @NotNull @Min(value = 0)
+ @Schema(name = "total", description = "Current total quantity.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("total")
+ public Integer getTotal() {
+ return total;
+ }
+
+ public void setTotal(Integer total) {
+ this.total = total;
+ }
+
+ public OrderLineItemQuantity fulfilled(Integer fulfilled) {
+ this.fulfilled = fulfilled;
+ return this;
+ }
+
+ /**
+ * Quantity fulfilled (sum from fulfillment events).
+ * minimum: 0
+ * @return fulfilled
+ */
+ @NotNull @Min(value = 0)
+ @Schema(name = "fulfilled", description = "Quantity fulfilled (sum from fulfillment events).", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("fulfilled")
+ public Integer getFulfilled() {
+ return fulfilled;
+ }
+
+ public void setFulfilled(Integer fulfilled) {
+ this.fulfilled = fulfilled;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ OrderLineItemQuantity orderLineItemQuantity = (OrderLineItemQuantity) o;
+ return Objects.equals(this.total, orderLineItemQuantity.total) &&
+ Objects.equals(this.fulfilled, orderLineItemQuantity.fulfilled);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(total, fulfilled);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class OrderLineItemQuantity {\n");
+ sb.append(" total: ").append(toIndentedString(total)).append("\n");
+ sb.append(" fulfilled: ").append(toIndentedString(fulfilled)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private OrderLineItemQuantity instance;
+
+ public Builder() {
+ this(new OrderLineItemQuantity());
+ }
+
+ protected Builder(OrderLineItemQuantity instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(OrderLineItemQuantity value) {
+ this.instance.setTotal(value.total);
+ this.instance.setFulfilled(value.fulfilled);
+ return this;
+ }
+
+ public OrderLineItemQuantity.Builder total(Integer total) {
+ this.instance.total(total);
+ return this;
+ }
+
+ public OrderLineItemQuantity.Builder fulfilled(Integer fulfilled) {
+ this.instance.fulfilled(fulfilled);
+ return this;
+ }
+
+ /**
+ * returns a built OrderLineItemQuantity instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public OrderLineItemQuantity build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static OrderLineItemQuantity.Builder builder() {
+ return new OrderLineItemQuantity.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public OrderLineItemQuantity.Builder toBuilder() {
+ OrderLineItemQuantity.Builder builder = new OrderLineItemQuantity.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/PaymentCreateRequest.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/PaymentCreateRequest.java
new file mode 100644
index 0000000..c31890e
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/PaymentCreateRequest.java
@@ -0,0 +1,203 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.CardPaymentInstrument;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * Payment configuration containing handlers.
+ */
+
+@Schema(name = "Payment_Create_Request", description = "Payment configuration containing handlers.")
+@JsonTypeName("Payment_Create_Request")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class PaymentCreateRequest {
+
+ private @Nullable String selectedInstrumentId;
+
+ @Valid
+ private List instruments = new ArrayList<>();
+
+ public PaymentCreateRequest selectedInstrumentId(@Nullable String selectedInstrumentId) {
+ this.selectedInstrumentId = selectedInstrumentId;
+ return this;
+ }
+
+ /**
+ * The id of the currently selected payment instrument from the instruments array. Set by the agent when submitting payment, and echoed back by the merchant in finalized state.
+ * @return selectedInstrumentId
+ */
+
+ @Schema(name = "selected_instrument_id", description = "The id of the currently selected payment instrument from the instruments array. Set by the agent when submitting payment, and echoed back by the merchant in finalized state.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("selected_instrument_id")
+ public @Nullable String getSelectedInstrumentId() {
+ return selectedInstrumentId;
+ }
+
+ public void setSelectedInstrumentId(@Nullable String selectedInstrumentId) {
+ this.selectedInstrumentId = selectedInstrumentId;
+ }
+
+ public PaymentCreateRequest instruments(List instruments) {
+ this.instruments = instruments;
+ return this;
+ }
+
+ public PaymentCreateRequest addInstrumentsItem(CardPaymentInstrument instrumentsItem) {
+ if (this.instruments == null) {
+ this.instruments = new ArrayList<>();
+ }
+ this.instruments.add(instrumentsItem);
+ return this;
+ }
+
+ /**
+ * The payment instruments available for this payment. Each instrument is associated with a specific handler via the handler_id field. Handlers can extend the base payment_instrument schema to add handler-specific fields.
+ * @return instruments
+ */
+ @Valid
+ @Schema(name = "instruments", description = "The payment instruments available for this payment. Each instrument is associated with a specific handler via the handler_id field. Handlers can extend the base payment_instrument schema to add handler-specific fields.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("instruments")
+ public List getInstruments() {
+ return instruments;
+ }
+
+ public void setInstruments(List instruments) {
+ this.instruments = instruments;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ PaymentCreateRequest paymentCreateRequest = (PaymentCreateRequest) o;
+ return Objects.equals(this.selectedInstrumentId, paymentCreateRequest.selectedInstrumentId) &&
+ Objects.equals(this.instruments, paymentCreateRequest.instruments);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(selectedInstrumentId, instruments);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class PaymentCreateRequest {\n");
+ sb.append(" selectedInstrumentId: ").append(toIndentedString(selectedInstrumentId)).append("\n");
+ sb.append(" instruments: ").append(toIndentedString(instruments)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private PaymentCreateRequest instance;
+
+ public Builder() {
+ this(new PaymentCreateRequest());
+ }
+
+ protected Builder(PaymentCreateRequest instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(PaymentCreateRequest value) {
+ this.instance.setSelectedInstrumentId(value.selectedInstrumentId);
+ this.instance.setInstruments(value.instruments);
+ return this;
+ }
+
+ public PaymentCreateRequest.Builder selectedInstrumentId(String selectedInstrumentId) {
+ this.instance.selectedInstrumentId(selectedInstrumentId);
+ return this;
+ }
+
+ public PaymentCreateRequest.Builder instruments(List instruments) {
+ this.instance.instruments(instruments);
+ return this;
+ }
+
+ /**
+ * returns a built PaymentCreateRequest instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public PaymentCreateRequest build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static PaymentCreateRequest.Builder builder() {
+ return new PaymentCreateRequest.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public PaymentCreateRequest.Builder toBuilder() {
+ PaymentCreateRequest.Builder builder = new PaymentCreateRequest.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/PaymentCredential.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/PaymentCredential.java
new file mode 100644
index 0000000..1bebcbe
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/PaymentCredential.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.CardCredential;
+import com.dev.ucp.service.shopping.model.TokenCredentialResponse;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.annotation.JsonValue;
+import com.fasterxml.jackson.databind.JsonNode;
+import org.springframework.lang.Nullable;
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+import java.util.Map;
+import java.util.HashMap;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public interface PaymentCredential {
+}
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/PaymentData.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/PaymentData.java
new file mode 100644
index 0000000..7cade88
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/PaymentData.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.CardPaymentInstrument;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * The data that will used to submit payment to the merchant.
+ */
+
+@Schema(name = "payment_data", description = "The data that will used to submit payment to the merchant.")
+@JsonTypeName("payment_data")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class PaymentData {
+
+ private CardPaymentInstrument paymentData;
+
+ public PaymentData() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public PaymentData(CardPaymentInstrument paymentData) {
+ this.paymentData = paymentData;
+ }
+
+ public PaymentData paymentData(CardPaymentInstrument paymentData) {
+ this.paymentData = paymentData;
+ return this;
+ }
+
+ /**
+ * Get paymentData
+ * @return paymentData
+ */
+ @NotNull @Valid
+ @Schema(name = "payment_data", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("payment_data")
+ public CardPaymentInstrument getPaymentData() {
+ return paymentData;
+ }
+
+ public void setPaymentData(CardPaymentInstrument paymentData) {
+ this.paymentData = paymentData;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ PaymentData paymentData = (PaymentData) o;
+ return Objects.equals(this.paymentData, paymentData.paymentData);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(paymentData);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class PaymentData {\n");
+ sb.append(" paymentData: ").append(toIndentedString(paymentData)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private PaymentData instance;
+
+ public Builder() {
+ this(new PaymentData());
+ }
+
+ protected Builder(PaymentData instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(PaymentData value) {
+ this.instance.setPaymentData(value.paymentData);
+ return this;
+ }
+
+ public PaymentData.Builder paymentData(CardPaymentInstrument paymentData) {
+ this.instance.paymentData(paymentData);
+ return this;
+ }
+
+ /**
+ * returns a built PaymentData instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public PaymentData build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static PaymentData.Builder builder() {
+ return new PaymentData.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public PaymentData.Builder toBuilder() {
+ PaymentData.Builder builder = new PaymentData.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/PaymentHandlerResponse.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/PaymentHandlerResponse.java
new file mode 100644
index 0000000..c3d595e
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/PaymentHandlerResponse.java
@@ -0,0 +1,381 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.databind.JsonNode;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * PaymentHandlerResponse
+ */
+
+@JsonTypeName("Payment_Handler_Response")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class PaymentHandlerResponse {
+
+ private String id;
+
+ private String name;
+
+ private String version;
+
+ private URI spec;
+
+ private URI configSchema;
+
+ @Valid
+ private List instrumentSchemas = new ArrayList<>();
+
+ @Valid
+ private Map config = new HashMap<>();
+
+ public PaymentHandlerResponse() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public PaymentHandlerResponse(String id, String name, String version, URI spec, URI configSchema, List instrumentSchemas, Map config) {
+ this.id = id;
+ this.name = name;
+ this.version = version;
+ this.spec = spec;
+ this.configSchema = configSchema;
+ this.instrumentSchemas = instrumentSchemas;
+ this.config = config;
+ }
+
+ public PaymentHandlerResponse id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * The unique identifier for this handler instance within the payment.handlers. Used by payment instruments to reference which handler produced them.
+ * @return id
+ */
+ @NotNull
+ @Schema(name = "id", description = "The unique identifier for this handler instance within the payment.handlers. Used by payment instruments to reference which handler produced them.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("id")
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public PaymentHandlerResponse name(String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * The specification name using reverse-DNS format. For example, dev.ucp.delegate_payment.
+ * @return name
+ */
+ @NotNull
+ @Schema(name = "name", description = "The specification name using reverse-DNS format. For example, dev.ucp.delegate_payment.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("name")
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public PaymentHandlerResponse version(String version) {
+ this.version = version;
+ return this;
+ }
+
+ /**
+ * Handler version in YYYY-MM-DD format.
+ * @return version
+ */
+ @NotNull @Pattern(regexp = "^\\d{4}-\\d{2}-\\d{2}$")
+ @Schema(name = "version", description = "Handler version in YYYY-MM-DD format.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("version")
+ public String getVersion() {
+ return version;
+ }
+
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+ public PaymentHandlerResponse spec(URI spec) {
+ this.spec = spec;
+ return this;
+ }
+
+ /**
+ * A URI pointing to the technical specification or schema that defines how this handler operates.
+ * @return spec
+ */
+ @NotNull @Valid
+ @Schema(name = "spec", description = "A URI pointing to the technical specification or schema that defines how this handler operates.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("spec")
+ public URI getSpec() {
+ return spec;
+ }
+
+ public void setSpec(URI spec) {
+ this.spec = spec;
+ }
+
+ public PaymentHandlerResponse configSchema(URI configSchema) {
+ this.configSchema = configSchema;
+ return this;
+ }
+
+ /**
+ * A URI pointing to a JSON Schema used to validate the structure of the config object.
+ * @return configSchema
+ */
+ @NotNull @Valid
+ @Schema(name = "config_schema", description = "A URI pointing to a JSON Schema used to validate the structure of the config object.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("config_schema")
+ public URI getConfigSchema() {
+ return configSchema;
+ }
+
+ public void setConfigSchema(URI configSchema) {
+ this.configSchema = configSchema;
+ }
+
+ public PaymentHandlerResponse instrumentSchemas(List instrumentSchemas) {
+ this.instrumentSchemas = instrumentSchemas;
+ return this;
+ }
+
+ public PaymentHandlerResponse addInstrumentSchemasItem(URI instrumentSchemasItem) {
+ if (this.instrumentSchemas == null) {
+ this.instrumentSchemas = new ArrayList<>();
+ }
+ this.instrumentSchemas.add(instrumentSchemasItem);
+ return this;
+ }
+
+ /**
+ * Get instrumentSchemas
+ * @return instrumentSchemas
+ */
+ @NotNull @Valid
+ @Schema(name = "instrument_schemas", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("instrument_schemas")
+ public List getInstrumentSchemas() {
+ return instrumentSchemas;
+ }
+
+ public void setInstrumentSchemas(List instrumentSchemas) {
+ this.instrumentSchemas = instrumentSchemas;
+ }
+
+ public PaymentHandlerResponse config(Map config) {
+ this.config = config;
+ return this;
+ }
+
+ public PaymentHandlerResponse putConfigItem(String key, JsonNode configItem) {
+ if (this.config == null) {
+ this.config = new HashMap<>();
+ }
+ this.config.put(key, configItem);
+ return this;
+ }
+
+ /**
+ * A dictionary containing provider-specific configuration details, such as merchant IDs, supported networks, or gateway credentials.
+ * @return config
+ */
+ @NotNull @Valid
+ @Schema(name = "config", description = "A dictionary containing provider-specific configuration details, such as merchant IDs, supported networks, or gateway credentials.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("config")
+ public Map getConfig() {
+ return config;
+ }
+
+ public void setConfig(Map config) {
+ this.config = config;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ PaymentHandlerResponse paymentHandlerResponse = (PaymentHandlerResponse) o;
+ return Objects.equals(this.id, paymentHandlerResponse.id) &&
+ Objects.equals(this.name, paymentHandlerResponse.name) &&
+ Objects.equals(this.version, paymentHandlerResponse.version) &&
+ Objects.equals(this.spec, paymentHandlerResponse.spec) &&
+ Objects.equals(this.configSchema, paymentHandlerResponse.configSchema) &&
+ Objects.equals(this.instrumentSchemas, paymentHandlerResponse.instrumentSchemas) &&
+ Objects.equals(this.config, paymentHandlerResponse.config);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, name, version, spec, configSchema, instrumentSchemas, config);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class PaymentHandlerResponse {\n");
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" name: ").append(toIndentedString(name)).append("\n");
+ sb.append(" version: ").append(toIndentedString(version)).append("\n");
+ sb.append(" spec: ").append(toIndentedString(spec)).append("\n");
+ sb.append(" configSchema: ").append(toIndentedString(configSchema)).append("\n");
+ sb.append(" instrumentSchemas: ").append(toIndentedString(instrumentSchemas)).append("\n");
+ sb.append(" config: ").append(toIndentedString(config)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private PaymentHandlerResponse instance;
+
+ public Builder() {
+ this(new PaymentHandlerResponse());
+ }
+
+ protected Builder(PaymentHandlerResponse instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(PaymentHandlerResponse value) {
+ this.instance.setId(value.id);
+ this.instance.setName(value.name);
+ this.instance.setVersion(value.version);
+ this.instance.setSpec(value.spec);
+ this.instance.setConfigSchema(value.configSchema);
+ this.instance.setInstrumentSchemas(value.instrumentSchemas);
+ this.instance.setConfig(value.config);
+ return this;
+ }
+
+ public PaymentHandlerResponse.Builder id(String id) {
+ this.instance.id(id);
+ return this;
+ }
+
+ public PaymentHandlerResponse.Builder name(String name) {
+ this.instance.name(name);
+ return this;
+ }
+
+ public PaymentHandlerResponse.Builder version(String version) {
+ this.instance.version(version);
+ return this;
+ }
+
+ public PaymentHandlerResponse.Builder spec(URI spec) {
+ this.instance.spec(spec);
+ return this;
+ }
+
+ public PaymentHandlerResponse.Builder configSchema(URI configSchema) {
+ this.instance.configSchema(configSchema);
+ return this;
+ }
+
+ public PaymentHandlerResponse.Builder instrumentSchemas(List instrumentSchemas) {
+ this.instance.instrumentSchemas(instrumentSchemas);
+ return this;
+ }
+
+ public PaymentHandlerResponse.Builder config(Map config) {
+ this.instance.config(config);
+ return this;
+ }
+
+ /**
+ * returns a built PaymentHandlerResponse instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public PaymentHandlerResponse build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static PaymentHandlerResponse.Builder builder() {
+ return new PaymentHandlerResponse.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public PaymentHandlerResponse.Builder toBuilder() {
+ PaymentHandlerResponse.Builder builder = new PaymentHandlerResponse.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/PaymentResponse.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/PaymentResponse.java
new file mode 100644
index 0000000..2c05183
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/PaymentResponse.java
@@ -0,0 +1,254 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.CardPaymentInstrument;
+import com.dev.ucp.service.shopping.model.PaymentHandlerResponse;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * Payment configuration containing handlers.
+ */
+
+@Schema(name = "Payment_Response", description = "Payment configuration containing handlers.")
+@JsonTypeName("Payment_Response")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class PaymentResponse {
+
+ @Valid
+ private List<@Valid PaymentHandlerResponse> handlers = new ArrayList<>();
+
+ private @Nullable String selectedInstrumentId;
+
+ @Valid
+ private List instruments = new ArrayList<>();
+
+ public PaymentResponse() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public PaymentResponse(List<@Valid PaymentHandlerResponse> handlers) {
+ this.handlers = handlers;
+ }
+
+ public PaymentResponse handlers(List<@Valid PaymentHandlerResponse> handlers) {
+ this.handlers = handlers;
+ return this;
+ }
+
+ public PaymentResponse addHandlersItem(PaymentHandlerResponse handlersItem) {
+ if (this.handlers == null) {
+ this.handlers = new ArrayList<>();
+ }
+ this.handlers.add(handlersItem);
+ return this;
+ }
+
+ /**
+ * Processing configurations that define how payment instruments can be collected. Each handler specifies a tokenization or payment collection strategy.
+ * @return handlers
+ */
+ @NotNull @Valid
+ @Schema(name = "handlers", description = "Processing configurations that define how payment instruments can be collected. Each handler specifies a tokenization or payment collection strategy.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("handlers")
+ public List<@Valid PaymentHandlerResponse> getHandlers() {
+ return handlers;
+ }
+
+ public void setHandlers(List<@Valid PaymentHandlerResponse> handlers) {
+ this.handlers = handlers;
+ }
+
+ public PaymentResponse selectedInstrumentId(@Nullable String selectedInstrumentId) {
+ this.selectedInstrumentId = selectedInstrumentId;
+ return this;
+ }
+
+ /**
+ * The id of the currently selected payment instrument from the instruments array. Set by the agent when submitting payment, and echoed back by the merchant in finalized state.
+ * @return selectedInstrumentId
+ */
+
+ @Schema(name = "selected_instrument_id", description = "The id of the currently selected payment instrument from the instruments array. Set by the agent when submitting payment, and echoed back by the merchant in finalized state.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("selected_instrument_id")
+ public @Nullable String getSelectedInstrumentId() {
+ return selectedInstrumentId;
+ }
+
+ public void setSelectedInstrumentId(@Nullable String selectedInstrumentId) {
+ this.selectedInstrumentId = selectedInstrumentId;
+ }
+
+ public PaymentResponse instruments(List instruments) {
+ this.instruments = instruments;
+ return this;
+ }
+
+ public PaymentResponse addInstrumentsItem(CardPaymentInstrument instrumentsItem) {
+ if (this.instruments == null) {
+ this.instruments = new ArrayList<>();
+ }
+ this.instruments.add(instrumentsItem);
+ return this;
+ }
+
+ /**
+ * The payment instruments available for this payment. Each instrument is associated with a specific handler via the handler_id field. Handlers can extend the base payment_instrument schema to add handler-specific fields.
+ * @return instruments
+ */
+ @Valid
+ @Schema(name = "instruments", description = "The payment instruments available for this payment. Each instrument is associated with a specific handler via the handler_id field. Handlers can extend the base payment_instrument schema to add handler-specific fields.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("instruments")
+ public List getInstruments() {
+ return instruments;
+ }
+
+ public void setInstruments(List instruments) {
+ this.instruments = instruments;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ PaymentResponse paymentResponse = (PaymentResponse) o;
+ return Objects.equals(this.handlers, paymentResponse.handlers) &&
+ Objects.equals(this.selectedInstrumentId, paymentResponse.selectedInstrumentId) &&
+ Objects.equals(this.instruments, paymentResponse.instruments);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(handlers, selectedInstrumentId, instruments);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class PaymentResponse {\n");
+ sb.append(" handlers: ").append(toIndentedString(handlers)).append("\n");
+ sb.append(" selectedInstrumentId: ").append(toIndentedString(selectedInstrumentId)).append("\n");
+ sb.append(" instruments: ").append(toIndentedString(instruments)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private PaymentResponse instance;
+
+ public Builder() {
+ this(new PaymentResponse());
+ }
+
+ protected Builder(PaymentResponse instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(PaymentResponse value) {
+ this.instance.setHandlers(value.handlers);
+ this.instance.setSelectedInstrumentId(value.selectedInstrumentId);
+ this.instance.setInstruments(value.instruments);
+ return this;
+ }
+
+ public PaymentResponse.Builder handlers(List handlers) {
+ this.instance.handlers(handlers);
+ return this;
+ }
+
+ public PaymentResponse.Builder selectedInstrumentId(String selectedInstrumentId) {
+ this.instance.selectedInstrumentId(selectedInstrumentId);
+ return this;
+ }
+
+ public PaymentResponse.Builder instruments(List instruments) {
+ this.instance.instruments(instruments);
+ return this;
+ }
+
+ /**
+ * returns a built PaymentResponse instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public PaymentResponse build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static PaymentResponse.Builder builder() {
+ return new PaymentResponse.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public PaymentResponse.Builder toBuilder() {
+ PaymentResponse.Builder builder = new PaymentResponse.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/PaymentUpdateRequest.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/PaymentUpdateRequest.java
new file mode 100644
index 0000000..cef0c46
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/PaymentUpdateRequest.java
@@ -0,0 +1,203 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.CardPaymentInstrument;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * Payment configuration containing handlers.
+ */
+
+@Schema(name = "Payment_Update_Request", description = "Payment configuration containing handlers.")
+@JsonTypeName("Payment_Update_Request")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class PaymentUpdateRequest {
+
+ private @Nullable String selectedInstrumentId;
+
+ @Valid
+ private List instruments = new ArrayList<>();
+
+ public PaymentUpdateRequest selectedInstrumentId(@Nullable String selectedInstrumentId) {
+ this.selectedInstrumentId = selectedInstrumentId;
+ return this;
+ }
+
+ /**
+ * The id of the currently selected payment instrument from the instruments array. Set by the agent when submitting payment, and echoed back by the merchant in finalized state.
+ * @return selectedInstrumentId
+ */
+
+ @Schema(name = "selected_instrument_id", description = "The id of the currently selected payment instrument from the instruments array. Set by the agent when submitting payment, and echoed back by the merchant in finalized state.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("selected_instrument_id")
+ public @Nullable String getSelectedInstrumentId() {
+ return selectedInstrumentId;
+ }
+
+ public void setSelectedInstrumentId(@Nullable String selectedInstrumentId) {
+ this.selectedInstrumentId = selectedInstrumentId;
+ }
+
+ public PaymentUpdateRequest instruments(List instruments) {
+ this.instruments = instruments;
+ return this;
+ }
+
+ public PaymentUpdateRequest addInstrumentsItem(CardPaymentInstrument instrumentsItem) {
+ if (this.instruments == null) {
+ this.instruments = new ArrayList<>();
+ }
+ this.instruments.add(instrumentsItem);
+ return this;
+ }
+
+ /**
+ * The payment instruments available for this payment. Each instrument is associated with a specific handler via the handler_id field. Handlers can extend the base payment_instrument schema to add handler-specific fields.
+ * @return instruments
+ */
+ @Valid
+ @Schema(name = "instruments", description = "The payment instruments available for this payment. Each instrument is associated with a specific handler via the handler_id field. Handlers can extend the base payment_instrument schema to add handler-specific fields.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("instruments")
+ public List getInstruments() {
+ return instruments;
+ }
+
+ public void setInstruments(List instruments) {
+ this.instruments = instruments;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ PaymentUpdateRequest paymentUpdateRequest = (PaymentUpdateRequest) o;
+ return Objects.equals(this.selectedInstrumentId, paymentUpdateRequest.selectedInstrumentId) &&
+ Objects.equals(this.instruments, paymentUpdateRequest.instruments);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(selectedInstrumentId, instruments);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class PaymentUpdateRequest {\n");
+ sb.append(" selectedInstrumentId: ").append(toIndentedString(selectedInstrumentId)).append("\n");
+ sb.append(" instruments: ").append(toIndentedString(instruments)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private PaymentUpdateRequest instance;
+
+ public Builder() {
+ this(new PaymentUpdateRequest());
+ }
+
+ protected Builder(PaymentUpdateRequest instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(PaymentUpdateRequest value) {
+ this.instance.setSelectedInstrumentId(value.selectedInstrumentId);
+ this.instance.setInstruments(value.instruments);
+ return this;
+ }
+
+ public PaymentUpdateRequest.Builder selectedInstrumentId(String selectedInstrumentId) {
+ this.instance.selectedInstrumentId(selectedInstrumentId);
+ return this;
+ }
+
+ public PaymentUpdateRequest.Builder instruments(List instruments) {
+ this.instance.instruments(instruments);
+ return this;
+ }
+
+ /**
+ * returns a built PaymentUpdateRequest instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public PaymentUpdateRequest build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static PaymentUpdateRequest.Builder builder() {
+ return new PaymentUpdateRequest.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public PaymentUpdateRequest.Builder toBuilder() {
+ PaymentUpdateRequest.Builder builder = new PaymentUpdateRequest.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/PostalAddress.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/PostalAddress.java
new file mode 100644
index 0000000..9dadc99
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/PostalAddress.java
@@ -0,0 +1,430 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+/**
+ * Physical address of the location.
+ */
+
+@Schema(name = "Postal_Address", description = "Physical address of the location.")
+@JsonTypeName("Postal_Address")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:22.638361369Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class PostalAddress {
+
+ private @Nullable String extendedAddress;
+
+ private @Nullable String streetAddress;
+
+ private @Nullable String addressLocality;
+
+ private @Nullable String addressRegion;
+
+ private @Nullable String addressCountry;
+
+ private @Nullable String postalCode;
+
+ private @Nullable String firstName;
+
+ private @Nullable String lastName;
+
+ private @Nullable String fullName;
+
+ private @Nullable String phoneNumber;
+
+ public PostalAddress extendedAddress(@Nullable String extendedAddress) {
+ this.extendedAddress = extendedAddress;
+ return this;
+ }
+
+ /**
+ * An address extension such as an apartment number, C/O or alternative name.
+ * @return extendedAddress
+ */
+
+ @Schema(name = "extended_address", description = "An address extension such as an apartment number, C/O or alternative name.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("extended_address")
+ public @Nullable String getExtendedAddress() {
+ return extendedAddress;
+ }
+
+ public void setExtendedAddress(@Nullable String extendedAddress) {
+ this.extendedAddress = extendedAddress;
+ }
+
+ public PostalAddress streetAddress(@Nullable String streetAddress) {
+ this.streetAddress = streetAddress;
+ return this;
+ }
+
+ /**
+ * The street address.
+ * @return streetAddress
+ */
+
+ @Schema(name = "street_address", description = "The street address.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("street_address")
+ public @Nullable String getStreetAddress() {
+ return streetAddress;
+ }
+
+ public void setStreetAddress(@Nullable String streetAddress) {
+ this.streetAddress = streetAddress;
+ }
+
+ public PostalAddress addressLocality(@Nullable String addressLocality) {
+ this.addressLocality = addressLocality;
+ return this;
+ }
+
+ /**
+ * The locality in which the street address is, and which is in the region. For example, Mountain View.
+ * @return addressLocality
+ */
+
+ @Schema(name = "address_locality", description = "The locality in which the street address is, and which is in the region. For example, Mountain View.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("address_locality")
+ public @Nullable String getAddressLocality() {
+ return addressLocality;
+ }
+
+ public void setAddressLocality(@Nullable String addressLocality) {
+ this.addressLocality = addressLocality;
+ }
+
+ public PostalAddress addressRegion(@Nullable String addressRegion) {
+ this.addressRegion = addressRegion;
+ return this;
+ }
+
+ /**
+ * The region in which the locality is, and which is in the country. Required for applicable countries (i.e. state in US, province in CA). For example, California or another appropriate first-level Administrative division.
+ * @return addressRegion
+ */
+
+ @Schema(name = "address_region", description = "The region in which the locality is, and which is in the country. Required for applicable countries (i.e. state in US, province in CA). For example, California or another appropriate first-level Administrative division.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("address_region")
+ public @Nullable String getAddressRegion() {
+ return addressRegion;
+ }
+
+ public void setAddressRegion(@Nullable String addressRegion) {
+ this.addressRegion = addressRegion;
+ }
+
+ public PostalAddress addressCountry(@Nullable String addressCountry) {
+ this.addressCountry = addressCountry;
+ return this;
+ }
+
+ /**
+ * The country. Recommended to be in 2-letter ISO 3166-1 alpha-2 format, for example \"US\". For backward compatibility, a 3-letter ISO 3166-1 alpha-3 country code such as \"SGP\" or a full country name such as \"Singapore\" can also be used.
+ * @return addressCountry
+ */
+
+ @Schema(name = "address_country", description = "The country. Recommended to be in 2-letter ISO 3166-1 alpha-2 format, for example \"US\". For backward compatibility, a 3-letter ISO 3166-1 alpha-3 country code such as \"SGP\" or a full country name such as \"Singapore\" can also be used.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("address_country")
+ public @Nullable String getAddressCountry() {
+ return addressCountry;
+ }
+
+ public void setAddressCountry(@Nullable String addressCountry) {
+ this.addressCountry = addressCountry;
+ }
+
+ public PostalAddress postalCode(@Nullable String postalCode) {
+ this.postalCode = postalCode;
+ return this;
+ }
+
+ /**
+ * The postal code. For example, 94043.
+ * @return postalCode
+ */
+
+ @Schema(name = "postal_code", description = "The postal code. For example, 94043.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("postal_code")
+ public @Nullable String getPostalCode() {
+ return postalCode;
+ }
+
+ public void setPostalCode(@Nullable String postalCode) {
+ this.postalCode = postalCode;
+ }
+
+ public PostalAddress firstName(@Nullable String firstName) {
+ this.firstName = firstName;
+ return this;
+ }
+
+ /**
+ * Optional. First name of the contact associated with the address.
+ * @return firstName
+ */
+
+ @Schema(name = "first_name", description = "Optional. First name of the contact associated with the address.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("first_name")
+ public @Nullable String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(@Nullable String firstName) {
+ this.firstName = firstName;
+ }
+
+ public PostalAddress lastName(@Nullable String lastName) {
+ this.lastName = lastName;
+ return this;
+ }
+
+ /**
+ * Optional. Last name of the contact associated with the address.
+ * @return lastName
+ */
+
+ @Schema(name = "last_name", description = "Optional. Last name of the contact associated with the address.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("last_name")
+ public @Nullable String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(@Nullable String lastName) {
+ this.lastName = lastName;
+ }
+
+ public PostalAddress fullName(@Nullable String fullName) {
+ this.fullName = fullName;
+ return this;
+ }
+
+ /**
+ * Optional. Full name of the contact associated with the address (if first_name or last_name fields are present they take precedence).
+ * @return fullName
+ */
+
+ @Schema(name = "full_name", description = "Optional. Full name of the contact associated with the address (if first_name or last_name fields are present they take precedence).", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("full_name")
+ public @Nullable String getFullName() {
+ return fullName;
+ }
+
+ public void setFullName(@Nullable String fullName) {
+ this.fullName = fullName;
+ }
+
+ public PostalAddress phoneNumber(@Nullable String phoneNumber) {
+ this.phoneNumber = phoneNumber;
+ return this;
+ }
+
+ /**
+ * Optional. Phone number of the contact associated with the address.
+ * @return phoneNumber
+ */
+
+ @Schema(name = "phone_number", description = "Optional. Phone number of the contact associated with the address.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("phone_number")
+ public @Nullable String getPhoneNumber() {
+ return phoneNumber;
+ }
+
+ public void setPhoneNumber(@Nullable String phoneNumber) {
+ this.phoneNumber = phoneNumber;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ PostalAddress postalAddress = (PostalAddress) o;
+ return Objects.equals(this.extendedAddress, postalAddress.extendedAddress) &&
+ Objects.equals(this.streetAddress, postalAddress.streetAddress) &&
+ Objects.equals(this.addressLocality, postalAddress.addressLocality) &&
+ Objects.equals(this.addressRegion, postalAddress.addressRegion) &&
+ Objects.equals(this.addressCountry, postalAddress.addressCountry) &&
+ Objects.equals(this.postalCode, postalAddress.postalCode) &&
+ Objects.equals(this.firstName, postalAddress.firstName) &&
+ Objects.equals(this.lastName, postalAddress.lastName) &&
+ Objects.equals(this.fullName, postalAddress.fullName) &&
+ Objects.equals(this.phoneNumber, postalAddress.phoneNumber);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(extendedAddress, streetAddress, addressLocality, addressRegion, addressCountry, postalCode, firstName, lastName, fullName, phoneNumber);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class PostalAddress {\n");
+ sb.append(" extendedAddress: ").append(toIndentedString(extendedAddress)).append("\n");
+ sb.append(" streetAddress: ").append(toIndentedString(streetAddress)).append("\n");
+ sb.append(" addressLocality: ").append(toIndentedString(addressLocality)).append("\n");
+ sb.append(" addressRegion: ").append(toIndentedString(addressRegion)).append("\n");
+ sb.append(" addressCountry: ").append(toIndentedString(addressCountry)).append("\n");
+ sb.append(" postalCode: ").append(toIndentedString(postalCode)).append("\n");
+ sb.append(" firstName: ").append(toIndentedString(firstName)).append("\n");
+ sb.append(" lastName: ").append(toIndentedString(lastName)).append("\n");
+ sb.append(" fullName: ").append(toIndentedString(fullName)).append("\n");
+ sb.append(" phoneNumber: ").append(toIndentedString(phoneNumber)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private PostalAddress instance;
+
+ public Builder() {
+ this(new PostalAddress());
+ }
+
+ protected Builder(PostalAddress instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(PostalAddress value) {
+ this.instance.setExtendedAddress(value.extendedAddress);
+ this.instance.setStreetAddress(value.streetAddress);
+ this.instance.setAddressLocality(value.addressLocality);
+ this.instance.setAddressRegion(value.addressRegion);
+ this.instance.setAddressCountry(value.addressCountry);
+ this.instance.setPostalCode(value.postalCode);
+ this.instance.setFirstName(value.firstName);
+ this.instance.setLastName(value.lastName);
+ this.instance.setFullName(value.fullName);
+ this.instance.setPhoneNumber(value.phoneNumber);
+ return this;
+ }
+
+ public PostalAddress.Builder extendedAddress(String extendedAddress) {
+ this.instance.extendedAddress(extendedAddress);
+ return this;
+ }
+
+ public PostalAddress.Builder streetAddress(String streetAddress) {
+ this.instance.streetAddress(streetAddress);
+ return this;
+ }
+
+ public PostalAddress.Builder addressLocality(String addressLocality) {
+ this.instance.addressLocality(addressLocality);
+ return this;
+ }
+
+ public PostalAddress.Builder addressRegion(String addressRegion) {
+ this.instance.addressRegion(addressRegion);
+ return this;
+ }
+
+ public PostalAddress.Builder addressCountry(String addressCountry) {
+ this.instance.addressCountry(addressCountry);
+ return this;
+ }
+
+ public PostalAddress.Builder postalCode(String postalCode) {
+ this.instance.postalCode(postalCode);
+ return this;
+ }
+
+ public PostalAddress.Builder firstName(String firstName) {
+ this.instance.firstName(firstName);
+ return this;
+ }
+
+ public PostalAddress.Builder lastName(String lastName) {
+ this.instance.lastName(lastName);
+ return this;
+ }
+
+ public PostalAddress.Builder fullName(String fullName) {
+ this.instance.fullName(fullName);
+ return this;
+ }
+
+ public PostalAddress.Builder phoneNumber(String phoneNumber) {
+ this.instance.phoneNumber(phoneNumber);
+ return this;
+ }
+
+ /**
+ * returns a built PostalAddress instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public PostalAddress build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static PostalAddress.Builder builder() {
+ return new PostalAddress.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public PostalAddress.Builder toBuilder() {
+ PostalAddress.Builder builder = new PostalAddress.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/RetailLocationRequest.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/RetailLocationRequest.java
new file mode 100644
index 0000000..5faec43
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/RetailLocationRequest.java
@@ -0,0 +1,252 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.PostalAddress;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.databind.JsonNode;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+import java.util.Map;
+import java.util.HashMap;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+/**
+ * A pickup location (retail store, locker, etc.).
+ */
+
+@Schema(name = "Retail_Location_Request", description = "A pickup location (retail store, locker, etc.).")
+@JsonTypeName("Retail_Location_Request")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:22.638361369Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class RetailLocationRequest implements FulfillmentDestinationRequest {
+
+ private String name;
+
+ private @Nullable PostalAddress address;
+
+ public RetailLocationRequest() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public RetailLocationRequest(String name) {
+ this.name = name;
+ }
+
+ public RetailLocationRequest name(String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * Location name (e.g., store name).
+ * @return name
+ */
+ @NotNull
+ @Schema(name = "name", description = "Location name (e.g., store name).", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("name")
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public RetailLocationRequest address(@Nullable PostalAddress address) {
+ this.address = address;
+ return this;
+ }
+
+ /**
+ * Get address
+ * @return address
+ */
+ @Valid
+ @Schema(name = "address", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("address")
+ public @Nullable PostalAddress getAddress() {
+ return address;
+ }
+
+ public void setAddress(@Nullable PostalAddress address) {
+ this.address = address;
+ }
+ /**
+ * A container for additional, undeclared properties.
+ * This is a holder for any undeclared properties as specified with
+ * the 'additionalProperties' keyword in the OAS document.
+ */
+ private Map additionalProperties;
+
+ /**
+ * Set the additional (undeclared) property with the specified name and value.
+ * If the property does not already exist, create it otherwise replace it.
+ */
+ @JsonAnySetter
+ public RetailLocationRequest putAdditionalProperty(String key, JsonNode value) {
+ if (this.additionalProperties == null) {
+ this.additionalProperties = new HashMap();
+ }
+ this.additionalProperties.put(key, value);
+ return this;
+ }
+
+ /**
+ * Return the additional (undeclared) property.
+ */
+ @JsonAnyGetter
+ public Map getAdditionalProperties() {
+ return additionalProperties;
+ }
+
+ /**
+ * Return the additional (undeclared) property with the specified name.
+ */
+ public JsonNode getAdditionalProperty(String key) {
+ if (this.additionalProperties == null) {
+ return null;
+ }
+ return this.additionalProperties.get(key);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ RetailLocationRequest retailLocationRequest = (RetailLocationRequest) o;
+ return Objects.equals(this.name, retailLocationRequest.name) &&
+ Objects.equals(this.address, retailLocationRequest.address) &&
+ Objects.equals(this.additionalProperties, retailLocationRequest.additionalProperties);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(name, address, additionalProperties);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class RetailLocationRequest {\n");
+ sb.append(" name: ").append(toIndentedString(name)).append("\n");
+ sb.append(" address: ").append(toIndentedString(address)).append("\n");
+
+ sb.append(" additionalProperties: ").append(toIndentedString(additionalProperties)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private RetailLocationRequest instance;
+
+ public Builder() {
+ this(new RetailLocationRequest());
+ }
+
+ protected Builder(RetailLocationRequest instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(RetailLocationRequest value) {
+ this.instance.setName(value.name);
+ this.instance.setAddress(value.address);
+ return this;
+ }
+
+ public RetailLocationRequest.Builder name(String name) {
+ this.instance.name(name);
+ return this;
+ }
+
+ public RetailLocationRequest.Builder address(PostalAddress address) {
+ this.instance.address(address);
+ return this;
+ }
+
+ public RetailLocationRequest.Builder additionalProperties(Map additionalProperties) {
+ this.instance.additionalProperties = additionalProperties;
+ return this;
+ }
+
+ /**
+ * returns a built RetailLocationRequest instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public RetailLocationRequest build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static RetailLocationRequest.Builder builder() {
+ return new RetailLocationRequest.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public RetailLocationRequest.Builder toBuilder() {
+ RetailLocationRequest.Builder builder = new RetailLocationRequest.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/RetailLocationResponse.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/RetailLocationResponse.java
new file mode 100644
index 0000000..7dd7614
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/RetailLocationResponse.java
@@ -0,0 +1,283 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.dev.ucp.service.shopping.model.PostalAddress;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.databind.JsonNode;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+import java.util.Map;
+import java.util.HashMap;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+/**
+ * A pickup location (retail store, locker, etc.).
+ */
+
+@Schema(name = "Retail_Location_Response", description = "A pickup location (retail store, locker, etc.).")
+@JsonTypeName("Retail_Location_Response")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:22.638361369Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class RetailLocationResponse implements FulfillmentDestinationResponse {
+
+ private String id;
+
+ private String name;
+
+ private @Nullable PostalAddress address;
+
+ public RetailLocationResponse() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public RetailLocationResponse(String id, String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+ public RetailLocationResponse id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Unique location identifier.
+ * @return id
+ */
+ @NotNull
+ @Schema(name = "id", description = "Unique location identifier.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("id")
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public RetailLocationResponse name(String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * Location name (e.g., store name).
+ * @return name
+ */
+ @NotNull
+ @Schema(name = "name", description = "Location name (e.g., store name).", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("name")
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public RetailLocationResponse address(@Nullable PostalAddress address) {
+ this.address = address;
+ return this;
+ }
+
+ /**
+ * Get address
+ * @return address
+ */
+ @Valid
+ @Schema(name = "address", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("address")
+ public @Nullable PostalAddress getAddress() {
+ return address;
+ }
+
+ public void setAddress(@Nullable PostalAddress address) {
+ this.address = address;
+ }
+ /**
+ * A container for additional, undeclared properties.
+ * This is a holder for any undeclared properties as specified with
+ * the 'additionalProperties' keyword in the OAS document.
+ */
+ private Map additionalProperties;
+
+ /**
+ * Set the additional (undeclared) property with the specified name and value.
+ * If the property does not already exist, create it otherwise replace it.
+ */
+ @JsonAnySetter
+ public RetailLocationResponse putAdditionalProperty(String key, JsonNode value) {
+ if (this.additionalProperties == null) {
+ this.additionalProperties = new HashMap();
+ }
+ this.additionalProperties.put(key, value);
+ return this;
+ }
+
+ /**
+ * Return the additional (undeclared) property.
+ */
+ @JsonAnyGetter
+ public Map getAdditionalProperties() {
+ return additionalProperties;
+ }
+
+ /**
+ * Return the additional (undeclared) property with the specified name.
+ */
+ public JsonNode getAdditionalProperty(String key) {
+ if (this.additionalProperties == null) {
+ return null;
+ }
+ return this.additionalProperties.get(key);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ RetailLocationResponse retailLocationResponse = (RetailLocationResponse) o;
+ return Objects.equals(this.id, retailLocationResponse.id) &&
+ Objects.equals(this.name, retailLocationResponse.name) &&
+ Objects.equals(this.address, retailLocationResponse.address) &&
+ Objects.equals(this.additionalProperties, retailLocationResponse.additionalProperties);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, name, address, additionalProperties);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class RetailLocationResponse {\n");
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+ sb.append(" name: ").append(toIndentedString(name)).append("\n");
+ sb.append(" address: ").append(toIndentedString(address)).append("\n");
+
+ sb.append(" additionalProperties: ").append(toIndentedString(additionalProperties)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private RetailLocationResponse instance;
+
+ public Builder() {
+ this(new RetailLocationResponse());
+ }
+
+ protected Builder(RetailLocationResponse instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(RetailLocationResponse value) {
+ this.instance.setId(value.id);
+ this.instance.setName(value.name);
+ this.instance.setAddress(value.address);
+ return this;
+ }
+
+ public RetailLocationResponse.Builder id(String id) {
+ this.instance.id(id);
+ return this;
+ }
+
+ public RetailLocationResponse.Builder name(String name) {
+ this.instance.name(name);
+ return this;
+ }
+
+ public RetailLocationResponse.Builder address(PostalAddress address) {
+ this.instance.address(address);
+ return this;
+ }
+
+ public RetailLocationResponse.Builder additionalProperties(Map additionalProperties) {
+ this.instance.additionalProperties = additionalProperties;
+ return this;
+ }
+
+ /**
+ * returns a built RetailLocationResponse instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public RetailLocationResponse build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static RetailLocationResponse.Builder builder() {
+ return new RetailLocationResponse.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public RetailLocationResponse.Builder toBuilder() {
+ RetailLocationResponse.Builder builder = new RetailLocationResponse.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/ShippingDestinationRequest.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/ShippingDestinationRequest.java
new file mode 100644
index 0000000..55c2174
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/ShippingDestinationRequest.java
@@ -0,0 +1,510 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.databind.JsonNode;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+import java.util.Map;
+import java.util.HashMap;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+/**
+ * Shipping destination.
+ */
+
+@Schema(name = "Shipping_Destination_Request", description = "Shipping destination.")
+@JsonTypeName("Shipping_Destination_Request")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:22.638361369Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class ShippingDestinationRequest implements FulfillmentDestinationRequest {
+
+ private @Nullable String extendedAddress;
+
+ private @Nullable String streetAddress;
+
+ private @Nullable String addressLocality;
+
+ private @Nullable String addressRegion;
+
+ private @Nullable String addressCountry;
+
+ private @Nullable String postalCode;
+
+ private @Nullable String firstName;
+
+ private @Nullable String lastName;
+
+ private @Nullable String fullName;
+
+ private @Nullable String phoneNumber;
+
+ private @Nullable String id;
+
+ public ShippingDestinationRequest extendedAddress(@Nullable String extendedAddress) {
+ this.extendedAddress = extendedAddress;
+ return this;
+ }
+
+ /**
+ * An address extension such as an apartment number, C/O or alternative name.
+ * @return extendedAddress
+ */
+
+ @Schema(name = "extended_address", description = "An address extension such as an apartment number, C/O or alternative name.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("extended_address")
+ public @Nullable String getExtendedAddress() {
+ return extendedAddress;
+ }
+
+ public void setExtendedAddress(@Nullable String extendedAddress) {
+ this.extendedAddress = extendedAddress;
+ }
+
+ public ShippingDestinationRequest streetAddress(@Nullable String streetAddress) {
+ this.streetAddress = streetAddress;
+ return this;
+ }
+
+ /**
+ * The street address.
+ * @return streetAddress
+ */
+
+ @Schema(name = "street_address", description = "The street address.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("street_address")
+ public @Nullable String getStreetAddress() {
+ return streetAddress;
+ }
+
+ public void setStreetAddress(@Nullable String streetAddress) {
+ this.streetAddress = streetAddress;
+ }
+
+ public ShippingDestinationRequest addressLocality(@Nullable String addressLocality) {
+ this.addressLocality = addressLocality;
+ return this;
+ }
+
+ /**
+ * The locality in which the street address is, and which is in the region. For example, Mountain View.
+ * @return addressLocality
+ */
+
+ @Schema(name = "address_locality", description = "The locality in which the street address is, and which is in the region. For example, Mountain View.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("address_locality")
+ public @Nullable String getAddressLocality() {
+ return addressLocality;
+ }
+
+ public void setAddressLocality(@Nullable String addressLocality) {
+ this.addressLocality = addressLocality;
+ }
+
+ public ShippingDestinationRequest addressRegion(@Nullable String addressRegion) {
+ this.addressRegion = addressRegion;
+ return this;
+ }
+
+ /**
+ * The region in which the locality is, and which is in the country. Required for applicable countries (i.e. state in US, province in CA). For example, California or another appropriate first-level Administrative division.
+ * @return addressRegion
+ */
+
+ @Schema(name = "address_region", description = "The region in which the locality is, and which is in the country. Required for applicable countries (i.e. state in US, province in CA). For example, California or another appropriate first-level Administrative division.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("address_region")
+ public @Nullable String getAddressRegion() {
+ return addressRegion;
+ }
+
+ public void setAddressRegion(@Nullable String addressRegion) {
+ this.addressRegion = addressRegion;
+ }
+
+ public ShippingDestinationRequest addressCountry(@Nullable String addressCountry) {
+ this.addressCountry = addressCountry;
+ return this;
+ }
+
+ /**
+ * The country. Recommended to be in 2-letter ISO 3166-1 alpha-2 format, for example \"US\". For backward compatibility, a 3-letter ISO 3166-1 alpha-3 country code such as \"SGP\" or a full country name such as \"Singapore\" can also be used.
+ * @return addressCountry
+ */
+
+ @Schema(name = "address_country", description = "The country. Recommended to be in 2-letter ISO 3166-1 alpha-2 format, for example \"US\". For backward compatibility, a 3-letter ISO 3166-1 alpha-3 country code such as \"SGP\" or a full country name such as \"Singapore\" can also be used.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("address_country")
+ public @Nullable String getAddressCountry() {
+ return addressCountry;
+ }
+
+ public void setAddressCountry(@Nullable String addressCountry) {
+ this.addressCountry = addressCountry;
+ }
+
+ public ShippingDestinationRequest postalCode(@Nullable String postalCode) {
+ this.postalCode = postalCode;
+ return this;
+ }
+
+ /**
+ * The postal code. For example, 94043.
+ * @return postalCode
+ */
+
+ @Schema(name = "postal_code", description = "The postal code. For example, 94043.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("postal_code")
+ public @Nullable String getPostalCode() {
+ return postalCode;
+ }
+
+ public void setPostalCode(@Nullable String postalCode) {
+ this.postalCode = postalCode;
+ }
+
+ public ShippingDestinationRequest firstName(@Nullable String firstName) {
+ this.firstName = firstName;
+ return this;
+ }
+
+ /**
+ * Optional. First name of the contact associated with the address.
+ * @return firstName
+ */
+
+ @Schema(name = "first_name", description = "Optional. First name of the contact associated with the address.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("first_name")
+ public @Nullable String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(@Nullable String firstName) {
+ this.firstName = firstName;
+ }
+
+ public ShippingDestinationRequest lastName(@Nullable String lastName) {
+ this.lastName = lastName;
+ return this;
+ }
+
+ /**
+ * Optional. Last name of the contact associated with the address.
+ * @return lastName
+ */
+
+ @Schema(name = "last_name", description = "Optional. Last name of the contact associated with the address.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("last_name")
+ public @Nullable String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(@Nullable String lastName) {
+ this.lastName = lastName;
+ }
+
+ public ShippingDestinationRequest fullName(@Nullable String fullName) {
+ this.fullName = fullName;
+ return this;
+ }
+
+ /**
+ * Optional. Full name of the contact associated with the address (if first_name or last_name fields are present they take precedence).
+ * @return fullName
+ */
+
+ @Schema(name = "full_name", description = "Optional. Full name of the contact associated with the address (if first_name or last_name fields are present they take precedence).", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("full_name")
+ public @Nullable String getFullName() {
+ return fullName;
+ }
+
+ public void setFullName(@Nullable String fullName) {
+ this.fullName = fullName;
+ }
+
+ public ShippingDestinationRequest phoneNumber(@Nullable String phoneNumber) {
+ this.phoneNumber = phoneNumber;
+ return this;
+ }
+
+ /**
+ * Optional. Phone number of the contact associated with the address.
+ * @return phoneNumber
+ */
+
+ @Schema(name = "phone_number", description = "Optional. Phone number of the contact associated with the address.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("phone_number")
+ public @Nullable String getPhoneNumber() {
+ return phoneNumber;
+ }
+
+ public void setPhoneNumber(@Nullable String phoneNumber) {
+ this.phoneNumber = phoneNumber;
+ }
+
+ public ShippingDestinationRequest id(@Nullable String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * ID specific to this shipping destination.
+ * @return id
+ */
+
+ @Schema(name = "id", description = "ID specific to this shipping destination.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("id")
+ public @Nullable String getId() {
+ return id;
+ }
+
+ public void setId(@Nullable String id) {
+ this.id = id;
+ }
+ /**
+ * A container for additional, undeclared properties.
+ * This is a holder for any undeclared properties as specified with
+ * the 'additionalProperties' keyword in the OAS document.
+ */
+ private Map additionalProperties;
+
+ /**
+ * Set the additional (undeclared) property with the specified name and value.
+ * If the property does not already exist, create it otherwise replace it.
+ */
+ @JsonAnySetter
+ public ShippingDestinationRequest putAdditionalProperty(String key, JsonNode value) {
+ if (this.additionalProperties == null) {
+ this.additionalProperties = new HashMap();
+ }
+ this.additionalProperties.put(key, value);
+ return this;
+ }
+
+ /**
+ * Return the additional (undeclared) property.
+ */
+ @JsonAnyGetter
+ public Map getAdditionalProperties() {
+ return additionalProperties;
+ }
+
+ /**
+ * Return the additional (undeclared) property with the specified name.
+ */
+ public JsonNode getAdditionalProperty(String key) {
+ if (this.additionalProperties == null) {
+ return null;
+ }
+ return this.additionalProperties.get(key);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ ShippingDestinationRequest shippingDestinationRequest = (ShippingDestinationRequest) o;
+ return Objects.equals(this.extendedAddress, shippingDestinationRequest.extendedAddress) &&
+ Objects.equals(this.streetAddress, shippingDestinationRequest.streetAddress) &&
+ Objects.equals(this.addressLocality, shippingDestinationRequest.addressLocality) &&
+ Objects.equals(this.addressRegion, shippingDestinationRequest.addressRegion) &&
+ Objects.equals(this.addressCountry, shippingDestinationRequest.addressCountry) &&
+ Objects.equals(this.postalCode, shippingDestinationRequest.postalCode) &&
+ Objects.equals(this.firstName, shippingDestinationRequest.firstName) &&
+ Objects.equals(this.lastName, shippingDestinationRequest.lastName) &&
+ Objects.equals(this.fullName, shippingDestinationRequest.fullName) &&
+ Objects.equals(this.phoneNumber, shippingDestinationRequest.phoneNumber) &&
+ Objects.equals(this.id, shippingDestinationRequest.id) &&
+ Objects.equals(this.additionalProperties, shippingDestinationRequest.additionalProperties);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(extendedAddress, streetAddress, addressLocality, addressRegion, addressCountry, postalCode, firstName, lastName, fullName, phoneNumber, id, additionalProperties);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class ShippingDestinationRequest {\n");
+ sb.append(" extendedAddress: ").append(toIndentedString(extendedAddress)).append("\n");
+ sb.append(" streetAddress: ").append(toIndentedString(streetAddress)).append("\n");
+ sb.append(" addressLocality: ").append(toIndentedString(addressLocality)).append("\n");
+ sb.append(" addressRegion: ").append(toIndentedString(addressRegion)).append("\n");
+ sb.append(" addressCountry: ").append(toIndentedString(addressCountry)).append("\n");
+ sb.append(" postalCode: ").append(toIndentedString(postalCode)).append("\n");
+ sb.append(" firstName: ").append(toIndentedString(firstName)).append("\n");
+ sb.append(" lastName: ").append(toIndentedString(lastName)).append("\n");
+ sb.append(" fullName: ").append(toIndentedString(fullName)).append("\n");
+ sb.append(" phoneNumber: ").append(toIndentedString(phoneNumber)).append("\n");
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+
+ sb.append(" additionalProperties: ").append(toIndentedString(additionalProperties)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private ShippingDestinationRequest instance;
+
+ public Builder() {
+ this(new ShippingDestinationRequest());
+ }
+
+ protected Builder(ShippingDestinationRequest instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(ShippingDestinationRequest value) {
+ this.instance.setExtendedAddress(value.extendedAddress);
+ this.instance.setStreetAddress(value.streetAddress);
+ this.instance.setAddressLocality(value.addressLocality);
+ this.instance.setAddressRegion(value.addressRegion);
+ this.instance.setAddressCountry(value.addressCountry);
+ this.instance.setPostalCode(value.postalCode);
+ this.instance.setFirstName(value.firstName);
+ this.instance.setLastName(value.lastName);
+ this.instance.setFullName(value.fullName);
+ this.instance.setPhoneNumber(value.phoneNumber);
+ this.instance.setId(value.id);
+ return this;
+ }
+
+ public ShippingDestinationRequest.Builder extendedAddress(String extendedAddress) {
+ this.instance.extendedAddress(extendedAddress);
+ return this;
+ }
+
+ public ShippingDestinationRequest.Builder streetAddress(String streetAddress) {
+ this.instance.streetAddress(streetAddress);
+ return this;
+ }
+
+ public ShippingDestinationRequest.Builder addressLocality(String addressLocality) {
+ this.instance.addressLocality(addressLocality);
+ return this;
+ }
+
+ public ShippingDestinationRequest.Builder addressRegion(String addressRegion) {
+ this.instance.addressRegion(addressRegion);
+ return this;
+ }
+
+ public ShippingDestinationRequest.Builder addressCountry(String addressCountry) {
+ this.instance.addressCountry(addressCountry);
+ return this;
+ }
+
+ public ShippingDestinationRequest.Builder postalCode(String postalCode) {
+ this.instance.postalCode(postalCode);
+ return this;
+ }
+
+ public ShippingDestinationRequest.Builder firstName(String firstName) {
+ this.instance.firstName(firstName);
+ return this;
+ }
+
+ public ShippingDestinationRequest.Builder lastName(String lastName) {
+ this.instance.lastName(lastName);
+ return this;
+ }
+
+ public ShippingDestinationRequest.Builder fullName(String fullName) {
+ this.instance.fullName(fullName);
+ return this;
+ }
+
+ public ShippingDestinationRequest.Builder phoneNumber(String phoneNumber) {
+ this.instance.phoneNumber(phoneNumber);
+ return this;
+ }
+
+ public ShippingDestinationRequest.Builder id(String id) {
+ this.instance.id(id);
+ return this;
+ }
+
+ public ShippingDestinationRequest.Builder additionalProperties(Map additionalProperties) {
+ this.instance.additionalProperties = additionalProperties;
+ return this;
+ }
+
+ /**
+ * returns a built ShippingDestinationRequest instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public ShippingDestinationRequest build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static ShippingDestinationRequest.Builder builder() {
+ return new ShippingDestinationRequest.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public ShippingDestinationRequest.Builder toBuilder() {
+ ShippingDestinationRequest.Builder builder = new ShippingDestinationRequest.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/ShippingDestinationResponse.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/ShippingDestinationResponse.java
new file mode 100644
index 0000000..a171e24
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/ShippingDestinationResponse.java
@@ -0,0 +1,521 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.databind.JsonNode;
+import org.springframework.lang.Nullable;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+import java.util.Map;
+import java.util.HashMap;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+/**
+ * Shipping destination.
+ */
+
+@Schema(name = "Shipping_Destination_Response", description = "Shipping destination.")
+@JsonTypeName("Shipping_Destination_Response")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:22.638361369Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class ShippingDestinationResponse implements FulfillmentDestinationResponse {
+
+ private @Nullable String extendedAddress;
+
+ private @Nullable String streetAddress;
+
+ private @Nullable String addressLocality;
+
+ private @Nullable String addressRegion;
+
+ private @Nullable String addressCountry;
+
+ private @Nullable String postalCode;
+
+ private @Nullable String firstName;
+
+ private @Nullable String lastName;
+
+ private @Nullable String fullName;
+
+ private @Nullable String phoneNumber;
+
+ private String id;
+
+ public ShippingDestinationResponse() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public ShippingDestinationResponse(String id) {
+ this.id = id;
+ }
+
+ public ShippingDestinationResponse extendedAddress(@Nullable String extendedAddress) {
+ this.extendedAddress = extendedAddress;
+ return this;
+ }
+
+ /**
+ * An address extension such as an apartment number, C/O or alternative name.
+ * @return extendedAddress
+ */
+
+ @Schema(name = "extended_address", description = "An address extension such as an apartment number, C/O or alternative name.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("extended_address")
+ public @Nullable String getExtendedAddress() {
+ return extendedAddress;
+ }
+
+ public void setExtendedAddress(@Nullable String extendedAddress) {
+ this.extendedAddress = extendedAddress;
+ }
+
+ public ShippingDestinationResponse streetAddress(@Nullable String streetAddress) {
+ this.streetAddress = streetAddress;
+ return this;
+ }
+
+ /**
+ * The street address.
+ * @return streetAddress
+ */
+
+ @Schema(name = "street_address", description = "The street address.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("street_address")
+ public @Nullable String getStreetAddress() {
+ return streetAddress;
+ }
+
+ public void setStreetAddress(@Nullable String streetAddress) {
+ this.streetAddress = streetAddress;
+ }
+
+ public ShippingDestinationResponse addressLocality(@Nullable String addressLocality) {
+ this.addressLocality = addressLocality;
+ return this;
+ }
+
+ /**
+ * The locality in which the street address is, and which is in the region. For example, Mountain View.
+ * @return addressLocality
+ */
+
+ @Schema(name = "address_locality", description = "The locality in which the street address is, and which is in the region. For example, Mountain View.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("address_locality")
+ public @Nullable String getAddressLocality() {
+ return addressLocality;
+ }
+
+ public void setAddressLocality(@Nullable String addressLocality) {
+ this.addressLocality = addressLocality;
+ }
+
+ public ShippingDestinationResponse addressRegion(@Nullable String addressRegion) {
+ this.addressRegion = addressRegion;
+ return this;
+ }
+
+ /**
+ * The region in which the locality is, and which is in the country. Required for applicable countries (i.e. state in US, province in CA). For example, California or another appropriate first-level Administrative division.
+ * @return addressRegion
+ */
+
+ @Schema(name = "address_region", description = "The region in which the locality is, and which is in the country. Required for applicable countries (i.e. state in US, province in CA). For example, California or another appropriate first-level Administrative division.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("address_region")
+ public @Nullable String getAddressRegion() {
+ return addressRegion;
+ }
+
+ public void setAddressRegion(@Nullable String addressRegion) {
+ this.addressRegion = addressRegion;
+ }
+
+ public ShippingDestinationResponse addressCountry(@Nullable String addressCountry) {
+ this.addressCountry = addressCountry;
+ return this;
+ }
+
+ /**
+ * The country. Recommended to be in 2-letter ISO 3166-1 alpha-2 format, for example \"US\". For backward compatibility, a 3-letter ISO 3166-1 alpha-3 country code such as \"SGP\" or a full country name such as \"Singapore\" can also be used.
+ * @return addressCountry
+ */
+
+ @Schema(name = "address_country", description = "The country. Recommended to be in 2-letter ISO 3166-1 alpha-2 format, for example \"US\". For backward compatibility, a 3-letter ISO 3166-1 alpha-3 country code such as \"SGP\" or a full country name such as \"Singapore\" can also be used.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("address_country")
+ public @Nullable String getAddressCountry() {
+ return addressCountry;
+ }
+
+ public void setAddressCountry(@Nullable String addressCountry) {
+ this.addressCountry = addressCountry;
+ }
+
+ public ShippingDestinationResponse postalCode(@Nullable String postalCode) {
+ this.postalCode = postalCode;
+ return this;
+ }
+
+ /**
+ * The postal code. For example, 94043.
+ * @return postalCode
+ */
+
+ @Schema(name = "postal_code", description = "The postal code. For example, 94043.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("postal_code")
+ public @Nullable String getPostalCode() {
+ return postalCode;
+ }
+
+ public void setPostalCode(@Nullable String postalCode) {
+ this.postalCode = postalCode;
+ }
+
+ public ShippingDestinationResponse firstName(@Nullable String firstName) {
+ this.firstName = firstName;
+ return this;
+ }
+
+ /**
+ * Optional. First name of the contact associated with the address.
+ * @return firstName
+ */
+
+ @Schema(name = "first_name", description = "Optional. First name of the contact associated with the address.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("first_name")
+ public @Nullable String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(@Nullable String firstName) {
+ this.firstName = firstName;
+ }
+
+ public ShippingDestinationResponse lastName(@Nullable String lastName) {
+ this.lastName = lastName;
+ return this;
+ }
+
+ /**
+ * Optional. Last name of the contact associated with the address.
+ * @return lastName
+ */
+
+ @Schema(name = "last_name", description = "Optional. Last name of the contact associated with the address.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("last_name")
+ public @Nullable String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(@Nullable String lastName) {
+ this.lastName = lastName;
+ }
+
+ public ShippingDestinationResponse fullName(@Nullable String fullName) {
+ this.fullName = fullName;
+ return this;
+ }
+
+ /**
+ * Optional. Full name of the contact associated with the address (if first_name or last_name fields are present they take precedence).
+ * @return fullName
+ */
+
+ @Schema(name = "full_name", description = "Optional. Full name of the contact associated with the address (if first_name or last_name fields are present they take precedence).", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("full_name")
+ public @Nullable String getFullName() {
+ return fullName;
+ }
+
+ public void setFullName(@Nullable String fullName) {
+ this.fullName = fullName;
+ }
+
+ public ShippingDestinationResponse phoneNumber(@Nullable String phoneNumber) {
+ this.phoneNumber = phoneNumber;
+ return this;
+ }
+
+ /**
+ * Optional. Phone number of the contact associated with the address.
+ * @return phoneNumber
+ */
+
+ @Schema(name = "phone_number", description = "Optional. Phone number of the contact associated with the address.", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+ @JsonProperty("phone_number")
+ public @Nullable String getPhoneNumber() {
+ return phoneNumber;
+ }
+
+ public void setPhoneNumber(@Nullable String phoneNumber) {
+ this.phoneNumber = phoneNumber;
+ }
+
+ public ShippingDestinationResponse id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * ID specific to this shipping destination.
+ * @return id
+ */
+ @NotNull
+ @Schema(name = "id", description = "ID specific to this shipping destination.", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("id")
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+ /**
+ * A container for additional, undeclared properties.
+ * This is a holder for any undeclared properties as specified with
+ * the 'additionalProperties' keyword in the OAS document.
+ */
+ private Map additionalProperties;
+
+ /**
+ * Set the additional (undeclared) property with the specified name and value.
+ * If the property does not already exist, create it otherwise replace it.
+ */
+ @JsonAnySetter
+ public ShippingDestinationResponse putAdditionalProperty(String key, JsonNode value) {
+ if (this.additionalProperties == null) {
+ this.additionalProperties = new HashMap();
+ }
+ this.additionalProperties.put(key, value);
+ return this;
+ }
+
+ /**
+ * Return the additional (undeclared) property.
+ */
+ @JsonAnyGetter
+ public Map getAdditionalProperties() {
+ return additionalProperties;
+ }
+
+ /**
+ * Return the additional (undeclared) property with the specified name.
+ */
+ public JsonNode getAdditionalProperty(String key) {
+ if (this.additionalProperties == null) {
+ return null;
+ }
+ return this.additionalProperties.get(key);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ ShippingDestinationResponse shippingDestinationResponse = (ShippingDestinationResponse) o;
+ return Objects.equals(this.extendedAddress, shippingDestinationResponse.extendedAddress) &&
+ Objects.equals(this.streetAddress, shippingDestinationResponse.streetAddress) &&
+ Objects.equals(this.addressLocality, shippingDestinationResponse.addressLocality) &&
+ Objects.equals(this.addressRegion, shippingDestinationResponse.addressRegion) &&
+ Objects.equals(this.addressCountry, shippingDestinationResponse.addressCountry) &&
+ Objects.equals(this.postalCode, shippingDestinationResponse.postalCode) &&
+ Objects.equals(this.firstName, shippingDestinationResponse.firstName) &&
+ Objects.equals(this.lastName, shippingDestinationResponse.lastName) &&
+ Objects.equals(this.fullName, shippingDestinationResponse.fullName) &&
+ Objects.equals(this.phoneNumber, shippingDestinationResponse.phoneNumber) &&
+ Objects.equals(this.id, shippingDestinationResponse.id) &&
+ Objects.equals(this.additionalProperties, shippingDestinationResponse.additionalProperties);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(extendedAddress, streetAddress, addressLocality, addressRegion, addressCountry, postalCode, firstName, lastName, fullName, phoneNumber, id, additionalProperties);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class ShippingDestinationResponse {\n");
+ sb.append(" extendedAddress: ").append(toIndentedString(extendedAddress)).append("\n");
+ sb.append(" streetAddress: ").append(toIndentedString(streetAddress)).append("\n");
+ sb.append(" addressLocality: ").append(toIndentedString(addressLocality)).append("\n");
+ sb.append(" addressRegion: ").append(toIndentedString(addressRegion)).append("\n");
+ sb.append(" addressCountry: ").append(toIndentedString(addressCountry)).append("\n");
+ sb.append(" postalCode: ").append(toIndentedString(postalCode)).append("\n");
+ sb.append(" firstName: ").append(toIndentedString(firstName)).append("\n");
+ sb.append(" lastName: ").append(toIndentedString(lastName)).append("\n");
+ sb.append(" fullName: ").append(toIndentedString(fullName)).append("\n");
+ sb.append(" phoneNumber: ").append(toIndentedString(phoneNumber)).append("\n");
+ sb.append(" id: ").append(toIndentedString(id)).append("\n");
+
+ sb.append(" additionalProperties: ").append(toIndentedString(additionalProperties)).append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+
+ public static class Builder {
+
+ private ShippingDestinationResponse instance;
+
+ public Builder() {
+ this(new ShippingDestinationResponse());
+ }
+
+ protected Builder(ShippingDestinationResponse instance) {
+ this.instance = instance;
+ }
+
+ protected Builder copyOf(ShippingDestinationResponse value) {
+ this.instance.setExtendedAddress(value.extendedAddress);
+ this.instance.setStreetAddress(value.streetAddress);
+ this.instance.setAddressLocality(value.addressLocality);
+ this.instance.setAddressRegion(value.addressRegion);
+ this.instance.setAddressCountry(value.addressCountry);
+ this.instance.setPostalCode(value.postalCode);
+ this.instance.setFirstName(value.firstName);
+ this.instance.setLastName(value.lastName);
+ this.instance.setFullName(value.fullName);
+ this.instance.setPhoneNumber(value.phoneNumber);
+ this.instance.setId(value.id);
+ return this;
+ }
+
+ public ShippingDestinationResponse.Builder extendedAddress(String extendedAddress) {
+ this.instance.extendedAddress(extendedAddress);
+ return this;
+ }
+
+ public ShippingDestinationResponse.Builder streetAddress(String streetAddress) {
+ this.instance.streetAddress(streetAddress);
+ return this;
+ }
+
+ public ShippingDestinationResponse.Builder addressLocality(String addressLocality) {
+ this.instance.addressLocality(addressLocality);
+ return this;
+ }
+
+ public ShippingDestinationResponse.Builder addressRegion(String addressRegion) {
+ this.instance.addressRegion(addressRegion);
+ return this;
+ }
+
+ public ShippingDestinationResponse.Builder addressCountry(String addressCountry) {
+ this.instance.addressCountry(addressCountry);
+ return this;
+ }
+
+ public ShippingDestinationResponse.Builder postalCode(String postalCode) {
+ this.instance.postalCode(postalCode);
+ return this;
+ }
+
+ public ShippingDestinationResponse.Builder firstName(String firstName) {
+ this.instance.firstName(firstName);
+ return this;
+ }
+
+ public ShippingDestinationResponse.Builder lastName(String lastName) {
+ this.instance.lastName(lastName);
+ return this;
+ }
+
+ public ShippingDestinationResponse.Builder fullName(String fullName) {
+ this.instance.fullName(fullName);
+ return this;
+ }
+
+ public ShippingDestinationResponse.Builder phoneNumber(String phoneNumber) {
+ this.instance.phoneNumber(phoneNumber);
+ return this;
+ }
+
+ public ShippingDestinationResponse.Builder id(String id) {
+ this.instance.id(id);
+ return this;
+ }
+
+ public ShippingDestinationResponse.Builder additionalProperties(Map additionalProperties) {
+ this.instance.additionalProperties = additionalProperties;
+ return this;
+ }
+
+ /**
+ * returns a built ShippingDestinationResponse instance.
+ *
+ * The builder is not reusable (NullPointerException)
+ */
+ public ShippingDestinationResponse build() {
+ try {
+ return this.instance;
+ } finally {
+ // ensure that this.instance is not reused
+ this.instance = null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getClass() + "=(" + instance + ")";
+ }
+ }
+
+ /**
+ * Create a builder with no initialized field (except for the default values).
+ */
+ public static ShippingDestinationResponse.Builder builder() {
+ return new ShippingDestinationResponse.Builder();
+ }
+
+ /**
+ * Create a builder with a shallow copy of this instance.
+ */
+ public ShippingDestinationResponse.Builder toBuilder() {
+ ShippingDestinationResponse.Builder builder = new ShippingDestinationResponse.Builder();
+ return builder.copyOf(this);
+ }
+
+}
+
diff --git a/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/TokenCredentialResponse.java b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/TokenCredentialResponse.java
new file mode 100644
index 0000000..fc88b47
--- /dev/null
+++ b/rest/java-spring/generated/src/main/java/com/dev/ucp/service/shopping/model/TokenCredentialResponse.java
@@ -0,0 +1,222 @@
+/*
+ * Copyright 2026 UCP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.dev.ucp.service.shopping.model;
+
+import java.net.URI;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import com.fasterxml.jackson.databind.JsonNode;
+import org.springframework.lang.Nullable;
+import com.fasterxml.jackson.annotation.JsonValue;
+import org.openapitools.jackson.nullable.JsonNullable;
+import java.time.OffsetDateTime;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+
+import java.util.*;
+import jakarta.annotation.Generated;
+
+import java.util.Map;
+import java.util.HashMap;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+/**
+ * Base token credential schema. Concrete payment handlers may extend this schema with additional fields and define their own constraints.
+ */
+
+@Schema(name = "Token_Credential_Response", description = "Base token credential schema. Concrete payment handlers may extend this schema with additional fields and define their own constraints.")
+@JsonTypeName("Token_Credential_Response")
+@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2026-01-26T17:13:20.046324970Z[Etc/UTC]", comments = "Generator version: 7.17.0")
+public class TokenCredentialResponse implements PaymentCredential {
+
+ private String type;
+
+ public TokenCredentialResponse() {
+ super();
+ }
+
+ /**
+ * Constructor with only required parameters
+ */
+ public TokenCredentialResponse(String type) {
+ this.type = type;
+ }
+
+ public TokenCredentialResponse type(String type) {
+ this.type = type;
+ return this;
+ }
+
+ /**
+ * The specific type of token produced by the handler (e.g., 'stripe_token').
+ * @return type
+ */
+ @NotNull
+ @Schema(name = "type", description = "The specific type of token produced by the handler (e.g., 'stripe_token').", requiredMode = Schema.RequiredMode.REQUIRED)
+ @JsonProperty("type")
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+ /**
+ * A container for additional, undeclared properties.
+ * This is a holder for any undeclared properties as specified with
+ * the 'additionalProperties' keyword in the OAS document.
+ */
+ private Map