diff --git a/README.md b/README.md
index 701d5d57..92762c57 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
# Apple App Store Server Java Library
-The Java server library for the [App Store Server API](https://developer.apple.com/documentation/appstoreserverapi), [App Store Server Notifications](https://developer.apple.com/documentation/appstoreservernotifications), and [Retention Messaging API](https://developer.apple.com/documentation/retentionmessaging). Also available in [Swift](https://github.com/apple/app-store-server-library-swift), [Python](https://github.com/apple/app-store-server-library-python), and [Node.js](https://github.com/apple/app-store-server-library-node).
+The Java server library for the [App Store Server API](https://developer.apple.com/documentation/appstoreserverapi), [App Store Server Notifications](https://developer.apple.com/documentation/appstoreservernotifications), [Retention Messaging API](https://developer.apple.com/documentation/retentionmessaging), and [Advanced Commerce API](https://developer.apple.com/documentation/AdvancedCommerceAPI). Also available in [Swift](https://github.com/apple/app-store-server-library-swift), [Python](https://github.com/apple/app-store-server-library-python), and [Node.js](https://github.com/apple/app-store-server-library-node).
## Table of Contents
1. [Installation](#installation)
diff --git a/src/main/java/com/apple/itunes/storekit/model/AbstractAdvancedCommerceBaseItem.java b/src/main/java/com/apple/itunes/storekit/model/AbstractAdvancedCommerceBaseItem.java
new file mode 100644
index 00000000..a4f7100b
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AbstractAdvancedCommerceBaseItem.java
@@ -0,0 +1,39 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public abstract class AbstractAdvancedCommerceBaseItem {
+ private static final String SERIALIZED_NAME_SKU = "SKU";
+
+ @JsonProperty(value = SERIALIZED_NAME_SKU, required = true)
+ protected String sku;
+
+ protected AbstractAdvancedCommerceBaseItem() {}
+
+ protected AbstractAdvancedCommerceBaseItem(String sku) {
+ this.sku = AdvancedCommerceValidationUtils.validateSku(sku);
+ }
+
+ protected abstract AbstractAdvancedCommerceBaseItem self();
+
+ public AbstractAdvancedCommerceBaseItem sku(String sku) {
+ this.sku = AdvancedCommerceValidationUtils.validateSku(sku);
+ return self();
+ }
+
+ /**
+ * The product identifier of an in-app purchase product you manage in your own system.
+ *
+ * @return SKU
+ * @see SKU
+ **/
+ public String getSku() {
+ return sku;
+ }
+
+ public void setSku(String sku) {
+ this.sku = AdvancedCommerceValidationUtils.validateSku(sku);
+ }
+
+}
diff --git a/src/main/java/com/apple/itunes/storekit/model/AbstractAdvancedCommerceInAppRequest.java b/src/main/java/com/apple/itunes/storekit/model/AbstractAdvancedCommerceInAppRequest.java
new file mode 100644
index 00000000..4eca35b0
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AbstractAdvancedCommerceInAppRequest.java
@@ -0,0 +1,45 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.Objects;
+
+public abstract class AbstractAdvancedCommerceInAppRequest> extends AdvancedCommerceRequest implements AdvancedCommerceInAppRequest {
+
+ private static final String SERIALIZED_NAME_OPERATION = "operation";
+ private static final String SERIALIZED_NAME_VERSION = "version";
+
+ @JsonProperty(value = SERIALIZED_NAME_OPERATION, required = true)
+ private final String operation;
+ @JsonProperty(value = SERIALIZED_NAME_VERSION, required = true)
+ private final String version;
+
+ protected AbstractAdvancedCommerceInAppRequest() {
+ this.operation = null;
+ this.version = null;
+ }
+
+ protected AbstractAdvancedCommerceInAppRequest(String operation, String version, AdvancedCommerceRequestInfo requestInfo) {
+ super(requestInfo);
+ this.operation = Objects.requireNonNull(operation);
+ this.version = Objects.requireNonNull(version);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ if (!super.equals(o)) return false;
+ AbstractAdvancedCommerceInAppRequest> that = (AbstractAdvancedCommerceInAppRequest>) o;
+ return Objects.equals(operation, that.operation) && Objects.equals(version, that.version);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), operation, version);
+ }
+
+ protected abstract T self();
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AbstractAdvancedCommerceItem.java b/src/main/java/com/apple/itunes/storekit/model/AbstractAdvancedCommerceItem.java
new file mode 100644
index 00000000..4a3551c3
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AbstractAdvancedCommerceItem.java
@@ -0,0 +1,86 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.Map;
+import java.util.Objects;
+
+public abstract class AbstractAdvancedCommerceItem extends AbstractAdvancedCommerceBaseItem {
+ private static final String SERIALIZED_NAME_DESCRIPTION = "description";
+ private static final String SERIALIZED_NAME_DISPLAY_NAME = "displayName";
+
+ @JsonProperty(value = SERIALIZED_NAME_DESCRIPTION, required = true)
+ protected String description;
+ @JsonProperty(value = SERIALIZED_NAME_DISPLAY_NAME, required = true)
+ protected String displayName;
+
+ protected AbstractAdvancedCommerceItem() {}
+
+ protected AbstractAdvancedCommerceItem(String sku, String description, String displayName) {
+ super(sku);
+ this.description = AdvancedCommerceValidationUtils.validateDescription(description);
+ this.displayName = AdvancedCommerceValidationUtils.validateDisplayName(displayName);
+ }
+
+ protected abstract AbstractAdvancedCommerceItem self();
+
+ public AbstractAdvancedCommerceItem description(String description) {
+ this.description = AdvancedCommerceValidationUtils.validateDescription(description);
+ return self();
+ }
+
+ /**
+ * A string you provide that describes a SKU.
+ *
+ * @return description
+ * @see description
+ **/
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = AdvancedCommerceValidationUtils.validateDescription(description);
+ }
+
+ public AbstractAdvancedCommerceItem displayName(String displayName) {
+ this.displayName = AdvancedCommerceValidationUtils.validateDisplayName(displayName);
+ return self();
+ }
+
+ /**
+ * A string with a product name that you can localize and is suitable for display to customers.
+ *
+ * @return displayName
+ * @see displayName
+ **/
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ public void setDisplayName(String displayName) {
+ this.displayName = AdvancedCommerceValidationUtils.validateDisplayName(displayName);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ AbstractAdvancedCommerceItem that = (AbstractAdvancedCommerceItem) o;
+ return Objects.equals(this.sku, that.sku) &&
+ Objects.equals(this.description, that.description) &&
+ Objects.equals(this.displayName, that.displayName);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(sku, description, displayName);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AbstractAdvancedCommerceResponse.java b/src/main/java/com/apple/itunes/storekit/model/AbstractAdvancedCommerceResponse.java
new file mode 100644
index 00000000..d2e02a63
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AbstractAdvancedCommerceResponse.java
@@ -0,0 +1,104 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.Map;
+import java.util.Objects;
+
+public abstract class AbstractAdvancedCommerceResponse {
+
+ private static final String SERIALIZED_NAME_SIGNED_RENEWAL_INFO = "signedRenewalInfo";
+ private static final String SERIALIZED_NAME_SIGNED_TRANSACTION_INFO = "signedTransactionInfo";
+
+ @JsonProperty(SERIALIZED_NAME_SIGNED_RENEWAL_INFO)
+ private String signedRenewalInfo;
+ @JsonProperty(SERIALIZED_NAME_SIGNED_TRANSACTION_INFO)
+ private String signedTransactionInfo;
+ @JsonAnySetter
+ private Map unknownFields;
+
+ protected AbstractAdvancedCommerceResponse() {}
+
+ protected abstract AbstractAdvancedCommerceResponse self();
+
+ protected AbstractAdvancedCommerceResponse(String signedRenewalInfo, String signedTransactionInfo) {
+ this.signedRenewalInfo = signedRenewalInfo;
+ this.signedTransactionInfo = signedTransactionInfo;
+ }
+
+ public AbstractAdvancedCommerceResponse signedRenewalInfo(String signedRenewalInfo) {
+ this.signedRenewalInfo = signedRenewalInfo;
+ return self();
+ }
+
+ /**
+ * Subscription renewal information, signed by the App Store, in JSON Web Signature (JWS) format.
+ *
+ * @return signedRenewalInfo
+ * @see JWSRenewalInfo
+ **/
+ public String getSignedRenewalInfo() {
+ return signedRenewalInfo;
+ }
+
+ public void setSignedRenewalInfo(String signedRenewalInfo) {
+ this.signedRenewalInfo = signedRenewalInfo;
+ }
+
+ public AbstractAdvancedCommerceResponse signedTransactionInfo(String signedTransactionInfo) {
+ this.signedTransactionInfo = signedTransactionInfo;
+ return self();
+ }
+
+ /**
+ * Transaction information signed by the App Store, in JSON Web Signature (JWS) Compact Serialization format.
+ *
+ * @return signedTransactionInfo
+ * @see JWSTransaction
+ **/
+ public String getSignedTransactionInfo() {
+ return signedTransactionInfo;
+ }
+
+ public void setSignedTransactionInfo(String signedTransactionInfo) {
+ this.signedTransactionInfo = signedTransactionInfo;
+ }
+
+ public AbstractAdvancedCommerceResponse unknownFields(Map unknownFields) {
+ this.unknownFields = unknownFields;
+ return self();
+ }
+
+ public Map getUnknownFields() {
+ return unknownFields;
+ }
+
+ public void setUnknownFields(Map unknownFields) {
+ this.unknownFields = unknownFields;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ AbstractAdvancedCommerceResponse that = (AbstractAdvancedCommerceResponse) o;
+ return Objects.equals(signedRenewalInfo, that.signedRenewalInfo) && Objects.equals(signedTransactionInfo, that.signedTransactionInfo) && Objects.equals(unknownFields, that.unknownFields);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(signedRenewalInfo, signedTransactionInfo, unknownFields);
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "{" +
+ "signedRenewalInfo='" + signedRenewalInfo + '\'' +
+ ", signedTransactionInfo='" + signedTransactionInfo + '\'' +
+ ", unknownFields=" + unknownFields +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceDescriptors.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceDescriptors.java
new file mode 100644
index 00000000..e09db23c
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceDescriptors.java
@@ -0,0 +1,106 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * The display name and description of a subscription product.
+ *
+ * @see Descriptors
+ */
+public class AdvancedCommerceDescriptors {
+ private static final String SERIALIZED_NAME_DESCRIPTION = "description";
+ private static final String SERIALIZED_NAME_DISPLAY_NAME = "displayName";
+
+ @JsonProperty(value = SERIALIZED_NAME_DESCRIPTION, required = true)
+ protected String description;
+ @JsonProperty(value = SERIALIZED_NAME_DISPLAY_NAME, required = true)
+ protected String displayName;
+ @JsonAnySetter
+ private Map unknownFields;
+
+ protected AdvancedCommerceDescriptors() {}
+
+ protected AdvancedCommerceDescriptors(String description, String displayName) {
+ this.description = AdvancedCommerceValidationUtils.validateDescription(description);
+ this.displayName = AdvancedCommerceValidationUtils.validateDisplayName(displayName);
+ }
+
+ public AdvancedCommerceDescriptors description(String description) {
+ this.description = AdvancedCommerceValidationUtils.validateDescription(description);
+ return this;
+ }
+
+ /**
+ * A string you provide that describes a SKU.
+ *
+ * @return description
+ * @see description
+ **/
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = AdvancedCommerceValidationUtils.validateDescription(description);
+ }
+
+ public AdvancedCommerceDescriptors displayName(String displayName) {
+ this.displayName = AdvancedCommerceValidationUtils.validateDisplayName(displayName);
+ return this;
+ }
+
+ /**
+ * A string with a product name that you can localize and is suitable for display to customers.
+ *
+ * @return displayName
+ * @see displayName
+ **/
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ public void setDisplayName(String displayName) {
+ this.displayName = AdvancedCommerceValidationUtils.validateDisplayName(displayName);
+ }
+
+ public AdvancedCommerceDescriptors unknownFields(Map unknownFields) {
+ this.unknownFields = unknownFields;
+ return this;
+ }
+
+ public Map getUnknownFields() {
+ return unknownFields;
+ }
+
+ public void setUnknownFields(Map unknownFields) {
+ this.unknownFields = unknownFields;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ AdvancedCommerceDescriptors that = (AdvancedCommerceDescriptors) o;
+ return Objects.equals(description, that.description) && Objects.equals(displayName, that.displayName) && Objects.equals(unknownFields, that.unknownFields);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(description, displayName, unknownFields);
+ }
+
+ @Override
+ public String toString() {
+ return "AdvancedCommerceDescriptors{" +
+ "description='" + description + '\'' +
+ ", displayName='" + displayName + '\'' +
+ ", unknownFields=" + unknownFields +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceEffective.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceEffective.java
new file mode 100644
index 00000000..a66e61d1
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceEffective.java
@@ -0,0 +1,41 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonValue;
+
+/**
+ * A string value that indicates when a requested change to an auto-renewable subscription goes into effect.
+ *
+ * @see effective
+ */
+public enum AdvancedCommerceEffective {
+
+ IMMEDIATELY("IMMEDIATELY"),
+ NEXT_BILL_CYCLE("NEXT_BILL_CYCLE");
+
+ private final String value;
+
+ AdvancedCommerceEffective(String value) {
+ this.value = value;
+ }
+
+ public static AdvancedCommerceEffective fromValue(String value) {
+ for (AdvancedCommerceEffective b : AdvancedCommerceEffective.values()) {
+ if (b.value.equals(value)) {
+ return b;
+ }
+ }
+ return null;
+ }
+
+ @JsonValue
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceOffer.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceOffer.java
new file mode 100644
index 00000000..6d7ea77a
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceOffer.java
@@ -0,0 +1,182 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * A discount offer for an auto-renewable subscription.
+ *
+ * @see Offer
+ */
+public class AdvancedCommerceOffer {
+
+ private static final String SERIALIZED_NAME_PERIOD = "period";
+ private static final String SERIALIZED_NAME_PERIOD_COUNT = "periodCount";
+ private static final String SERIALIZED_NAME_PRICE = "price";
+ private static final String SERIALIZED_NAME_REASON = "reason";
+
+ @JsonProperty(value = SERIALIZED_NAME_PERIOD, required = true)
+ private String period;
+ @JsonProperty(value = SERIALIZED_NAME_PERIOD_COUNT, required = true)
+ private Integer periodCount;
+ @JsonProperty(value = SERIALIZED_NAME_PRICE, required = true)
+ private Long price;
+ @JsonProperty(value = SERIALIZED_NAME_REASON, required = true)
+ private String reason;
+ @JsonAnySetter
+ private Map unknownFields;
+
+ private AdvancedCommerceOffer() {}
+
+ public AdvancedCommerceOffer(String rawPeriod, Integer periodCount, Long price, String rawReason) {
+ this.period = Objects.requireNonNull(rawPeriod);
+ this.periodCount = AdvancedCommerceValidationUtils.validatePeriodCount(periodCount);
+ this.price = Objects.requireNonNull(price);
+ this.reason = Objects.requireNonNull(rawReason);
+ }
+
+
+ public AdvancedCommerceOffer(AdvancedCommerceOfferPeriod period, Integer periodCount, Long price, AdvancedCommerceOfferReason reason) {
+ this.period = Objects.requireNonNull(period).getValue();
+ this.periodCount = AdvancedCommerceValidationUtils.validatePeriodCount(periodCount);
+ this.price = Objects.requireNonNull(price);
+ this.reason = Objects.requireNonNull(reason).getValue();
+ }
+
+ public AdvancedCommerceOffer period(AdvancedCommerceOfferPeriod period) {
+ this.period = Objects.requireNonNull(period).getValue();
+ return this;
+ }
+
+ /**
+ * The period of the offer.
+ *
+ * @return period
+ **/
+ public AdvancedCommerceOfferPeriod getPeriod() {
+ return AdvancedCommerceOfferPeriod.fromValue(period);
+ }
+
+ /**
+ * @see #getPeriod()
+ */
+ public String getRawPeriod() {
+ return period;
+ }
+
+ public void setPeriod(AdvancedCommerceOfferPeriod period) {
+ this.period = Objects.requireNonNull(period).getValue();
+ }
+
+ public void setRawPeriod(String rawPeriod) {
+ this.period = Objects.requireNonNull(rawPeriod);
+ }
+
+ public AdvancedCommerceOffer periodCount(Integer periodCount) {
+ this.periodCount = AdvancedCommerceValidationUtils.validatePeriodCount(periodCount);
+ return this;
+ }
+
+ /**
+ * The number of periods the offer is active.
+ *
+ * @return periodCount
+ **/
+ public Integer getPeriodCount() {
+ return periodCount;
+ }
+
+ public void setPeriodCount(Integer periodCount) {
+ this.periodCount = AdvancedCommerceValidationUtils.validatePeriodCount(periodCount);
+ }
+
+ public AdvancedCommerceOffer price(Long price) {
+ this.price = Objects.requireNonNull(price);
+ return this;
+ }
+
+ /**
+ * The offer price, in milliunits.
+ *
+ * @return price
+ * @see Price
+ **/
+ public Long getPrice() {
+ return price;
+ }
+
+ public void setPrice(Long price) {
+ this.price = Objects.requireNonNull(price);
+ }
+
+ public AdvancedCommerceOffer reason(AdvancedCommerceOfferReason reason) {
+ this.reason = Objects.requireNonNull(reason).getValue();
+ return this;
+ }
+
+ /**
+ * The reason for the offer.
+ *
+ * @return reason
+ **/
+ public AdvancedCommerceOfferReason getReason() {
+ return AdvancedCommerceOfferReason.fromValue(reason);
+ }
+
+ /**
+ * @see #getReason()
+ */
+ public String getRawReason() {
+ return reason;
+ }
+
+ public void setReason(AdvancedCommerceOfferReason reason) {
+ this.reason = Objects.requireNonNull(reason).getValue();
+ }
+
+ public void setRawReason(String rawReason) {
+ this.reason = Objects.requireNonNull(rawReason);
+ }
+
+ public AdvancedCommerceOffer unknownFields(Map unknownFields) {
+ this.unknownFields = unknownFields;
+ return this;
+ }
+
+ public Map getUnknownFields() {
+ return unknownFields;
+ }
+
+ public void setUnknownFields(Map unknownFields) {
+ this.unknownFields = unknownFields;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ AdvancedCommerceOffer that = (AdvancedCommerceOffer) o;
+ return Objects.equals(period, that.period) && Objects.equals(periodCount, that.periodCount) && Objects.equals(price, that.price) && Objects.equals(reason, that.reason) && Objects.equals(unknownFields, that.unknownFields);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(period, periodCount, price, reason, unknownFields);
+ }
+
+ @Override
+ public String toString() {
+ return "AdvancedCommerceOffer{" +
+ "period='" + period + '\'' +
+ ", periodCount=" + periodCount +
+ ", price=" + price +
+ ", reason='" + reason + '\'' +
+ ", unknownFields=" + unknownFields +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceOfferPeriod.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceOfferPeriod.java
new file mode 100644
index 00000000..2836b423
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceOfferPeriod.java
@@ -0,0 +1,48 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonValue;
+
+/**
+ * The period of the offer.
+ *
+ * @see Offer
+ */
+public enum AdvancedCommerceOfferPeriod {
+
+ P3D("P3D"),
+ P1W("P1W"),
+ P2W("P2W"),
+ P1M("P1M"),
+ P2M("P2M"),
+ P3M("P3M"),
+ P6M("P6M"),
+ P9M("P9M"),
+ P1Y("P1Y");
+
+ private final String value;
+
+ AdvancedCommerceOfferPeriod(String value) {
+ this.value = value;
+ }
+
+ public static AdvancedCommerceOfferPeriod fromValue(String value) {
+ for (AdvancedCommerceOfferPeriod b : AdvancedCommerceOfferPeriod.values()) {
+ if (b.value.equals(value)) {
+ return b;
+ }
+ }
+ return null;
+ }
+
+ @JsonValue
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceOfferReason.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceOfferReason.java
new file mode 100644
index 00000000..34882109
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceOfferReason.java
@@ -0,0 +1,42 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonValue;
+
+/**
+ * The reason for the offer.
+ *
+ * @see Offer
+ */
+public enum AdvancedCommerceOfferReason {
+
+ ACQUISITION("ACQUISITION"),
+ WIN_BACK("WIN_BACK"),
+ RETENTION("RETENTION");
+
+ private final String value;
+
+ AdvancedCommerceOfferReason(String value) {
+ this.value = value;
+ }
+
+ public static AdvancedCommerceOfferReason fromValue(String value) {
+ for (AdvancedCommerceOfferReason b : AdvancedCommerceOfferReason.values()) {
+ if (b.value.equals(value)) {
+ return b;
+ }
+ }
+ return null;
+ }
+
+ @JsonValue
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceOneTimeChargeCreateRequest.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceOneTimeChargeCreateRequest.java
new file mode 100644
index 00000000..182da6ac
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceOneTimeChargeCreateRequest.java
@@ -0,0 +1,158 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.Objects;
+
+/**
+ * The request data your app provides when a customer purchases a one-time-charge product.
+ *
+ * @see OneTimeChargeCreateRequest
+ */
+public class AdvancedCommerceOneTimeChargeCreateRequest extends AbstractAdvancedCommerceInAppRequest {
+
+ /**
+ * The constant that represents the operation of this request.
+ */
+ private static final String OPERATION = "CREATE_ONE_TIME_CHARGE";
+ /**
+ * The version number of the API.
+ */
+ private static final String VERSION = "1";
+
+ private static final String SERIALIZED_NAME_CURRENCY = "currency";
+ private static final String SERIALIZED_NAME_ITEM = "item";
+ private static final String SERIALIZED_NAME_STOREFRONT = "storefront";
+ private static final String SERIALIZED_NAME_TAX_CODE = "taxCode";
+
+ @JsonProperty(value = SERIALIZED_NAME_CURRENCY, required = true)
+ private String currency;
+ @JsonProperty(value = SERIALIZED_NAME_ITEM, required = true)
+ private AdvancedCommerceOneTimeChargeItem item;
+ @JsonProperty(SERIALIZED_NAME_STOREFRONT)
+ private String storefront;
+ @JsonProperty(value = SERIALIZED_NAME_TAX_CODE, required = true)
+ private String taxCode;
+
+ private AdvancedCommerceOneTimeChargeCreateRequest() {}
+
+ public AdvancedCommerceOneTimeChargeCreateRequest(
+ String currency,
+ AdvancedCommerceOneTimeChargeItem item,
+ AdvancedCommerceRequestInfo requestInfo,
+ String taxCode
+ ) {
+ super(OPERATION, VERSION, requestInfo);
+ this.currency = Objects.requireNonNull(currency);
+ this.item = Objects.requireNonNull(item);
+ this.taxCode = Objects.requireNonNull(taxCode);
+ }
+
+ @Override
+ protected AdvancedCommerceOneTimeChargeCreateRequest self() {
+ return this;
+ }
+
+ public AdvancedCommerceOneTimeChargeCreateRequest currency(String currency) {
+ this.currency = Objects.requireNonNull(currency);
+ return this;
+ }
+
+ /**
+ * The currency of the price of the product.
+ *
+ * @return currency
+ * @see currency
+ **/
+ public String getCurrency() {
+ return currency;
+ }
+
+ public void setCurrency(String currency) {
+ this.currency = Objects.requireNonNull(currency);
+ }
+
+ public AdvancedCommerceOneTimeChargeCreateRequest item(AdvancedCommerceOneTimeChargeItem item) {
+ this.item = Objects.requireNonNull(item);
+ return this;
+ }
+
+ /**
+ * The details of the product for purchase.
+ *
+ * @return item
+ * @see OneTimeChargeItem
+ **/
+ public AdvancedCommerceOneTimeChargeItem getItem() {
+ return item;
+ }
+
+ public void setItem(AdvancedCommerceOneTimeChargeItem item) {
+ this.item = Objects.requireNonNull(item);
+ }
+
+ public AdvancedCommerceOneTimeChargeCreateRequest storefront(String storefront) {
+ this.storefront = storefront;
+ return this;
+ }
+
+ /**
+ * The storefront for the transaction.
+ *
+ * @return storefront
+ * @see storefront
+ **/
+ public String getStorefront() {
+ return storefront;
+ }
+
+ public void setStorefront(String storefront) {
+ this.storefront = storefront;
+ }
+
+ public AdvancedCommerceOneTimeChargeCreateRequest taxCode(String taxCode) {
+ this.taxCode = Objects.requireNonNull(taxCode);
+ return this;
+ }
+
+ /**
+ * The tax code for this product.
+ *
+ * @return taxCode
+ * @see taxCode
+ **/
+ public String getTaxCode() {
+ return taxCode;
+ }
+
+ public void setTaxCode(String taxCode) {
+ this.taxCode = Objects.requireNonNull(taxCode);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ if (!super.equals(o)) return false;
+ AdvancedCommerceOneTimeChargeCreateRequest that = (AdvancedCommerceOneTimeChargeCreateRequest) o;
+ return Objects.equals(currency, that.currency) && Objects.equals(item, that.item) && Objects.equals(storefront, that.storefront) && Objects.equals(taxCode, that.taxCode);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), currency, item, storefront, taxCode);
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "{" +
+ "currency='" + currency + '\'' +
+ ", item=" + item +
+ ", requestInfo=" + getRequestInfo() +
+ ", storefront='" + storefront + '\'' +
+ ", taxCode='" + taxCode + '\'' +
+ "}";
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceOneTimeChargeItem.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceOneTimeChargeItem.java
new file mode 100644
index 00000000..52c86631
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceOneTimeChargeItem.java
@@ -0,0 +1,76 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.Objects;
+
+/**
+ * The details of a one-time charge product, including its display name, price, SKU, and metadata.
+ *
+ * @see OneTimeChargeItem
+ */
+public class AdvancedCommerceOneTimeChargeItem extends AbstractAdvancedCommerceItem {
+ private static final String SERIALIZED_NAME_PRICE = "price";
+
+ @JsonProperty(value = SERIALIZED_NAME_PRICE, required = true)
+ private Long price;
+
+ private AdvancedCommerceOneTimeChargeItem() {
+ super();
+ }
+
+ @Override
+ protected AdvancedCommerceOneTimeChargeItem self() {
+ return this;
+ }
+
+ public AdvancedCommerceOneTimeChargeItem(String description, String displayName, String sku, Long price) {
+ super(sku, description, displayName);
+ this.price = Objects.requireNonNull(price);
+ }
+
+ public AdvancedCommerceOneTimeChargeItem price(Long price) {
+ this.price = Objects.requireNonNull(price);
+ return this;
+ }
+
+ /**
+ * The price, in milliunits of the currency, of the one-time charge product.
+ *
+ * @return price
+ * @see price
+ **/
+ public Long getPrice() {
+ return price;
+ }
+
+ public void setPrice(Long price) {
+ this.price = Objects.requireNonNull(price);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ if (!super.equals(o)) return false;
+ AdvancedCommerceOneTimeChargeItem that = (AdvancedCommerceOneTimeChargeItem) o;
+ return Objects.equals(price, that.price);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), price);
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "{" +
+ "sku='" + sku + '\'' +
+ ", description='" + description + '\'' +
+ ", displayName='" + displayName + '\'' +
+ ", price=" + price +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommercePeriod.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommercePeriod.java
new file mode 100644
index 00000000..f5dca799
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommercePeriod.java
@@ -0,0 +1,45 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonValue;
+
+/**
+ * The duration of a single cycle of an auto-renewable subscription.
+ *
+ * @see period
+ */
+public enum AdvancedCommercePeriod {
+
+ P1W("P1W"),
+ P1M("P1M"),
+ P2M("P2M"),
+ P3M("P3M"),
+ P6M("P6M"),
+ P1Y("P1Y");
+
+ private final String value;
+
+ AdvancedCommercePeriod(String value) {
+ this.value = value;
+ }
+
+ public static AdvancedCommercePeriod fromValue(String value) {
+ for (AdvancedCommercePeriod b : AdvancedCommercePeriod.values()) {
+ if (b.value.equals(value)) {
+ return b;
+ }
+ }
+ return null;
+ }
+
+ @JsonValue
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceReason.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceReason.java
new file mode 100644
index 00000000..46f53c1d
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceReason.java
@@ -0,0 +1,41 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonValue;
+
+/**
+ * The data your app provides to change an item of an auto-renewable subscription.
+ *
+ * @see SubscriptionModifyChangeItem
+ */
+public enum AdvancedCommerceReason {
+ UPGRADE("UPGRADE"),
+ DOWNGRADE("DOWNGRADE"),
+ APPLY_OFFER("APPLY_OFFER");
+
+ private final String value;
+
+ AdvancedCommerceReason(String value) {
+ this.value = value;
+ }
+
+ public static AdvancedCommerceReason fromValue(String value) {
+ for (AdvancedCommerceReason b : AdvancedCommerceReason.values()) {
+ if (b.value.equals(value)) {
+ return b;
+ }
+ }
+ return null;
+ }
+
+ @JsonValue
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRefundReason.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRefundReason.java
new file mode 100644
index 00000000..ab864e51
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRefundReason.java
@@ -0,0 +1,46 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonValue;
+
+/**
+ * A reason to request a refund.
+ *
+ * @see refundReason
+ */
+public enum AdvancedCommerceRefundReason {
+
+ UNINTENDED_PURCHASE("UNINTENDED_PURCHASE"),
+ FULFILLMENT_ISSUE("FULFILLMENT_ISSUE"),
+ UNSATISFIED_WITH_PURCHASE("UNSATISFIED_WITH_PURCHASE"),
+ LEGAL("LEGAL"),
+ OTHER("OTHER"),
+ MODIFY_ITEMS_REFUND("MODIFY_ITEMS_REFUND"),
+ SIMULATE_REFUND_DECLINE("SIMULATE_REFUND_DECLINE");
+
+ private final String value;
+
+ AdvancedCommerceRefundReason(String value) {
+ this.value = value;
+ }
+
+ public static AdvancedCommerceRefundReason fromValue(String value) {
+ for (AdvancedCommerceRefundReason b : AdvancedCommerceRefundReason.values()) {
+ if (b.value.equals(value)) {
+ return b;
+ }
+ }
+ return null;
+ }
+
+ @JsonValue
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRefundType.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRefundType.java
new file mode 100644
index 00000000..14e0e9f3
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRefundType.java
@@ -0,0 +1,42 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonValue;
+
+/**
+ * Information about the refund request for an item, such as its SKU, the refund amount, reason, and type.
+ *
+ * @see RequestRefundItem
+ */
+public enum AdvancedCommerceRefundType {
+
+ FULL("FULL"),
+ PRORATED("PRORATED"),
+ CUSTOM("CUSTOM");
+
+ private final String value;
+
+ AdvancedCommerceRefundType(String value) {
+ this.value = value;
+ }
+
+ public static AdvancedCommerceRefundType fromValue(String value) {
+ for (AdvancedCommerceRefundType b : AdvancedCommerceRefundType.values()) {
+ if (b.value.equals(value)) {
+ return b;
+ }
+ }
+ return null;
+ }
+
+ @JsonValue
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return String.valueOf(value);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRequest.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRequest.java
new file mode 100644
index 00000000..21fa12de
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRequest.java
@@ -0,0 +1,55 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.Objects;
+
+public abstract class AdvancedCommerceRequest> {
+
+ protected static final String SERIALIZED_NAME_REQUEST_INFO = "requestInfo";
+
+ @JsonProperty(value = SERIALIZED_NAME_REQUEST_INFO, required = true)
+ protected AdvancedCommerceRequestInfo requestInfo;
+
+ protected AdvancedCommerceRequest() {}
+
+ public AdvancedCommerceRequest(AdvancedCommerceRequestInfo requestInfo) {
+ this.requestInfo = Objects.requireNonNull(requestInfo);
+ }
+
+ public T requestInfo(AdvancedCommerceRequestInfo requestInfo) {
+ this.requestInfo = Objects.requireNonNull(requestInfo);
+ return self();
+ }
+
+ /**
+ * The metadata to include in server requests.
+ *
+ * @return requestInfo
+ * @see RequestInfo
+ **/
+ public AdvancedCommerceRequestInfo getRequestInfo() {
+ return requestInfo;
+ }
+
+ public void setRequestInfo(AdvancedCommerceRequestInfo requestInfo) {
+ this.requestInfo = Objects.requireNonNull(requestInfo);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ AdvancedCommerceRequest> that = (AdvancedCommerceRequest>) o;
+ return Objects.equals(requestInfo, that.requestInfo);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(requestInfo);
+ }
+
+ protected abstract T self();
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRequestInfo.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRequestInfo.java
new file mode 100644
index 00000000..d428502c
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRequestInfo.java
@@ -0,0 +1,109 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.Objects;
+import java.util.UUID;
+
+/**
+ * The metadata to include in server requests.
+ *
+ * @see RequestInfo
+ */
+public class AdvancedCommerceRequestInfo {
+ private static final String SERIALIZED_NAME_APP_ACCOUNT_TOKEN = "appAccountToken";
+ private static final String SERIALIZED_NAME_CONSISTENCY_TOKEN = "consistencyToken";
+ private static final String SERIALIZED_NAME_REQUEST_REFERENCE_ID = "requestReferenceId";
+
+ @JsonProperty(SERIALIZED_NAME_APP_ACCOUNT_TOKEN)
+ private UUID appAccountToken;
+ @JsonProperty(SERIALIZED_NAME_CONSISTENCY_TOKEN)
+ private String consistencyToken;
+ @JsonProperty(value = SERIALIZED_NAME_REQUEST_REFERENCE_ID, required = true)
+ private UUID requestReferenceId;
+
+ private AdvancedCommerceRequestInfo() {}
+
+ public AdvancedCommerceRequestInfo(UUID requestReferenceId) {
+ this.requestReferenceId = Objects.requireNonNull(requestReferenceId);
+ }
+
+ public AdvancedCommerceRequestInfo appAccountToken(UUID appAccountToken) {
+ this.appAccountToken = appAccountToken;
+ return this;
+ }
+
+ /**
+ * A UUID that represents an app account token, to associate with the transaction in the request.
+ *
+ * @return appAccountToken
+ **/
+ public UUID getAppAccountToken() {
+ return appAccountToken;
+ }
+
+ public void setAppAccountToken(UUID appAccountToken) {
+ this.appAccountToken = appAccountToken;
+ }
+
+ public AdvancedCommerceRequestInfo consistencyToken(String consistencyToken) {
+ this.consistencyToken = consistencyToken;
+ return this;
+ }
+
+ /**
+ * The value of the advancedCommerceConsistencyToken that you receive in the JWSRenewalInfo renewal information for a subscription. Don’t generate this value.
+ *
+ * @return consistencyToken
+ * @see advancedCommerceConsistencyToken
+ **/
+ public String consistencyToken() {
+ return consistencyToken;
+ }
+
+ public void setConsistencyToken(String consistencyToken) {
+ this.consistencyToken = consistencyToken;
+ }
+
+ public AdvancedCommerceRequestInfo requestReferenceId(UUID requestReferenceId) {
+ this.requestReferenceId = Objects.requireNonNull(requestReferenceId);
+ return this;
+ }
+
+ /**
+ * A UUID that you provide to uniquely identify each request. If the request times out, you can use the same requestReferenceId value to retry the request. Otherwise, provide a unique value.
+ *
+ * @return requestReferenceId
+ **/
+ public UUID getRequestReferenceId() {
+ return requestReferenceId;
+ }
+
+ public void setRequestReferenceId(UUID requestReferenceId) {
+ this.requestReferenceId = Objects.requireNonNull(requestReferenceId);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ AdvancedCommerceRequestInfo that = (AdvancedCommerceRequestInfo) o;
+ return Objects.equals(appAccountToken, that.appAccountToken) && Objects.equals(consistencyToken, that.consistencyToken) && Objects.equals(requestReferenceId, that.requestReferenceId);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(appAccountToken, consistencyToken, requestReferenceId);
+ }
+
+ @Override
+ public String toString() {
+ return "RequestInfo{" +
+ "appAccountToken=" + appAccountToken +
+ ", consistencyToken='" + consistencyToken + '\'' +
+ ", requestReferenceId=" + requestReferenceId +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRequestRefundItem.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRequestRefundItem.java
new file mode 100644
index 00000000..45cbc7bc
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRequestRefundItem.java
@@ -0,0 +1,172 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.Objects;
+
+/**
+ * Information about the refund request for an item, such as its SKU, the refund amount, reason, and type.
+ *
+ * @see RequestRefundItem
+ */
+public class AdvancedCommerceRequestRefundItem extends AbstractAdvancedCommerceBaseItem {
+ private static final String SERIALIZED_NAME_REFUND_AMOUNT = "refundAmount";
+ private static final String SERIALIZED_NAME_REFUND_REASON = "refundReason";
+ private static final String SERIALIZED_NAME_REFUND_TYPE = "refundType";
+ private static final String SERIALIZED_NAME_REVOKE = "revoke";
+
+ @JsonProperty(SERIALIZED_NAME_REFUND_AMOUNT)
+ private Integer refundAmount;
+ @JsonProperty(value = SERIALIZED_NAME_REFUND_REASON, required = true)
+ private String refundReason;
+ @JsonProperty(value = SERIALIZED_NAME_REFUND_TYPE, required = true)
+ private String refundType;
+ @JsonProperty(value = SERIALIZED_NAME_REVOKE, required = true)
+ private Boolean revoke;
+
+ private AdvancedCommerceRequestRefundItem() {
+ super();
+ }
+
+ public AdvancedCommerceRequestRefundItem(
+ String sku,
+ String rawRefundReason,
+ String rawRefundType,
+ Boolean revoke
+ ) {
+ super(sku);
+ this.refundReason = Objects.requireNonNull(rawRefundReason);
+ this.refundType = Objects.requireNonNull(rawRefundType);
+ this.revoke = Objects.requireNonNull(revoke);
+ }
+
+ public AdvancedCommerceRequestRefundItem(
+ String sku,
+ AdvancedCommerceRefundReason refundReason,
+ AdvancedCommerceRefundType refundType,
+ Boolean revoke
+ ) {
+ super(sku);
+ this.refundReason = Objects.requireNonNull(refundReason).getValue();
+ this.refundType = Objects.requireNonNull(refundType).getValue();
+ this.revoke = Objects.requireNonNull(revoke);
+ }
+
+ @Override
+ protected AdvancedCommerceRequestRefundItem self() {
+ return this;
+ }
+
+ public AdvancedCommerceRequestRefundItem refundAmount(Integer refundAmount) {
+ this.refundAmount = refundAmount;
+ return this;
+ }
+
+ /**
+ * The refund amount you’re requesting for the SKU, in milliunits of the currency.
+ *
+ * @return refundAmount
+ * @see refundAmount
+ **/
+ public Integer getRefundAmount() {
+ return refundAmount;
+ }
+
+ public void setRefundAmount(Integer refundAmount) {
+ this.refundAmount = refundAmount;
+ }
+
+ public AdvancedCommerceRequestRefundItem refundReason(AdvancedCommerceRefundReason refundReason) {
+ this.refundReason = Objects.requireNonNull(refundReason).getValue();
+ return this;
+ }
+
+ /**
+ * The reason for the refund request.
+ *
+ * @return refundReason
+ * @see refundReason
+ **/
+ public AdvancedCommerceRefundReason getRefundReason() {
+ return AdvancedCommerceRefundReason.fromValue(refundReason);
+ }
+
+ public void setRefundReason(AdvancedCommerceRefundReason refundReason) {
+ this.refundReason = Objects.requireNonNull(refundReason).getValue();
+ }
+
+ public void setRawRefundReason(String rawRefundReason) {
+ this.refundReason = Objects.requireNonNull(rawRefundReason);
+ }
+
+ public AdvancedCommerceRequestRefundItem refundType(AdvancedCommerceRefundType refundType) {
+ this.refundType = Objects.requireNonNull(refundType).getValue();
+ return this;
+ }
+
+ /**
+ * The type of refund requested.
+ *
+ * @return refundType
+ **/
+ public AdvancedCommerceRefundType getRefundType() {
+ return AdvancedCommerceRefundType.fromValue(refundType);
+ }
+
+ /**
+ * @see #getRefundType()
+ */
+ public String getRawRefundType() {
+ return refundType;
+ }
+
+ public void setRefundType(AdvancedCommerceRefundType refundType) {
+ this.refundType = Objects.requireNonNull(refundType).getValue();
+ }
+
+ public void setRawRefundType(String rawRefundType) {
+ this.refundType = Objects.requireNonNull(rawRefundType);
+ }
+
+ public AdvancedCommerceRequestRefundItem revoke(Boolean revoke) {
+ this.revoke = Objects.requireNonNull(revoke);
+ return this;
+ }
+
+ /**
+ * @return revoke
+ **/
+ public Boolean getRevoke() {
+ return revoke;
+ }
+
+ public void setRevoke(Boolean revoke) {
+ this.revoke = Objects.requireNonNull(revoke);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ AdvancedCommerceRequestRefundItem that = (AdvancedCommerceRequestRefundItem) o;
+ return Objects.equals(sku, that.sku) && Objects.equals(refundAmount, that.refundAmount) && Objects.equals(refundReason, that.refundReason) && Objects.equals(refundType, that.refundType) && Objects.equals(revoke, that.revoke);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(sku, refundAmount, refundReason, refundType, revoke);
+ }
+
+ @Override
+ public String toString() {
+ return "AdvancedCommerceRequestRefundItem{" +
+ "sku='" + sku + '\'' +
+ ", refundAmount=" + refundAmount +
+ ", refundReason=" + refundReason +
+ ", refundType='" + refundType + '\'' +
+ ", revoke=" + revoke +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRequestRefundRequest.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRequestRefundRequest.java
new file mode 100644
index 00000000..be527008
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRequestRefundRequest.java
@@ -0,0 +1,153 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * The request body for requesting a refund for a transaction.
+ *
+ * @see RequestRefundRequest
+ */
+public class AdvancedCommerceRequestRefundRequest extends AdvancedCommerceRequest {
+ private static final String SERIALIZED_NAME_CURRENCY = "currency";
+ private static final String SERIALIZED_NAME_ITEMS = "items";
+ private static final String SERIALIZED_NAME_REFUND_RISKING_PREFERENCE = "refundRiskingPreference";
+ private static final String SERIALIZED_NAME_STOREFRONT = "storefront";
+
+ @JsonProperty(SERIALIZED_NAME_CURRENCY)
+ private String currency;
+ @JsonProperty(value = SERIALIZED_NAME_ITEMS, required = true)
+ private List items;
+ @JsonProperty(value = SERIALIZED_NAME_REFUND_RISKING_PREFERENCE, required = true)
+ private Boolean refundRiskingPreference;
+ @JsonProperty(SERIALIZED_NAME_STOREFRONT)
+ private String storefront;
+
+ private AdvancedCommerceRequestRefundRequest() {
+ super();
+ }
+
+ public AdvancedCommerceRequestRefundRequest(
+ List items,
+ Boolean refundRiskingPreference,
+ AdvancedCommerceRequestInfo requestInfo
+ ) {
+ super(requestInfo);
+ this.items = Objects.requireNonNull(items);
+ this.refundRiskingPreference = Objects.requireNonNull(refundRiskingPreference);
+ }
+
+ @Override
+ protected AdvancedCommerceRequestRefundRequest self() {
+ return this;
+ }
+
+ public AdvancedCommerceRequestRefundRequest currency(String currency) {
+ this.currency = Objects.requireNonNull(currency);
+ return this;
+ }
+
+ /**
+ * The currency of the transaction.
+ *
+ * @return currency
+ * @see currency
+ **/
+ public String getCurrency() {
+ return currency;
+ }
+
+ public void setCurrency(String currency) {
+ this.currency = Objects.requireNonNull(currency);
+ }
+
+ public AdvancedCommerceRequestRefundRequest items(List items) {
+ this.items = Objects.requireNonNull(items);
+ return this;
+ }
+
+ public AdvancedCommerceRequestRefundRequest addItem(AdvancedCommerceRequestRefundItem item) {
+ Objects.requireNonNull(item);
+ this.items.add(item);
+ return this;
+ }
+
+ /**
+ * @return items
+ * @see RequestRefundItem
+ **/
+ public List getItems() {
+ return items;
+ }
+
+ public void setItems(List items) {
+ this.items = Objects.requireNonNull(items);
+ }
+
+ public AdvancedCommerceRequestRefundRequest refundRiskingPreference(Boolean refundRiskingPreference) {
+ this.refundRiskingPreference = Objects.requireNonNull(refundRiskingPreference);
+ return this;
+ }
+
+ /**
+ * @return refundRiskingPreference
+ * @see RefundRiskingPreference
+ **/
+ public Boolean getRefundRiskingPreference() {
+ return refundRiskingPreference;
+ }
+
+ public void setRefundRiskingPreference(Boolean refundRiskingPreference) {
+ this.refundRiskingPreference = Objects.requireNonNull(refundRiskingPreference);
+ }
+
+
+ public AdvancedCommerceRequestRefundRequest storefront(String storefront) {
+ this.storefront = storefront;
+ return this;
+ }
+
+ /**
+ * @return storefront
+ * @see storefront
+ **/
+ public String getStorefront() {
+ return storefront;
+ }
+
+ public void setStorefront(String storefront) {
+ this.storefront = storefront;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ if (!super.equals(o)) return false;
+ AdvancedCommerceRequestRefundRequest that = (AdvancedCommerceRequestRefundRequest) o;
+ return Objects.equals(currency, that.currency) &&
+ Objects.equals(items, that.items) &&
+ Objects.equals(refundRiskingPreference, that.refundRiskingPreference) &&
+ Objects.equals(storefront, that.storefront);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), currency, items, refundRiskingPreference, storefront);
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "{" +
+ "currency='" + currency + '\'' +
+ ", items=" + items +
+ ", refundRiskingPreference=" + refundRiskingPreference +
+ ", requestInfo=" + getRequestInfo() +
+ ", storefront='" + storefront + '\'' +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRequestRefundResponse.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRequestRefundResponse.java
new file mode 100644
index 00000000..a4bfda29
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRequestRefundResponse.java
@@ -0,0 +1,58 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import java.util.Objects;
+
+/**
+ * The response body for a transaction refund request.
+ *
+ * @see RequestRefundResponse
+ */
+public class AdvancedCommerceRequestRefundResponse extends AbstractAdvancedCommerceResponse {
+ private AdvancedCommerceRequestRefundResponse() {
+ super();
+ }
+
+ public AdvancedCommerceRequestRefundResponse(String signedTransactionInfo) {
+ super(null, Objects.requireNonNull(signedTransactionInfo));
+ }
+
+ @Override
+ protected AdvancedCommerceRequestRefundResponse self() {
+ return this;
+ }
+
+ @Override
+ public AdvancedCommerceRequestRefundResponse signedTransactionInfo(String signedTransactionInfo) {
+ Objects.requireNonNull(signedTransactionInfo);
+ return (AdvancedCommerceRequestRefundResponse) super.signedTransactionInfo(signedTransactionInfo);
+ }
+
+ @Override
+ public void setSignedTransactionInfo(String signedTransactionInfo) {
+ Objects.requireNonNull(signedTransactionInfo);
+ super.setSignedTransactionInfo(signedTransactionInfo);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ return super.equals(o);
+ }
+
+ @Override
+ public int hashCode() {
+ return super.hashCode();
+ }
+
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "{" +
+ "signedRenewalInfo='" + getSignedRenewalInfo() + '\'' +
+ ", signedTransactionInfo='" + getSignedTransactionInfo() + '\'' +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionCancelRequest.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionCancelRequest.java
new file mode 100644
index 00000000..27907666
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionCancelRequest.java
@@ -0,0 +1,74 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.Objects;
+
+/**
+ * The request body for turning off automatic renewal of a subscription.
+ *
+ * @see SubscriptionCancelRequest
+ */
+public class AdvancedCommerceSubscriptionCancelRequest extends AdvancedCommerceRequest {
+ private static final String SERIALIZED_NAME_STOREFRONT = "storefront";
+
+ @JsonProperty(SERIALIZED_NAME_STOREFRONT)
+ private String storefront;
+
+ private AdvancedCommerceSubscriptionCancelRequest() {
+ super();
+ }
+
+ public AdvancedCommerceSubscriptionCancelRequest(AdvancedCommerceRequestInfo requestInfo) {
+ super(requestInfo);
+ }
+
+ public AdvancedCommerceSubscriptionCancelRequest storefront(String storefront) {
+ this.storefront = storefront;
+ return this;
+ }
+
+ /**
+ * @return storefront
+ * @see storefront
+ **/
+ public String getStorefront() {
+ return storefront;
+ }
+
+ public void setStorefront(String storefront) {
+ this.storefront = storefront;
+ }
+
+ @Override
+ protected AdvancedCommerceSubscriptionCancelRequest self() {
+ return this;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o)
+ return true;
+ if (o == null || getClass() != o.getClass())
+ return false;
+ if (!super.equals(o))
+ return false;
+ AdvancedCommerceSubscriptionCancelRequest that = (AdvancedCommerceSubscriptionCancelRequest) o;
+ return Objects.equals(storefront, that.storefront);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), storefront);
+ }
+
+ @Override
+ public String toString() {
+ return "AdvancedCommerceSubscriptionCancelRequest{" +
+ "requestInfo=" + getRequestInfo() +
+ ", storefront='" + storefront + '\'' +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionCancelResponse.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionCancelResponse.java
new file mode 100644
index 00000000..42b1412f
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionCancelResponse.java
@@ -0,0 +1,57 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import java.util.Objects;
+
+/**
+ * The response body for a successful subscription cancellation.
+ *
+ * @see SubscriptionCancelResponse
+ */
+public class AdvancedCommerceSubscriptionCancelResponse extends AbstractAdvancedCommerceResponse {
+ private AdvancedCommerceSubscriptionCancelResponse() {
+ super();
+ }
+
+ public AdvancedCommerceSubscriptionCancelResponse(String signedRenewalInfo, String signedTransactionInfo) {
+ super(Objects.requireNonNull(signedRenewalInfo), Objects.requireNonNull(signedTransactionInfo));
+ }
+
+ @Override
+ protected AdvancedCommerceSubscriptionCancelResponse self() {
+ return this;
+ }
+
+ @Override
+ public AdvancedCommerceSubscriptionCancelResponse signedRenewalInfo(String signedRenewalInfo) {
+ Objects.requireNonNull(signedRenewalInfo);
+ return (AdvancedCommerceSubscriptionCancelResponse) super.signedRenewalInfo(signedRenewalInfo);
+ }
+
+ @Override
+ public AdvancedCommerceSubscriptionCancelResponse signedTransactionInfo(String signedTransactionInfo) {
+ Objects.requireNonNull(signedTransactionInfo);
+ return (AdvancedCommerceSubscriptionCancelResponse) super.signedTransactionInfo(signedTransactionInfo);
+ }
+
+ @Override
+ public void setSignedRenewalInfo(String signedRenewalInfo) {
+ Objects.requireNonNull(signedRenewalInfo);
+ super.setSignedRenewalInfo(signedRenewalInfo);
+ }
+
+ @Override
+ public void setSignedTransactionInfo(String signedTransactionInfo) {
+ Objects.requireNonNull(signedTransactionInfo);
+ super.setSignedTransactionInfo(signedTransactionInfo);
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "{" +
+ "signedRenewalInfo='" + getSignedRenewalInfo() + '\'' +
+ ", signedTransactionInfo='" + getSignedTransactionInfo() + '\'' +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionChangeMetadataDescriptors.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionChangeMetadataDescriptors.java
new file mode 100644
index 00000000..66b62c3e
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionChangeMetadataDescriptors.java
@@ -0,0 +1,110 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.Objects;
+
+/**
+ * The subscription metadata to change, specifically the description and display name.
+ *
+ * @see SubscriptionChangeMetadataDescriptors
+ */
+public class AdvancedCommerceSubscriptionChangeMetadataDescriptors {
+ private static final String SERIALIZED_NAME_EFFECTIVE = "effective";
+ private static final String SERIALIZED_NAME_DESCRIPTION = "description";
+ private static final String SERIALIZED_NAME_DISPLAY_NAME = "displayName";
+
+ @JsonProperty(value = SERIALIZED_NAME_EFFECTIVE, required = true)
+ private AdvancedCommerceEffective effective;
+ @JsonProperty(SERIALIZED_NAME_DESCRIPTION)
+ private String description;
+ @JsonProperty(SERIALIZED_NAME_DISPLAY_NAME)
+ private String displayName;
+
+ private AdvancedCommerceSubscriptionChangeMetadataDescriptors() {}
+
+ public AdvancedCommerceSubscriptionChangeMetadataDescriptors(AdvancedCommerceEffective effective) {
+ this.effective = Objects.requireNonNull(effective);
+ }
+
+ public AdvancedCommerceSubscriptionChangeMetadataDescriptors effective(AdvancedCommerceEffective effective) {
+ this.effective = Objects.requireNonNull(effective);
+ return this;
+ }
+
+ /**
+ * The string that determines when the metadata change goes into effect.
+ *
+ * @return effective
+ * @see Effective
+ **/
+ public AdvancedCommerceEffective getEffective() {
+ return effective;
+ }
+
+ public void setEffective(AdvancedCommerceEffective effective) {
+ this.effective = Objects.requireNonNull(effective);
+ }
+
+ public AdvancedCommerceSubscriptionChangeMetadataDescriptors description(String description) {
+ this.description = description == null ? null : AdvancedCommerceValidationUtils.validateDescription(description);
+ return this;
+ }
+
+ /**
+ * The new description for the subscription.
+ *
+ * @return description
+ * @see description
+ **/
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description == null ? null : AdvancedCommerceValidationUtils.validateDescription(description);
+ }
+
+ public AdvancedCommerceSubscriptionChangeMetadataDescriptors displayName(String displayName) {
+ this.displayName = displayName == null ? null : AdvancedCommerceValidationUtils.validateDisplayName(displayName);
+ return this;
+ }
+
+ /**
+ * The new display name for the subscription.
+ *
+ * @return displayName
+ * @see displayName
+ **/
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ public void setDisplayName(String displayName) {
+ this.displayName = displayName == null ? null : AdvancedCommerceValidationUtils.validateDisplayName(displayName);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ AdvancedCommerceSubscriptionChangeMetadataDescriptors that = (AdvancedCommerceSubscriptionChangeMetadataDescriptors) o;
+ return Objects.equals(effective, that.effective) && Objects.equals(description, that.description) && Objects.equals(displayName, that.displayName);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), effective, description, displayName);
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "{" +
+ "effective=" + effective +
+ ", description='" + description + '\'' +
+ ", displayName='" + displayName + '\'' +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionChangeMetadataItem.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionChangeMetadataItem.java
new file mode 100644
index 00000000..37f18812
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionChangeMetadataItem.java
@@ -0,0 +1,157 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.Objects;
+
+/**
+ * The metadata to change for an item, specifically its SKU, description, and display name.
+ *
+ * @see SubscriptionChangeMetadataItem
+ */
+public class AdvancedCommerceSubscriptionChangeMetadataItem {
+ private static final String SERIALIZED_NAME_CURRENT_SKU = "currentSKU";
+ private static final String SERIALIZED_NAME_EFFECTIVE = "effective";
+ private static final String SERIALIZED_NAME_DESCRIPTION = "description";
+ private static final String SERIALIZED_NAME_DISPLAY_NAME = "displayName";
+ private static final String SERIALIZED_NAME_SKU = "SKU";
+
+ @JsonProperty(value = SERIALIZED_NAME_CURRENT_SKU, required = true)
+ private String currentSku;
+ @JsonProperty(value = SERIALIZED_NAME_EFFECTIVE, required = true)
+ private AdvancedCommerceEffective effective;
+ @JsonProperty(SERIALIZED_NAME_DESCRIPTION)
+ private String description;
+ @JsonProperty(SERIALIZED_NAME_DISPLAY_NAME)
+ private String displayName;
+ @JsonProperty(SERIALIZED_NAME_SKU)
+ private String sku;
+
+ private AdvancedCommerceSubscriptionChangeMetadataItem() {}
+
+ public AdvancedCommerceSubscriptionChangeMetadataItem(String currentSKU, AdvancedCommerceEffective effective) {
+ this.currentSku = AdvancedCommerceValidationUtils.validateSku(currentSKU);
+ this.effective = Objects.requireNonNull(effective);
+ }
+
+ public AdvancedCommerceSubscriptionChangeMetadataItem currentSku(String currentSku) {
+ this.currentSku = AdvancedCommerceValidationUtils.validateSku(currentSku);
+ return this;
+ }
+
+ /**
+ * The original SKU of the item.
+ *
+ * @return currentSku
+ * @see SKU
+ **/
+ public String getCurrentSku() {
+ return currentSku;
+ }
+
+ public void setCurrentSku(String currentSku) {
+ this.currentSku = AdvancedCommerceValidationUtils.validateSku(currentSku);
+ }
+
+ public AdvancedCommerceSubscriptionChangeMetadataItem effective(AdvancedCommerceEffective effective) {
+ this.effective = Objects.requireNonNull(effective);
+ return this;
+ }
+
+ /**
+ * The string that determines when the metadata change goes into effect.
+ *
+ * @return effective
+ * @see effective
+ **/
+ public AdvancedCommerceEffective getEffective() {
+ return effective;
+ }
+
+ public void setEffective(AdvancedCommerceEffective effective) {
+ this.effective = Objects.requireNonNull(effective);
+ }
+
+ public AdvancedCommerceSubscriptionChangeMetadataItem description(String description) {
+ this.description = description == null ? null : AdvancedCommerceValidationUtils.validateDescription(description);
+ return this;
+ }
+
+ /**
+ * The new description for the item.
+ *
+ * @return description
+ * @see description
+ **/
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description == null ? null : AdvancedCommerceValidationUtils.validateDescription(description);
+ }
+
+ public AdvancedCommerceSubscriptionChangeMetadataItem displayName(String displayName) {
+ this.displayName = displayName == null ? null : AdvancedCommerceValidationUtils.validateDisplayName(displayName);
+ return this;
+ }
+
+ /**
+ * The new display name for the item.
+ *
+ * @return displayName
+ * @see displayName
+ **/
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ public void setDisplayName(String displayName) {
+ this.displayName = displayName == null ? null : AdvancedCommerceValidationUtils.validateDisplayName(displayName);
+ }
+
+ public AdvancedCommerceSubscriptionChangeMetadataItem sku(String sku) {
+ this.sku = AdvancedCommerceValidationUtils.validateSku(sku);
+ return this;
+ }
+
+ /**
+ * The new SKU of the item.
+ *
+ * @return SKU
+ * @see SKU
+ **/
+ public String getSku() {
+ return sku;
+ }
+
+ public void setSku(String sku) {
+ this.sku = sku == null ? null : AdvancedCommerceValidationUtils.validateSku(sku);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ AdvancedCommerceSubscriptionChangeMetadataItem that = (AdvancedCommerceSubscriptionChangeMetadataItem) o;
+ return Objects.equals(effective, that.effective) && Objects.equals(currentSku, that.currentSku) && Objects.equals(description, that.description) && Objects.equals(displayName, that.displayName) && Objects.equals(sku, that.sku);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(effective, currentSku, description, displayName, sku);
+ }
+
+ @Override
+ public String toString() {
+ return "AdvancedCommerceSubscriptionChangeMetadataItem{" +
+ "sku='" + sku + '\'' +
+ ", currentSku='" + currentSku + '\'' +
+ ", description='" + description + '\'' +
+ ", displayName='" + displayName + '\'' +
+ ", effective=" + effective +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionChangeMetadataRequest.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionChangeMetadataRequest.java
new file mode 100644
index 00000000..59e72fcd
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionChangeMetadataRequest.java
@@ -0,0 +1,144 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * The request body you provide to change the metadata of a subscription.
+ *
+ * @see SubscriptionChangeMetadataRequest
+ */
+public class AdvancedCommerceSubscriptionChangeMetadataRequest extends AdvancedCommerceRequest {
+ private static final String SERIALIZED_NAME_DESCRIPTORS = "descriptors";
+ private static final String SERIALIZED_NAME_ITEMS = "items";
+ private static final String SERIALIZED_NAME_STOREFRONT = "storefront";
+ private static final String SERIALIZED_NAME_TAX_CODE = "taxCode";
+
+ @JsonProperty(SERIALIZED_NAME_DESCRIPTORS)
+ private AdvancedCommerceSubscriptionChangeMetadataDescriptors descriptors;
+ @JsonProperty(SERIALIZED_NAME_ITEMS)
+ private List items;
+ @JsonProperty(SERIALIZED_NAME_STOREFRONT)
+ private String storefront;
+ @JsonProperty(SERIALIZED_NAME_TAX_CODE)
+ private String taxCode;
+
+ private AdvancedCommerceSubscriptionChangeMetadataRequest() {}
+
+ public AdvancedCommerceSubscriptionChangeMetadataRequest(AdvancedCommerceRequestInfo requestInfo) {
+ super(requestInfo);
+ }
+
+ @Override
+ protected AdvancedCommerceSubscriptionChangeMetadataRequest self() {
+ return this;
+ }
+
+ public AdvancedCommerceSubscriptionChangeMetadataRequest descriptors(AdvancedCommerceSubscriptionChangeMetadataDescriptors descriptors) {
+ this.descriptors = descriptors;
+ return this;
+ }
+
+ /**
+ * @return descriptors
+ * @see SubscriptionChangeMetadataDescriptors
+ **/
+ public AdvancedCommerceSubscriptionChangeMetadataDescriptors getDescriptors() {
+ return descriptors;
+ }
+
+ public void setDescriptors(AdvancedCommerceSubscriptionChangeMetadataDescriptors descriptors) {
+ this.descriptors = descriptors;
+ }
+
+ public AdvancedCommerceSubscriptionChangeMetadataRequest items(List items) {
+ this.items = items;
+ return this;
+ }
+
+ public AdvancedCommerceSubscriptionChangeMetadataRequest addItem(AdvancedCommerceSubscriptionChangeMetadataItem item) {
+ Objects.requireNonNull(item);
+ if (this.items == null) {
+ this.items = new ArrayList<>();
+ }
+ this.items.add(item);
+ return this;
+ }
+
+ /**
+ * @return items
+ * @see SubscriptionChangeMetadataItem
+ **/
+ public List getItems() {
+ return items;
+ }
+
+ public void setItems(List items) {
+ this.items = items;
+ }
+
+
+ public AdvancedCommerceSubscriptionChangeMetadataRequest taxCode(String taxCode) {
+ this.taxCode = taxCode;
+ return this;
+ }
+
+ /**
+ * @return taxCode
+ * @see TaxCode
+ **/
+ public String getTaxCode() {
+ return taxCode;
+ }
+
+ public void setTaxCode(String taxCode) {
+ this.taxCode = taxCode;
+ }
+
+ public AdvancedCommerceSubscriptionChangeMetadataRequest storefront(String storefront) {
+ this.storefront = storefront;
+ return this;
+ }
+
+ /**
+ * @return storefront
+ * @see storefront
+ **/
+ public String getStorefront() {
+ return storefront;
+ }
+
+ public void setStorefront(String storefront) {
+ this.storefront = storefront;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ if (!super.equals(o)) return false;
+ AdvancedCommerceSubscriptionChangeMetadataRequest that = (AdvancedCommerceSubscriptionChangeMetadataRequest) o;
+ return Objects.equals(descriptors, that.descriptors) && Objects.equals(items, that.items) && Objects.equals(taxCode, that.taxCode) && Objects.equals(storefront, that.storefront);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), descriptors, items, storefront, taxCode);
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "{" +
+ "descriptors=" + descriptors + '\'' +
+ ", items=" + items + '\'' +
+ ", requestInfo=" + getRequestInfo() + '\'' +
+ ", storefront='" + storefront + '\'' +
+ ", taxCode='" + taxCode + '\'' +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionChangeMetadataResponse.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionChangeMetadataResponse.java
new file mode 100644
index 00000000..f3921a66
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionChangeMetadataResponse.java
@@ -0,0 +1,57 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import java.util.Objects;
+
+/**
+ * The response body for a successful subscription metadata change.
+ *
+ * @see SubscriptionChangeMetadataResponse
+ */
+public class AdvancedCommerceSubscriptionChangeMetadataResponse extends AbstractAdvancedCommerceResponse {
+ private AdvancedCommerceSubscriptionChangeMetadataResponse() {
+ super();
+ }
+
+ public AdvancedCommerceSubscriptionChangeMetadataResponse(String signedRenewalInfo, String signedTransactionInfo) {
+ super(Objects.requireNonNull(signedRenewalInfo), Objects.requireNonNull(signedTransactionInfo));
+ }
+
+ @Override
+ protected AdvancedCommerceSubscriptionChangeMetadataResponse self() {
+ return this;
+ }
+
+ @Override
+ public AdvancedCommerceSubscriptionChangeMetadataResponse signedRenewalInfo(String signedRenewalInfo) {
+ Objects.requireNonNull(signedRenewalInfo);
+ return (AdvancedCommerceSubscriptionChangeMetadataResponse) super.signedRenewalInfo(signedRenewalInfo);
+ }
+
+ @Override
+ public AdvancedCommerceSubscriptionChangeMetadataResponse signedTransactionInfo(String signedTransactionInfo) {
+ Objects.requireNonNull(signedTransactionInfo);
+ return (AdvancedCommerceSubscriptionChangeMetadataResponse) super.signedTransactionInfo(signedTransactionInfo);
+ }
+
+ @Override
+ public void setSignedRenewalInfo(String signedRenewalInfo) {
+ Objects.requireNonNull(signedRenewalInfo);
+ super.setSignedRenewalInfo(signedRenewalInfo);
+ }
+
+ @Override
+ public void setSignedTransactionInfo(String signedTransactionInfo) {
+ Objects.requireNonNull(signedTransactionInfo);
+ super.setSignedTransactionInfo(signedTransactionInfo);
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "{" +
+ "signedRenewalInfo='" + getSignedRenewalInfo() + '\'' +
+ ", signedTransactionInfo='" + getSignedTransactionInfo() + '\'' +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionCreateItem.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionCreateItem.java
new file mode 100644
index 00000000..4dfb477a
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionCreateItem.java
@@ -0,0 +1,95 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.Objects;
+
+/**
+ * The data that describes a subscription item.
+ *
+ * @see SubscriptionCreateItem
+ */
+public class AdvancedCommerceSubscriptionCreateItem extends AbstractAdvancedCommerceItem {
+ private static final String SERIALIZED_NAME_OFFER = "offer";
+ private static final String SERIALIZED_NAME_PRICE = "price";
+
+ @JsonProperty(SERIALIZED_NAME_OFFER)
+ private AdvancedCommerceOffer offer;
+ @JsonProperty(value = SERIALIZED_NAME_PRICE, required = true)
+ private Long price;
+
+ private AdvancedCommerceSubscriptionCreateItem() {
+ super();
+ }
+
+ @Override
+ protected AbstractAdvancedCommerceItem self() {
+ return this;
+ }
+
+ public AdvancedCommerceSubscriptionCreateItem(String sku, String description, String displayName, Long price) {
+ super(sku, description, displayName);
+ this.price = Objects.requireNonNull(price);
+ }
+
+ public AdvancedCommerceSubscriptionCreateItem offer(AdvancedCommerceOffer offer) {
+ this.offer = offer;
+ return this;
+ }
+
+ /**
+ * @return offer
+ * @see Offer
+ **/
+ public AdvancedCommerceOffer getOffer() {
+ return offer;
+ }
+
+ public void setOffer(AdvancedCommerceOffer offer) {
+ this.offer = offer;
+ }
+
+ public AdvancedCommerceSubscriptionCreateItem price(Long price) {
+ this.price = Objects.requireNonNull(price);
+ return this;
+ }
+
+ /**
+ * @return price
+ * @see price
+ **/
+ public Long getPrice() {
+ return price;
+ }
+
+ public void setPrice(Long price) {
+ this.price = Objects.requireNonNull(price);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ if (!super.equals(o)) return false;
+ AdvancedCommerceSubscriptionCreateItem that = (AdvancedCommerceSubscriptionCreateItem) o;
+ return Objects.equals(offer, that.offer) && Objects.equals(price, that.price);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), offer, price);
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "{" +
+ "sku='" + sku + '\'' +
+ ", description='" + description + '\'' +
+ ", displayName='" + displayName + '\'' +
+ ", offer=" + offer + '\'' +
+ ", price=" + price +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionCreateRequest.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionCreateRequest.java
new file mode 100644
index 00000000..b518ffef
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionCreateRequest.java
@@ -0,0 +1,217 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * The request data your app provides when a customer purchases an auto-renewable subscription.
+ *
+ * @see SubscriptionCreateRequest
+ */
+public class AdvancedCommerceSubscriptionCreateRequest extends AbstractAdvancedCommerceInAppRequest {
+ private static final String OPERATION = "CREATE_SUBSCRIPTION";
+ private static final String VERSION = "1";
+
+ private static final String SERIALIZED_NAME_CURRENCY = "currency";
+ private static final String SERIALIZED_NAME_DESCRIPTORS = "descriptors";
+ private static final String SERIALIZED_NAME_ITEMS = "items";
+ private static final String SERIALIZED_NAME_PERIOD = "period";
+ private static final String SERIALIZED_NAME_PREVIOUS_TRANSACTION_ID = "previousTransactionId";
+ private static final String SERIALIZED_NAME_STOREFRONT = "storefront";
+ private static final String SERIALIZED_NAME_TAX_CODE = "taxCode";
+
+ @JsonProperty(value = SERIALIZED_NAME_CURRENCY, required = true)
+ private String currency;
+ @JsonProperty(value = SERIALIZED_NAME_DESCRIPTORS, required = true)
+ private AdvancedCommerceDescriptors descriptors;
+ @JsonProperty(value = SERIALIZED_NAME_ITEMS, required = true)
+ private List items;
+ @JsonProperty(value = SERIALIZED_NAME_PERIOD, required = true)
+ private AdvancedCommercePeriod period;
+ @JsonProperty(SERIALIZED_NAME_PREVIOUS_TRANSACTION_ID)
+ private String previousTransactionId;
+ @JsonProperty(SERIALIZED_NAME_STOREFRONT)
+ private String storefront;
+ @JsonProperty(value = SERIALIZED_NAME_TAX_CODE, required = true)
+ private String taxCode;
+
+ private AdvancedCommerceSubscriptionCreateRequest() {}
+
+ public AdvancedCommerceSubscriptionCreateRequest(
+ String currency,
+ AdvancedCommerceDescriptors descriptors,
+ List items,
+ AdvancedCommercePeriod period,
+ AdvancedCommerceRequestInfo requestInfo,
+ String taxCode
+ ) {
+ super(OPERATION, VERSION, requestInfo);
+ this.currency = Objects.requireNonNull(currency);
+ this.descriptors = Objects.requireNonNull(descriptors);
+ this.items = AdvancedCommerceValidationUtils.validateItems(items);
+ this.period = Objects.requireNonNull(period);
+ this.taxCode = Objects.requireNonNull(taxCode);
+ }
+
+ @Override
+ protected AdvancedCommerceSubscriptionCreateRequest self() {
+ return this;
+ }
+
+ public AdvancedCommerceSubscriptionCreateRequest currency(String currency) {
+ this.currency = Objects.requireNonNull(currency);
+ return this;
+ }
+
+ /**
+ * @return currency
+ * @see currency
+ **/
+ public String getCurrency() {
+ return currency;
+ }
+
+ public void setCurrency(String currency) {
+ this.currency = Objects.requireNonNull(currency);
+ }
+
+ public AdvancedCommerceSubscriptionCreateRequest descriptors(AdvancedCommerceDescriptors descriptors) {
+ this.descriptors = Objects.requireNonNull(descriptors);
+ return this;
+ }
+
+ /**
+ * @return descriptors
+ * @see Descriptors
+ **/
+ public AdvancedCommerceDescriptors getDescriptors() {
+ return descriptors;
+ }
+
+ public void setDescriptors(AdvancedCommerceDescriptors descriptors) {
+ this.descriptors = Objects.requireNonNull(descriptors);
+ }
+
+ public AdvancedCommerceSubscriptionCreateRequest items(List items) {
+ this.items = AdvancedCommerceValidationUtils.validateItems(items);
+ return this;
+ }
+
+ public AdvancedCommerceSubscriptionCreateRequest addItem(AdvancedCommerceSubscriptionCreateItem item) {
+ Objects.requireNonNull(item);
+ this.items.add(item);
+ return this;
+ }
+
+ /**
+ * @return items
+ * @see SubscriptionCreateItem
+ **/
+ public List getItems() {
+ return items;
+ }
+
+ public void setItems(List items) {
+ this.items = AdvancedCommerceValidationUtils.validateItems(items);
+ }
+
+ public AdvancedCommerceSubscriptionCreateRequest period(AdvancedCommercePeriod period) {
+ this.period = Objects.requireNonNull(period);
+ return this;
+ }
+
+ /**
+ * @return period
+ * @see period
+ **/
+ public AdvancedCommercePeriod getPeriod() {
+ return period;
+ }
+
+ public void setPeriod(AdvancedCommercePeriod period) {
+ this.period = Objects.requireNonNull(period);
+ }
+
+ public AdvancedCommerceSubscriptionCreateRequest previousTransactionId(String previousTransactionId) {
+ this.previousTransactionId = previousTransactionId;
+ return this;
+ }
+
+ /**
+ * @return previousTransactionId
+ * @see transactionId
+ **/
+ public String getPreviousTransactionId() {
+ return previousTransactionId;
+ }
+
+ public void setPreviousTransactionId(String previousTransactionId) {
+ this.previousTransactionId = previousTransactionId;
+ }
+
+ public AdvancedCommerceSubscriptionCreateRequest storefront(String storefront) {
+ this.storefront = storefront;
+ return this;
+ }
+
+ /**
+ * @return storefront
+ * @see storefront
+ **/
+ public String getStorefront() {
+ return storefront;
+ }
+
+ public void setStorefront(String storefront) {
+ this.storefront = storefront;
+ }
+
+ public AdvancedCommerceSubscriptionCreateRequest taxCode(String taxCode) {
+ this.taxCode = Objects.requireNonNull(taxCode);
+ return this;
+ }
+
+ /**
+ * @return taxCode
+ * @see taxCode
+ **/
+ public String getTaxCode() {
+ return taxCode;
+ }
+
+ public void setTaxCode(String taxCode) {
+ this.taxCode = Objects.requireNonNull(taxCode);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ if (!super.equals(o)) return false;
+ AdvancedCommerceSubscriptionCreateRequest that = (AdvancedCommerceSubscriptionCreateRequest) o;
+ return Objects.equals(currency, that.currency) && Objects.equals(descriptors, that.descriptors) && Objects.equals(items, that.items) && Objects.equals(period, that.period) && Objects.equals(previousTransactionId, that.previousTransactionId) && Objects.equals(storefront, that.storefront) && Objects.equals(taxCode, that.taxCode);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), currency, descriptors, items, period, previousTransactionId, storefront, taxCode);
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "{" +
+ "currency='" + currency + '\'' +
+ ", descriptors=" + descriptors +
+ ", items=" + items +
+ ", period=" + period +
+ ", previousTransactionId='" + previousTransactionId + '\'' +
+ ", requestInfo=" + getRequestInfo() +
+ ", storefront='" + storefront + '\'' +
+ ", taxCode='" + taxCode + '\'' +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionMigrateDescriptors.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionMigrateDescriptors.java
new file mode 100644
index 00000000..438f4013
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionMigrateDescriptors.java
@@ -0,0 +1,39 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+/*
+ * The description and display name of the subscription to migrate to that you manage.
+ *
+ * @see SubscriptionMigrateDescriptors
+ */
+public class AdvancedCommerceSubscriptionMigrateDescriptors extends AdvancedCommerceDescriptors {
+ private AdvancedCommerceSubscriptionMigrateDescriptors() {
+ super();
+ }
+
+ public AdvancedCommerceSubscriptionMigrateDescriptors(String description, String displayName) {
+ super(description, displayName);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ return super.equals(o);
+ }
+
+ @Override
+ public int hashCode() {
+ return super.hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "{" +
+ "description='" + description + '\'' +
+ ", displayName='" + displayName + '\'' +
+ '}';
+ }
+
+}
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionMigrateItem.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionMigrateItem.java
new file mode 100644
index 00000000..ab3b25ae
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionMigrateItem.java
@@ -0,0 +1,32 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+/**
+ * The SKU, description, and display name to use for a migrated subscription item.
+ *
+ * @see SubscriptionMigrateItem
+ */
+public class AdvancedCommerceSubscriptionMigrateItem extends AbstractAdvancedCommerceItem {
+ private AdvancedCommerceSubscriptionMigrateItem() {
+ super();
+ }
+
+ public AdvancedCommerceSubscriptionMigrateItem(String sku, String description, String displayName) {
+ super(sku, description, displayName);
+ }
+
+ @Override
+ protected AdvancedCommerceSubscriptionMigrateItem self() {
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + " {" +
+ " sku='" + sku + '\'' +
+ ", description='" + description + '\'' +
+ ", displayName='" + displayName + '\'' +
+ " }";
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionMigrateRenewalItem.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionMigrateRenewalItem.java
new file mode 100644
index 00000000..c09015de
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionMigrateRenewalItem.java
@@ -0,0 +1,44 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+/**
+ * The item information that replaces a migrated subscription item when the subscription renews.
+ *
+ * @see SubscriptionMigrateRenewalItem
+ */
+public class AdvancedCommerceSubscriptionMigrateRenewalItem extends AbstractAdvancedCommerceItem {
+ private AdvancedCommerceSubscriptionMigrateRenewalItem() {
+ super();
+ }
+
+ public AdvancedCommerceSubscriptionMigrateRenewalItem(String sku, String description, String displayName) {
+ super(sku, description, displayName);
+ }
+
+ @Override
+ protected AdvancedCommerceSubscriptionMigrateRenewalItem self() {
+ return this;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ return super.equals(o);
+ }
+
+ @Override
+ public int hashCode() {
+ return super.hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + " {" +
+ " sku='" + sku + '\'' +
+ ", description='" + description + '\'' +
+ ", displayName='" + displayName + '\'' +
+ " }";
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionMigrateRequest.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionMigrateRequest.java
new file mode 100644
index 00000000..040d4361
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionMigrateRequest.java
@@ -0,0 +1,216 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * The subscription details you provide to migrate a subscription from In-App Purchase to the Advanced Commerce API, such as descriptors, items, storefront, and more.
+ *
+ * @see SubscriptionMigrateRequest
+ */
+public class AdvancedCommerceSubscriptionMigrateRequest extends AdvancedCommerceRequest {
+ private static final String SERIALIZED_NAME_DESCRIPTORS = "descriptors";
+ private static final String SERIALIZED_NAME_ITEMS = "items";
+ private static final String SERIALIZED_NAME_RENEWAL_ITEMS = "renewalItems";
+ private static final String SERIALIZED_NAME_STOREFRONT = "storefront";
+ private static final String SERIALIZED_NAME_TARGET_PRODUCT_ID = "targetProductId";
+ private static final String SERIALIZED_NAME_TAX_CODE = "taxCode";
+
+ @JsonProperty(value = SERIALIZED_NAME_DESCRIPTORS, required = true)
+ private AdvancedCommerceSubscriptionMigrateDescriptors descriptors;
+ @JsonProperty(value = SERIALIZED_NAME_ITEMS, required = true)
+ private List items;
+ @JsonProperty(SERIALIZED_NAME_RENEWAL_ITEMS)
+ private List renewalItems;
+ @JsonProperty(SERIALIZED_NAME_STOREFRONT)
+ private String storefront;
+ @JsonProperty(value = SERIALIZED_NAME_TARGET_PRODUCT_ID, required = true)
+ private String targetProductId;
+ @JsonProperty(value = SERIALIZED_NAME_TAX_CODE, required = true)
+ private String taxCode;
+
+
+ private AdvancedCommerceSubscriptionMigrateRequest() {
+ super();
+ }
+
+ public AdvancedCommerceSubscriptionMigrateRequest(AdvancedCommerceRequestInfo requestInfo, AdvancedCommerceSubscriptionMigrateDescriptors descriptors, List items, String targetProductId, String taxCode) {
+ super(requestInfo);
+ this.descriptors = Objects.requireNonNull(descriptors);
+ this.items = AdvancedCommerceValidationUtils.validateItems(items);
+ this.targetProductId = Objects.requireNonNull(targetProductId);
+ this.taxCode = Objects.requireNonNull(taxCode);
+ }
+
+ public AdvancedCommerceSubscriptionMigrateRequest descriptors(AdvancedCommerceSubscriptionMigrateDescriptors descriptors) {
+ this.descriptors = Objects.requireNonNull(descriptors);
+ return this;
+ }
+
+ /**
+ * @return descriptors
+ * @see SubscriptionMigrateDescriptors
+ **/
+ public AdvancedCommerceSubscriptionMigrateDescriptors getDescriptors() {
+ return descriptors;
+ }
+
+ public void setDescriptors(AdvancedCommerceSubscriptionMigrateDescriptors descriptors) {
+ this.descriptors = Objects.requireNonNull(descriptors);
+ }
+
+ public AdvancedCommerceSubscriptionMigrateRequest items(List items) {
+ this.items = AdvancedCommerceValidationUtils.validateItems(items);
+ return this;
+ }
+
+ public AdvancedCommerceSubscriptionMigrateRequest addItem(AdvancedCommerceSubscriptionMigrateItem item) {
+ Objects.requireNonNull(item);
+ this.items.add(item);
+ return this;
+ }
+
+ /**
+ * An array of one or more SKUs, along with descriptions and display names, that are included in the subscription.
+ *
+ * @return items
+ * @see SubscriptionMigrateItem
+ **/
+ public List getItems() {
+ return items;
+ }
+
+ public void setItems(List items) {
+ this.items = AdvancedCommerceValidationUtils.validateItems(items);
+ }
+
+ public AdvancedCommerceSubscriptionMigrateRequest renewalItems(List renewalItems) {
+ this.renewalItems = renewalItems != null ? AdvancedCommerceValidationUtils.validateItems(renewalItems) : null;
+ return this;
+ }
+
+ public AdvancedCommerceSubscriptionMigrateRequest addRenewalItem(AdvancedCommerceSubscriptionMigrateRenewalItem renewalItem) {
+ Objects.requireNonNull(renewalItem);
+ if (this.renewalItems == null) {
+ this.renewalItems = new ArrayList<>();
+ }
+ this.renewalItems.add(renewalItem);
+ return this;
+ }
+
+ /**
+ * An optional array of subscription items that represents the items that renew at the next renewal period, if they differ from items.
+ *
+ * @return renewalItems
+ * @see SubscriptionMigrateRenewalItem
+ **/
+ public List getRenewalItems() {
+ return renewalItems;
+ }
+
+ public void setRenewalItems(List renewalItems) {
+ this.renewalItems = renewalItems != null ? AdvancedCommerceValidationUtils.validateItems(renewalItems) : null;
+ }
+
+
+ public AdvancedCommerceSubscriptionMigrateRequest targetProductId(String targetProductId) {
+ this.targetProductId = Objects.requireNonNull(targetProductId);
+ return this;
+ }
+
+ /**
+ * Your generic product ID for an auto-renewable subscription.
+ *
+ * @return targetProductId
+ * @see targetProductId
+ **/
+ public String getTargetProductId() {
+ return targetProductId;
+ }
+
+ public void setTargetProductId(String targetProductId) {
+ this.targetProductId = Objects.requireNonNull(targetProductId);
+ }
+
+ public AdvancedCommerceSubscriptionMigrateRequest taxCode(String taxCode) {
+ this.taxCode = Objects.requireNonNull(taxCode);
+ return this;
+ }
+
+ /**
+ * @return taxCode
+ * @see taxCode
+ **/
+ public String getTaxCode() {
+ return taxCode;
+ }
+
+ public void setTaxCode(String taxCode) {
+ this.taxCode = Objects.requireNonNull(taxCode);
+ }
+
+ public AdvancedCommerceSubscriptionMigrateRequest storefront(String storefront) {
+ this.storefront = storefront;
+ return this;
+ }
+
+ /**
+ * @return storefront
+ * @see storefront
+ **/
+ public String getStorefront() {
+ return storefront;
+ }
+
+ public void setStorefront(String storefront) {
+ this.storefront = storefront;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ if (!super.equals(o)) {
+ return false;
+ }
+ AdvancedCommerceSubscriptionMigrateRequest that = (AdvancedCommerceSubscriptionMigrateRequest) o;
+ return Objects.equals(this.descriptors, that.descriptors) &&
+ Objects.equals(this.items, that.items) &&
+ Objects.equals(this.renewalItems, that.renewalItems) &&
+ Objects.equals(this.storefront, that.storefront) &&
+ Objects.equals(this.targetProductId, that.targetProductId) &&
+ Objects.equals(this.taxCode, that.taxCode);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), descriptors, items, renewalItems, storefront, targetProductId, taxCode);
+ }
+
+ @Override
+ protected AdvancedCommerceSubscriptionMigrateRequest self() {
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "{" +
+ "descriptors=" + descriptors +
+ ", items=" + items +
+ ", renewalItems=" + renewalItems +
+ ", storefront='" + storefront + '\'' +
+ ", targetProductId='" + targetProductId + '\'' +
+ ", taxCode='" + taxCode + '\'' +
+ ", requestInfo=" + getRequestInfo() +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionMigrateResponse.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionMigrateResponse.java
new file mode 100644
index 00000000..85f8e5e9
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionMigrateResponse.java
@@ -0,0 +1,70 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import java.util.Objects;
+
+/**
+ * A response that contains signed renewal and transaction information after a subscription successfully migrates to the Advanced Commerce API.
+ *
+ * @see SubscriptionMigrateResponse
+ */
+public class AdvancedCommerceSubscriptionMigrateResponse extends AbstractAdvancedCommerceResponse {
+ private AdvancedCommerceSubscriptionMigrateResponse() {
+ super();
+ }
+
+ public AdvancedCommerceSubscriptionMigrateResponse(String signedRenewalInfo, String signedTransactionInfo) {
+ super(Objects.requireNonNull(signedRenewalInfo), Objects.requireNonNull(signedTransactionInfo));
+ }
+
+ @Override
+ protected AdvancedCommerceSubscriptionMigrateResponse self() {
+ return this;
+ }
+
+ @Override
+ public AdvancedCommerceSubscriptionMigrateResponse signedRenewalInfo(String signedRenewalInfo) {
+ Objects.requireNonNull(signedRenewalInfo);
+ return (AdvancedCommerceSubscriptionMigrateResponse) super.signedRenewalInfo(signedRenewalInfo);
+ }
+
+ @Override
+ public AdvancedCommerceSubscriptionMigrateResponse signedTransactionInfo(String signedTransactionInfo) {
+ Objects.requireNonNull(signedTransactionInfo);
+ return (AdvancedCommerceSubscriptionMigrateResponse) super.signedTransactionInfo(signedTransactionInfo);
+ }
+
+ @Override
+ public void setSignedRenewalInfo(String signedRenewalInfo) {
+ Objects.requireNonNull(signedRenewalInfo);
+ super.setSignedRenewalInfo(signedRenewalInfo);
+ }
+
+ @Override
+ public void setSignedTransactionInfo(String signedTransactionInfo) {
+ Objects.requireNonNull(signedTransactionInfo);
+ super.setSignedTransactionInfo(signedTransactionInfo);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ return super.equals(o);
+ }
+
+ @Override
+ public int hashCode() {
+ return super.hashCode();
+ }
+
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "{" +
+ "signedRenewalInfo='" + getSignedRenewalInfo() + '\'' +
+ ", signedTransactionInfo='" + getSignedTransactionInfo() + '\'' +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyAddItem.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyAddItem.java
new file mode 100644
index 00000000..ef86458e
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyAddItem.java
@@ -0,0 +1,117 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.Objects;
+
+/**
+ * The data your app provides to add items when it makes changes to an auto-renewable subscription.
+ *
+ * @see SubscriptionModifyAddItem
+ */
+public class AdvancedCommerceSubscriptionModifyAddItem extends AbstractAdvancedCommerceItem {
+ private static final String SERIALIZED_NAME_OFFER = "offer";
+ private static final String SERIALIZED_NAME_PRICE = "price";
+ private static final String SERIALIZED_NAME_PRORATED_PRICE = "proratedPrice";
+
+ @JsonProperty(SERIALIZED_NAME_OFFER)
+ private AdvancedCommerceOffer offer;
+ @JsonProperty(value = SERIALIZED_NAME_PRICE, required = true)
+ private Long price;
+ @JsonProperty(SERIALIZED_NAME_PRORATED_PRICE)
+ private Long proratedPrice;
+
+ private AdvancedCommerceSubscriptionModifyAddItem() {
+ super();
+ }
+
+ protected AbstractAdvancedCommerceItem self() {
+ return this;
+ }
+
+ public AdvancedCommerceSubscriptionModifyAddItem(String sku, String description, String displayName, long price) {
+ super(sku, description, displayName);
+ this.price = Objects.requireNonNull(price);
+ }
+
+ public AdvancedCommerceSubscriptionModifyAddItem offer(AdvancedCommerceOffer offer) {
+ this.offer = offer;
+ return this;
+ }
+
+ /**
+ * A discount offer for an auto-renewable subscription.
+ *
+ * @return offer
+ * @see Offer
+ **/
+ public AdvancedCommerceOffer getOffer() {
+ return offer;
+ }
+
+ public void setOffer(AdvancedCommerceOffer offer) {
+ this.offer = offer;
+ }
+
+ public AdvancedCommerceSubscriptionModifyAddItem price(long price) {
+ this.price = Objects.requireNonNull(price);
+ return this;
+ }
+
+ /**
+ * @return price
+ * @see price
+ **/
+ public Long getPrice() {
+ return price;
+ }
+
+ public void setPrice(Long price) {
+ this.price = Objects.requireNonNull(price);
+ }
+
+ public AdvancedCommerceSubscriptionModifyAddItem proratedPrice(Long proratedPrice) {
+ this.proratedPrice = proratedPrice;
+ return this;
+ }
+
+ /**
+ * @return proratedPrice
+ * @see proratedPrice
+ **/
+ public Long getProratedPrice() {
+ return proratedPrice;
+ }
+
+ public void setProratedPrice(Long proratedPrice) {
+ this.proratedPrice = proratedPrice;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ if (!super.equals(o)) return false;
+ AdvancedCommerceSubscriptionModifyAddItem that = (AdvancedCommerceSubscriptionModifyAddItem) o;
+ return Objects.equals(offer, that.offer) && Objects.equals(price, that.price) && Objects.equals(proratedPrice, that.proratedPrice);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), offer, price, proratedPrice);
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "{" +
+ "sku='" + sku + '\'' +
+ ", description='" + description + '\'' +
+ ", displayName='" + displayName + '\'' +
+ ", offer=" + offer + '\'' +
+ ", price=" + price + '\'' +
+ ", proratedPrice=" + proratedPrice + '\'' +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyChangeItem.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyChangeItem.java
new file mode 100644
index 00000000..3830a9d3
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyChangeItem.java
@@ -0,0 +1,179 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.Objects;
+
+/**
+ * The data your app provides to change an item of an auto-renewable subscription.
+ *
+ * @see SubscriptionModifyChangeItem
+ */
+public class AdvancedCommerceSubscriptionModifyChangeItem extends AbstractAdvancedCommerceItem {
+ private static final String SERIALIZED_NAME_CURRENT_SKU = "currentSKU";
+ private static final String SERIALIZED_NAME_EFFECTIVE = "effective";
+ private static final String SERIALIZED_NAME_OFFER = "offer";
+ private static final String SERIALIZED_NAME_PRICE = "price";
+ private static final String SERIALIZED_NAME_PRORATED_PRICE = "proratedPrice";
+ private static final String SERIALIZED_NAME_REASON = "reason";
+
+ @JsonProperty(value = SERIALIZED_NAME_CURRENT_SKU, required = true)
+ private String currentSKU;
+ @JsonProperty(value = SERIALIZED_NAME_EFFECTIVE, required = true)
+ private AdvancedCommerceEffective effective;
+ @JsonProperty(SERIALIZED_NAME_OFFER)
+ private AdvancedCommerceOffer offer;
+ @JsonProperty(value = SERIALIZED_NAME_PRICE, required = true)
+ private Long price;
+ @JsonProperty(SERIALIZED_NAME_PRORATED_PRICE)
+ private Long proratedPrice;
+ @JsonProperty(value = SERIALIZED_NAME_REASON, required = true)
+ private AdvancedCommerceReason reason;
+
+ private AdvancedCommerceSubscriptionModifyChangeItem() {}
+
+ @Override
+ protected AdvancedCommerceSubscriptionModifyChangeItem self() {
+ return this;
+ }
+
+ public AdvancedCommerceSubscriptionModifyChangeItem(String currentSKU, String description, String displayName, AdvancedCommerceEffective effective, Long price, AdvancedCommerceReason reason, String sku) {
+ super(sku, description, displayName);
+ this.currentSKU = AdvancedCommerceValidationUtils.validateSku(currentSKU);
+ this.effective = Objects.requireNonNull(effective);
+ this.price = Objects.requireNonNull(price);
+ this.reason = Objects.requireNonNull(reason);
+ }
+
+ public AdvancedCommerceSubscriptionModifyChangeItem currentSKU(String currentSKU) {
+ this.currentSKU = AdvancedCommerceValidationUtils.validateSku(currentSKU);
+ return this;
+ }
+
+ /**
+ * @return currentSKU
+ * @see SKU
+ */
+ public String getCurrentSKU() {
+ return currentSKU;
+ }
+
+ public void setCurrentSKU(String currentSKU) {
+ this.currentSKU = AdvancedCommerceValidationUtils.validateSku(currentSKU);
+ }
+
+ public AdvancedCommerceSubscriptionModifyChangeItem effective(AdvancedCommerceEffective effective) {
+ this.effective = Objects.requireNonNull(effective);
+ return this;
+ }
+
+ /**
+ * @return effective
+ * @see effective
+ **/
+ public AdvancedCommerceEffective getEffective() {
+ return effective;
+ }
+
+ public void setEffective(AdvancedCommerceEffective effective) {
+ this.effective = Objects.requireNonNull(effective);
+ }
+
+ public AdvancedCommerceSubscriptionModifyChangeItem offer(AdvancedCommerceOffer offer) {
+ this.offer = offer;
+ return this;
+ }
+
+ /**
+ * @return offer
+ * @see Offer
+ **/
+ public AdvancedCommerceOffer getOffer() {
+ return offer;
+ }
+
+ public void setOffer(AdvancedCommerceOffer offer) {
+ this.offer = offer;
+ }
+
+ public AdvancedCommerceSubscriptionModifyChangeItem price(Long price) {
+ this.price = Objects.requireNonNull(price);
+ return this;
+ }
+
+ /**
+ * @return price
+ * @see price
+ **/
+ public Long getPrice() {
+ return price;
+ }
+
+ public void setPrice(Long price) {
+ this.price = Objects.requireNonNull(price);
+ }
+
+ public AdvancedCommerceSubscriptionModifyChangeItem proratedPrice(Long proratedPrice) {
+ this.proratedPrice = proratedPrice;
+ return this;
+ }
+
+ /**
+ * @return proratedPrice
+ * @see proratedPrice
+ **/
+ public Long getProratedPrice() {
+ return proratedPrice;
+ }
+
+ public void setProratedPrice(Long proratedPrice) {
+ this.proratedPrice = proratedPrice;
+ }
+
+ public AdvancedCommerceSubscriptionModifyChangeItem reason(AdvancedCommerceReason reason) {
+ this.reason = Objects.requireNonNull(reason);
+ return this;
+ }
+
+ /**
+ * @return reason
+ */
+ public AdvancedCommerceReason getReason() {
+ return reason;
+ }
+
+ public void setReason(AdvancedCommerceReason reason) {
+ this.reason = Objects.requireNonNull(reason);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ if (!super.equals(o)) return false;
+ AdvancedCommerceSubscriptionModifyChangeItem that = (AdvancedCommerceSubscriptionModifyChangeItem) o;
+ return Objects.equals(currentSKU, that.currentSKU) && Objects.equals(effective, that.effective) && Objects.equals(offer, that.offer) && Objects.equals(price, that.price) && Objects.equals(proratedPrice, that.proratedPrice) && Objects.equals(reason, that.reason);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), currentSKU, effective, offer, price, proratedPrice, reason);
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "{" +
+ "sku='" + sku + '\'' +
+ ", description='" + description + '\'' +
+ ", displayName='" + displayName + '\'' +
+ ", currentSKU='" + currentSKU + '\'' +
+ ", effective=" + effective + '\'' +
+ ", offer=" + offer + '\'' +
+ ", price=" + price + '\'' +
+ ", proratedPrice=" + proratedPrice + '\'' +
+ ", reason=" + reason + '\'' +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyDescriptors.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyDescriptors.java
new file mode 100644
index 00000000..1d72240d
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyDescriptors.java
@@ -0,0 +1,104 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.Objects;
+
+/**
+ * The data your app provides to change the description and display name of an auto-renewable subscription.
+ *
+ * @see SubscriptionModifyDescriptors
+ */
+public class AdvancedCommerceSubscriptionModifyDescriptors {
+ private static final String SERIALIZED_NAME_EFFECTIVE = "effective";
+ private static final String SERIALIZED_NAME_DESCRIPTION = "description";
+ private static final String SERIALIZED_NAME_DISPLAY_NAME = "displayName";
+
+ @JsonProperty(value = SERIALIZED_NAME_EFFECTIVE, required = true)
+ private AdvancedCommerceEffective effective;
+ @JsonProperty(SERIALIZED_NAME_DESCRIPTION)
+ private String description;
+ @JsonProperty(SERIALIZED_NAME_DISPLAY_NAME)
+ private String displayName;
+
+ private AdvancedCommerceSubscriptionModifyDescriptors() {}
+
+ public AdvancedCommerceSubscriptionModifyDescriptors(AdvancedCommerceEffective effective) {
+ this.effective = Objects.requireNonNull(effective);
+ }
+
+ public AdvancedCommerceSubscriptionModifyDescriptors effective(AdvancedCommerceEffective effective) {
+ this.effective = Objects.requireNonNull(effective);
+ return this;
+ }
+
+ /**
+ * @return effective
+ * @see effective
+ **/
+ public AdvancedCommerceEffective getEffective() {
+ return effective;
+ }
+
+ public void setEffective(AdvancedCommerceEffective effective) {
+ this.effective = Objects.requireNonNull(effective);
+ }
+
+ public AdvancedCommerceSubscriptionModifyDescriptors description(String description) {
+ this.description = description == null ? null : AdvancedCommerceValidationUtils.validateDescription(description);
+ return this;
+ }
+
+ /**
+ * @return description
+ * @see description
+ **/
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description == null ? null : AdvancedCommerceValidationUtils.validateDescription(description);
+ }
+
+ public AdvancedCommerceSubscriptionModifyDescriptors displayName(String displayName) {
+ this.displayName = displayName == null ? null : AdvancedCommerceValidationUtils.validateDisplayName(displayName);
+ return this;
+ }
+
+ /**
+ * @return displayName
+ * @see displayName
+ **/
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ public void setDisplayName(String displayName) {
+ this.displayName = displayName == null ? null : AdvancedCommerceValidationUtils.validateDisplayName(displayName);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ AdvancedCommerceSubscriptionModifyDescriptors that = (AdvancedCommerceSubscriptionModifyDescriptors) o;
+ return Objects.equals(effective, that.effective) && Objects.equals(description, that.description) && Objects.equals(displayName, that.displayName);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), effective, description, displayName);
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "{" +
+ "effective=" + effective + '\'' +
+ ", description='" + description + '\'' +
+ ", displayName='" + displayName + '\'' +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyInAppRequest.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyInAppRequest.java
new file mode 100644
index 00000000..c62b096d
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyInAppRequest.java
@@ -0,0 +1,296 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * The request data your app provides to make changes to an auto-renewable subscription.
+ *
+ * @see SubscriptionModifyInAppRequest
+ */
+public class AdvancedCommerceSubscriptionModifyInAppRequest extends AbstractAdvancedCommerceInAppRequest {
+ private static final String OPERATION = "MODIFY_SUBSCRIPTION";
+ private static final String VERSION = "1";
+
+ private static final String SERIALIZED_NAME_ADD_ITEMS = "addItems";
+ private static final String SERIALIZED_NAME_CHANGE_ITEMS = "changeItems";
+ private static final String SERIALIZED_NAME_CURRENCY = "currency";
+ private static final String SERIALIZED_NAME_DESCRIPTORS = "descriptors";
+ private static final String SERIALIZED_NAME_PERIOD_CHANGE = "periodChange";
+ private static final String SERIALIZED_NAME_REMOVE_ITEMS = "removeItems";
+ private static final String SERIALIZED_NAME_RETAIN_BILLING_CYCLE = "retainBillingCycle";
+ private static final String SERIALIZED_NAME_STOREFRONT = "storefront";
+ private static final String SERIALIZED_NAME_TAX_CODE = "taxCode";
+ private static final String SERIALIZED_NAME_TRANSACTION_ID = "transactionId";
+
+ @JsonProperty(SERIALIZED_NAME_ADD_ITEMS)
+ private List addItems;
+ @JsonProperty(SERIALIZED_NAME_CHANGE_ITEMS)
+ private List changeItems;
+ @JsonProperty(SERIALIZED_NAME_CURRENCY)
+ private String currency;
+ @JsonProperty(SERIALIZED_NAME_DESCRIPTORS)
+ private AdvancedCommerceSubscriptionModifyDescriptors descriptors;
+ @JsonProperty(SERIALIZED_NAME_PERIOD_CHANGE)
+ private AdvancedCommerceSubscriptionModifyPeriodChange periodChange;
+ @JsonProperty(SERIALIZED_NAME_REMOVE_ITEMS)
+ private List removeItems;
+ @JsonProperty(value = SERIALIZED_NAME_RETAIN_BILLING_CYCLE, required = true)
+ private Boolean retainBillingCycle;
+ @JsonProperty(SERIALIZED_NAME_STOREFRONT)
+ private String storefront;
+ @JsonProperty(SERIALIZED_NAME_TAX_CODE)
+ private String taxCode;
+ @JsonProperty(value = SERIALIZED_NAME_TRANSACTION_ID, required = true)
+ private String transactionId;
+
+ private AdvancedCommerceSubscriptionModifyInAppRequest() {}
+
+ public AdvancedCommerceSubscriptionModifyInAppRequest(
+ AdvancedCommerceRequestInfo requestInfo,
+ String transactionId,
+ Boolean retainBillingCycle
+ ) {
+ super(OPERATION, VERSION, requestInfo);
+ this.transactionId = Objects.requireNonNull(transactionId);
+ this.retainBillingCycle = Objects.requireNonNull(retainBillingCycle);
+ }
+
+ @Override
+ protected AdvancedCommerceSubscriptionModifyInAppRequest self() {
+ return this;
+ }
+
+ public AdvancedCommerceSubscriptionModifyInAppRequest addItems(List addItems) {
+ this.addItems = addItems != null ? AdvancedCommerceValidationUtils.validateItems(addItems) : null;
+ return this;
+ }
+
+ public AdvancedCommerceSubscriptionModifyInAppRequest addAddItem(AdvancedCommerceSubscriptionModifyAddItem addItem) {
+ Objects.requireNonNull(addItem);
+ if (this.addItems == null) {
+ this.addItems = new ArrayList<>();
+ }
+ this.addItems.add(addItem);
+ return this;
+ }
+
+ /**
+ * @return addItems
+ * @see SubscriptionModifyAddItem
+ **/
+ public List getAddItems() {
+ return addItems;
+ }
+
+ public void setAddItems(List addItems) {
+ this.addItems = addItems != null ? AdvancedCommerceValidationUtils.validateItems(addItems) : null;
+ }
+
+ public AdvancedCommerceSubscriptionModifyInAppRequest changeItems(List changeItems) {
+ this.changeItems = changeItems != null ? AdvancedCommerceValidationUtils.validateItems(changeItems) : null;
+ return this;
+ }
+
+ public AdvancedCommerceSubscriptionModifyInAppRequest addChangeItem(AdvancedCommerceSubscriptionModifyChangeItem changeItem) {
+ Objects.requireNonNull(changeItem);
+ if (this.changeItems == null) {
+ this.changeItems = new ArrayList<>();
+ }
+ this.changeItems.add(changeItem);
+ return this;
+ }
+
+ /**
+ * @return changeItems
+ * @see SubscriptionModifyChangeItem
+ **/
+ public List getChangeItems() {
+ return changeItems;
+ }
+
+ public void setChangeItems(List changeItems) {
+ this.changeItems = changeItems != null ? AdvancedCommerceValidationUtils.validateItems(changeItems) : null;
+ }
+
+ public AdvancedCommerceSubscriptionModifyInAppRequest currency(String currency) {
+ this.currency = currency;
+ return this;
+ }
+
+ /**
+ * @return currency
+ * @see currency
+ **/
+ public String getCurrency() {
+ return currency;
+ }
+
+ public void setCurrency(String currency) {
+ this.currency = currency;
+ }
+
+ public AdvancedCommerceSubscriptionModifyInAppRequest descriptors(AdvancedCommerceSubscriptionModifyDescriptors descriptors) {
+ this.descriptors = descriptors;
+ return this;
+ }
+
+ /**
+ * @return descriptors
+ * @see SubscriptionModifyDescriptors
+ **/
+ public AdvancedCommerceSubscriptionModifyDescriptors getDescriptors() {
+ return descriptors;
+ }
+
+ public void setDescriptors(AdvancedCommerceSubscriptionModifyDescriptors descriptors) {
+ this.descriptors = descriptors;
+ }
+
+ public AdvancedCommerceSubscriptionModifyInAppRequest periodChange(AdvancedCommerceSubscriptionModifyPeriodChange periodChange) {
+ this.periodChange = periodChange;
+ return this;
+ }
+
+ /**
+ * @return periodChange
+ * @see SubscriptionModifyPeriodChange
+ **/
+ public AdvancedCommerceSubscriptionModifyPeriodChange getPeriodChange() {
+ return periodChange;
+ }
+
+ public void setPeriodChange(AdvancedCommerceSubscriptionModifyPeriodChange periodChange) {
+ this.periodChange = periodChange;
+ }
+
+ public AdvancedCommerceSubscriptionModifyInAppRequest removeItems(List removeItems) {
+ this.removeItems = removeItems;
+ return this;
+ }
+
+ public AdvancedCommerceSubscriptionModifyInAppRequest addRemoveItem(AdvancedCommerceSubscriptionModifyRemoveItem removeItem) {
+ Objects.requireNonNull(removeItem);
+ if (this.removeItems == null) {
+ this.removeItems = new ArrayList<>();
+ }
+ this.removeItems.add(removeItem);
+ return this;
+ }
+
+ /**
+ * @return removeItems
+ * @see SubscriptionModifyRemoveItem
+ **/
+ public List getRemoveItems() {
+ return removeItems;
+ }
+
+ public void setRemoveItems(List removeItems) {
+ this.removeItems = removeItems;
+ }
+
+ public AdvancedCommerceSubscriptionModifyInAppRequest retainBillingCycle(Boolean retainBillingCycle) {
+ this.retainBillingCycle = Objects.requireNonNull(retainBillingCycle);
+ return this;
+ }
+
+ /**
+ * @return retainBillingCycle
+ * @see retainBillingCycle
+ **/
+ public Boolean getRetainBillingCycle() {
+ return retainBillingCycle;
+ }
+
+ public void setRetainBillingCycle(Boolean retainBillingCycle) {
+ this.retainBillingCycle = Objects.requireNonNull(retainBillingCycle);
+ }
+
+ public AdvancedCommerceSubscriptionModifyInAppRequest storefront(String storefront) {
+ this.storefront = storefront;
+ return this;
+ }
+
+ /**
+ * @return storefront
+ * @see storefront
+ **/
+ public String getStorefront() {
+ return storefront;
+ }
+
+ public void setStorefront(String storefront) {
+ this.storefront = storefront;
+ }
+
+ public AdvancedCommerceSubscriptionModifyInAppRequest taxCode(String taxCode) {
+ this.taxCode = taxCode;
+ return this;
+ }
+
+ /**
+ * @return taxCode
+ * @see taxCode
+ **/
+ public String getTaxCode() {
+ return taxCode;
+ }
+
+ public void setTaxCode(String taxCode) {
+ this.taxCode = taxCode;
+ }
+
+ public AdvancedCommerceSubscriptionModifyInAppRequest transactionId(String transactionId) {
+ this.transactionId = Objects.requireNonNull(transactionId);
+ return this;
+ }
+
+ /**
+ * @return transactionId
+ * @see transactionId
+ **/
+ public String getTransactionId() {
+ return transactionId;
+ }
+
+ public void setTransactionId(String transactionId) {
+ this.transactionId = Objects.requireNonNull(transactionId);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ if (!super.equals(o)) return false;
+ AdvancedCommerceSubscriptionModifyInAppRequest that = (AdvancedCommerceSubscriptionModifyInAppRequest) o;
+ return Objects.equals(addItems, that.addItems) && Objects.equals(changeItems, that.changeItems) && Objects.equals(currency, that.currency) && Objects.equals(descriptors, that.descriptors) && Objects.equals(periodChange, that.periodChange) && Objects.equals(removeItems, that.removeItems) && Objects.equals(retainBillingCycle, that.retainBillingCycle) && Objects.equals(storefront, that.storefront) && Objects.equals(taxCode, that.taxCode) && Objects.equals(transactionId, that.transactionId);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), addItems, changeItems, currency, descriptors, periodChange, removeItems, retainBillingCycle, storefront, taxCode, transactionId);
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "{" +
+ "addItems=" + addItems +
+ ", changeItems=" + changeItems +
+ ", currency='" + currency + '\'' +
+ ", descriptors=" + descriptors +
+ ", periodChange=" + periodChange +
+ ", removeItems=" + removeItems +
+ ", retainBillingCycle=" + retainBillingCycle +
+ ", requestInfo=" + getRequestInfo() +
+ ", storefront='" + storefront + '\'' +
+ ", taxCode='" + taxCode + '\'' +
+ ", transactionId='" + transactionId + '\'' +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyPeriodChange.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyPeriodChange.java
new file mode 100644
index 00000000..4da15144
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyPeriodChange.java
@@ -0,0 +1,92 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.Objects;
+
+/**
+ * The data your app provides to change the period of an auto-renewable subscription.
+ *
+ * @see SubscriptionModifyPeriodChange
+ */
+public class AdvancedCommerceSubscriptionModifyPeriodChange {
+ private static final String SERIALIZED_NAME_EFFECTIVE = "effective";
+ private static final String SERIALIZED_NAME_PERIOD = "period";
+
+ @JsonProperty(value = SERIALIZED_NAME_EFFECTIVE, required = true)
+ private AdvancedCommerceEffective effective;
+ @JsonProperty(value = SERIALIZED_NAME_PERIOD, required = true)
+ private AdvancedCommercePeriod period;
+
+ private AdvancedCommerceSubscriptionModifyPeriodChange() {}
+
+ public AdvancedCommerceSubscriptionModifyPeriodChange(
+ AdvancedCommerceEffective effective,
+ AdvancedCommercePeriod period
+ ) {
+ this.effective = Objects.requireNonNull(effective);
+ this.period = Objects.requireNonNull(period);
+ }
+
+ public AdvancedCommerceSubscriptionModifyPeriodChange(String rawEffective, String rawPeriod) {
+ this.effective = AdvancedCommerceEffective.fromValue(rawEffective);
+ this.period = AdvancedCommercePeriod.fromValue(rawPeriod);
+ }
+
+ public AdvancedCommerceSubscriptionModifyPeriodChange effective(AdvancedCommerceEffective effective) {
+ this.effective = Objects.requireNonNull(effective);
+ return this;
+ }
+
+ /**
+ * @return effective
+ * @see effective
+ **/
+ public AdvancedCommerceEffective getEffective() {
+ return effective;
+ }
+
+ public void setEffective(AdvancedCommerceEffective effective) {
+ this.effective = Objects.requireNonNull(effective);
+ }
+
+ public AdvancedCommerceSubscriptionModifyPeriodChange period(AdvancedCommercePeriod period) {
+ this.period = Objects.requireNonNull(period);
+ return this;
+ }
+
+ /**
+ * @return period
+ * @see Period
+ **/
+ public AdvancedCommercePeriod getPeriod() {
+ return period;
+ }
+
+ public void setPeriod(AdvancedCommercePeriod period) {
+ this.period = Objects.requireNonNull(period);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ AdvancedCommerceSubscriptionModifyPeriodChange that = (AdvancedCommerceSubscriptionModifyPeriodChange) o;
+ return Objects.equals(effective, that.effective) && Objects.equals(period, that.period);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(effective, period);
+ }
+
+ @Override
+ public String toString() {
+ return "AdvancedCommerceSubscriptionModifyPeriodChange{" +
+ "effective=" + effective +
+ ", period=" + period +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyRemoveItem.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyRemoveItem.java
new file mode 100644
index 00000000..c2b99031
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyRemoveItem.java
@@ -0,0 +1,30 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+/**
+ * The data your app provides to remove an item from an auto-renewable subscription.
+ *
+ * @see SubscriptionModifyRemoveItem
+ */
+public class AdvancedCommerceSubscriptionModifyRemoveItem extends AbstractAdvancedCommerceBaseItem {
+ private AdvancedCommerceSubscriptionModifyRemoveItem() {
+ super();
+ }
+
+ public AdvancedCommerceSubscriptionModifyRemoveItem(String sku) {
+ super(sku);
+ }
+
+ @Override
+ protected AbstractAdvancedCommerceBaseItem self() {
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "{" +
+ "sku='" + sku + '\'' +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionPriceChangeItem.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionPriceChangeItem.java
new file mode 100644
index 00000000..9fd44834
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionPriceChangeItem.java
@@ -0,0 +1,115 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * The data your app provides to change a subscription price.
+ *
+ * @see SubscriptionPriceChangeItem
+ */
+public class AdvancedCommerceSubscriptionPriceChangeItem extends AbstractAdvancedCommerceBaseItem{
+ private static final String SERIALIZED_NAME_PRICE = "price";
+ private static final String SERIALIZED_DEPENDENT_SKUS = "dependentSKUs";
+
+ @JsonProperty(value = SERIALIZED_NAME_PRICE, required = true)
+ private Long price;
+ @JsonProperty(SERIALIZED_DEPENDENT_SKUS)
+ private List dependentSKUs;
+
+ private AdvancedCommerceSubscriptionPriceChangeItem() {
+ super();
+ }
+
+ public AdvancedCommerceSubscriptionPriceChangeItem(String sku, Long price) {
+ super(sku);
+ this.price = Objects.requireNonNull(price);
+ }
+
+ @Override
+ protected AdvancedCommerceSubscriptionPriceChangeItem self() {
+ return this;
+ }
+
+ public AdvancedCommerceSubscriptionPriceChangeItem price(Long price) {
+ this.price = Objects.requireNonNull(price);
+ return this;
+ }
+
+ /**
+ * @return price
+ * @see price
+ **/
+ public Long getPrice() {
+ return price;
+ }
+
+ public void setPrice(Long price) {
+ this.price = Objects.requireNonNull(price);
+ }
+
+ public AdvancedCommerceSubscriptionPriceChangeItem dependentSKUs(List dependentSKUs) {
+ validateDependentSKUs(dependentSKUs);
+ this.dependentSKUs = dependentSKUs;
+ return this;
+ }
+
+ public AdvancedCommerceSubscriptionPriceChangeItem addDependentSKU(String dependentSKU) {
+ Objects.requireNonNull(dependentSKU);
+ AdvancedCommerceValidationUtils.validateSku(dependentSKU);
+ if (this.dependentSKUs == null) {
+ this.dependentSKUs = new ArrayList<>();
+ }
+ this.dependentSKUs.add(dependentSKU);
+ return this;
+ }
+
+ /**
+ * @return dependentSKUs
+ * @see dependentSKU
+ **/
+ public List getDependentSKUs() {
+ return dependentSKUs;
+ }
+
+ public void setDependentSKUs(List dependentSKUs) {
+ validateDependentSKUs(dependentSKUs);
+ this.dependentSKUs = dependentSKUs;
+ }
+
+ private void validateDependentSKUs(List dependentSKUs) {
+ if (dependentSKUs != null) {
+ for (String sku : dependentSKUs) {
+ AdvancedCommerceValidationUtils.validateSku(sku);
+ }
+ }
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ if (!super.equals(o)) return false;
+ AdvancedCommerceSubscriptionPriceChangeItem that = (AdvancedCommerceSubscriptionPriceChangeItem) o;
+ return Objects.equals(price, that.price) && Objects.equals(dependentSKUs, that.dependentSKUs);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), price, dependentSKUs);
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "{" +
+ "sku='" + sku + '\'' +
+ ", price=" + price +
+ ", dependentSKUs=" + dependentSKUs +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionPriceChangeRequest.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionPriceChangeRequest.java
new file mode 100644
index 00000000..118b5f8c
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionPriceChangeRequest.java
@@ -0,0 +1,129 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * The request body you use to change the price of an auto-renewable subscription.
+ *
+ * @see SubscriptionPriceChangeRequest
+ */
+public class AdvancedCommerceSubscriptionPriceChangeRequest extends AdvancedCommerceRequest {
+ private static final String SERIALIZED_NAME_CURRENCY = "currency";
+ private static final String SERIALIZED_NAME_ITEMS = "items";
+ private static final String SERIALIZED_NAME_STOREFRONT = "storefront";
+
+ @JsonProperty(SERIALIZED_NAME_CURRENCY)
+ private String currency;
+ @JsonProperty(value = SERIALIZED_NAME_ITEMS, required = true)
+ private List items;
+ @JsonProperty(SERIALIZED_NAME_STOREFRONT)
+ private String storefront;
+ public AdvancedCommerceSubscriptionPriceChangeRequest() {}
+
+ public AdvancedCommerceSubscriptionPriceChangeRequest(
+ AdvancedCommerceRequestInfo requestInfo,
+ List items
+ ) {
+ super(requestInfo);
+ this.items = Objects.requireNonNull(items);
+ }
+
+ @Override
+ protected AdvancedCommerceSubscriptionPriceChangeRequest self() {
+ return this;
+ }
+
+ public AdvancedCommerceSubscriptionPriceChangeRequest currency(String currency) {
+ this.currency = currency;
+ return this;
+ }
+
+ /**
+ * The currency of the prices.
+ *
+ * @return currency
+ * @see currency
+ **/
+ public String getCurrency() {
+ return currency;
+ }
+
+ public void setCurrency(String currency) {
+ this.currency = currency;
+ }
+
+ public AdvancedCommerceSubscriptionPriceChangeRequest items(List items) {
+ this.items = Objects.requireNonNull(items);
+ return this;
+ }
+
+ public AdvancedCommerceSubscriptionPriceChangeRequest addItem(AdvancedCommerceSubscriptionPriceChangeItem item) {
+ Objects.requireNonNull(item);
+ this.items.add(item);
+ return this;
+ }
+
+ /**
+ * An array that contains one or more SKUs and the changed price for each SKU.
+ *
+ * @return items
+ * @see SubscriptionPriceChangeItem
+ **/
+ public List getItems() {
+ return items;
+ }
+
+ public void setItems(List items) {
+ this.items = Objects.requireNonNull(items);
+ }
+
+ public AdvancedCommerceSubscriptionPriceChangeRequest storefront(String storefront) {
+ this.storefront = storefront;
+ return this;
+ }
+
+ /**
+ * The App Store storefront of the subscription.
+ *
+ * @return storefront
+ * @see storefront
+ **/
+ public String getStorefront() {
+ return storefront;
+ }
+
+ public void setStorefront(String storefront) {
+ this.storefront = storefront;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ if (!super.equals(o)) return false;
+ AdvancedCommerceSubscriptionPriceChangeRequest that = (AdvancedCommerceSubscriptionPriceChangeRequest) o;
+ return Objects.equals(currency, that.currency) &&
+ Objects.equals(items, that.items) &&
+ Objects.equals(storefront, that.storefront);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), currency, items, storefront);
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "{" +
+ "currency='" + currency + '\'' +
+ ", items=" + items +
+ ", requestInfo=" + getRequestInfo() +
+ ", storefront='" + storefront + '\'' +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionPriceChangeResponse.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionPriceChangeResponse.java
new file mode 100644
index 00000000..98b36efc
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionPriceChangeResponse.java
@@ -0,0 +1,57 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import java.util.Objects;
+
+/**
+ * A response that contains signed JWS renewal and JWS transaction information after a subscription price change request.
+ *
+ * @see SubscriptionPriceChangeResponse
+ */
+public class AdvancedCommerceSubscriptionPriceChangeResponse extends AbstractAdvancedCommerceResponse {
+ private AdvancedCommerceSubscriptionPriceChangeResponse() {
+ super();
+ }
+
+ public AdvancedCommerceSubscriptionPriceChangeResponse(String signedRenewalInfo, String signedTransactionInfo) {
+ super(Objects.requireNonNull(signedRenewalInfo), Objects.requireNonNull(signedTransactionInfo));
+ }
+
+ @Override
+ protected AdvancedCommerceSubscriptionPriceChangeResponse self() {
+ return this;
+ }
+
+ @Override
+ public AdvancedCommerceSubscriptionPriceChangeResponse signedRenewalInfo(String signedRenewalInfo) {
+ Objects.requireNonNull(signedRenewalInfo);
+ return (AdvancedCommerceSubscriptionPriceChangeResponse) super.signedRenewalInfo(signedRenewalInfo);
+ }
+
+ @Override
+ public AdvancedCommerceSubscriptionPriceChangeResponse signedTransactionInfo(String signedTransactionInfo) {
+ Objects.requireNonNull(signedTransactionInfo);
+ return (AdvancedCommerceSubscriptionPriceChangeResponse) super.signedTransactionInfo(signedTransactionInfo);
+ }
+
+ @Override
+ public void setSignedRenewalInfo(String signedRenewalInfo) {
+ Objects.requireNonNull(signedRenewalInfo);
+ super.setSignedRenewalInfo(signedRenewalInfo);
+ }
+
+ @Override
+ public void setSignedTransactionInfo(String signedTransactionInfo) {
+ Objects.requireNonNull(signedTransactionInfo);
+ super.setSignedTransactionInfo(signedTransactionInfo);
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "{" +
+ "signedRenewalInfo='" + getSignedRenewalInfo() +
+ ", signedTransactionInfo='" + getSignedTransactionInfo() +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionReactivateInAppRequest.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionReactivateInAppRequest.java
new file mode 100644
index 00000000..878d45d0
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionReactivateInAppRequest.java
@@ -0,0 +1,129 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * The request your app provides to reactivate a subscription that has automatic renewal turned off.
+ *
+ * @see SubscriptionReactivateInAppRequest
+ */
+public class AdvancedCommerceSubscriptionReactivateInAppRequest extends AbstractAdvancedCommerceInAppRequest {
+ private static final String OPERATION = "REACTIVATE_SUBSCRIPTION";
+ private static final String VERSION = "1";
+
+ private static final String SERIALIZED_NAME_ITEMS = "items";
+ private static final String SERIALIZED_NAME_STOREFRONT = "storefront";
+ private static final String SERIALIZED_NAME_TRANSACTION_ID = "transactionId";
+
+ @JsonProperty(SERIALIZED_NAME_ITEMS)
+ private List items;
+ @JsonProperty(SERIALIZED_NAME_STOREFRONT)
+ private String storefront;
+ @JsonProperty(value = SERIALIZED_NAME_TRANSACTION_ID, required = true)
+ private String transactionId;
+
+ private AdvancedCommerceSubscriptionReactivateInAppRequest() {}
+
+ public AdvancedCommerceSubscriptionReactivateInAppRequest(
+ AdvancedCommerceRequestInfo requestInfo,
+ String transactionId
+ ) {
+ super(OPERATION, VERSION, requestInfo);
+ this.transactionId = Objects.requireNonNull(transactionId);
+ }
+
+ @Override
+ protected AdvancedCommerceSubscriptionReactivateInAppRequest self() {
+ return this;
+ }
+
+ public AdvancedCommerceSubscriptionReactivateInAppRequest items(List items) {
+ this.items = items;
+ return this;
+ }
+
+ public AdvancedCommerceSubscriptionReactivateInAppRequest addItem(AdvancedCommerceSubscriptionReactivateItem item) {
+ Objects.requireNonNull(item);
+ if (this.items == null) {
+ this.items = new ArrayList<>();
+ }
+ this.items.add(item);
+ return this;
+ }
+
+ /**
+ * @return items
+ * @see SubscriptionReactivateItem
+ **/
+ public List getItems() {
+ return items;
+ }
+
+ public void setItems(List items) {
+ this.items = items;
+ }
+
+ public AdvancedCommerceSubscriptionReactivateInAppRequest storefront(String storefront) {
+ this.storefront = storefront;
+ return this;
+ }
+
+ /**
+ * @return storefront
+ * @see storefront
+ **/
+ public String getStorefront() {
+ return storefront;
+ }
+
+ public void setStorefront(String storefront) {
+ this.storefront = storefront;
+ }
+
+ public AdvancedCommerceSubscriptionReactivateInAppRequest transactionId(String transactionId) {
+ this.transactionId = Objects.requireNonNull(transactionId);
+ return this;
+ }
+
+ /**
+ * @return transactionId
+ * @see transactionId
+ **/
+ public String getTransactionId() {
+ return transactionId;
+ }
+
+ public void setTransactionId(String transactionId) {
+ this.transactionId = Objects.requireNonNull(transactionId);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ if (!super.equals(o)) return false;
+ AdvancedCommerceSubscriptionReactivateInAppRequest that = (AdvancedCommerceSubscriptionReactivateInAppRequest) o;
+ return Objects.equals(items, that.items) && Objects.equals(storefront, that.storefront) && Objects.equals(transactionId, that.transactionId);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), items, storefront, transactionId);
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "{" +
+ "items=" + items +
+ ", requestInfo=" + getRequestInfo() +
+ ", storefront='" + storefront + '\'' +
+ ", transactionId='" + transactionId + '\'' +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionReactivateItem.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionReactivateItem.java
new file mode 100644
index 00000000..117d4e7d
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionReactivateItem.java
@@ -0,0 +1,31 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+/**
+ * An item in a subscription to reactive.
+ *
+ * @see SubscriptionReactivateItem
+ */
+public class AdvancedCommerceSubscriptionReactivateItem extends AbstractAdvancedCommerceBaseItem {
+
+ private AdvancedCommerceSubscriptionReactivateItem() {
+ super();
+ }
+
+ public AdvancedCommerceSubscriptionReactivateItem(String sku) {
+ super(sku);
+ }
+
+ @Override
+ protected AbstractAdvancedCommerceBaseItem self() {
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "{" +
+ "sku='" + sku + '\'' +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionRevokeRequest.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionRevokeRequest.java
new file mode 100644
index 00000000..8fd80bc9
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionRevokeRequest.java
@@ -0,0 +1,144 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.Objects;
+
+/**
+ * The request body you provide to terminate a subscription and all its items immediately.
+ *
+ * @see SubscriptionRevokeRequest
+ */
+public class AdvancedCommerceSubscriptionRevokeRequest extends AdvancedCommerceRequest {
+ private static final String SERIALIZED_NAME_REFUND_REASON = "refundReason";
+ private static final String SERIALIZED_NAME_REFUND_RISKING_PREFERENCE = "refundRiskingPreference";
+ private static final String SERIALIZED_NAME_REFUND_TYPE = "refundType";
+ private static final String SERIALIZED_NAME_STOREFRONT = "storefront";
+
+ @JsonProperty(value = SERIALIZED_NAME_REFUND_REASON, required = true)
+ private AdvancedCommerceRefundReason refundReason;
+ @JsonProperty(value = SERIALIZED_NAME_REFUND_RISKING_PREFERENCE, required = true)
+ private Boolean refundRiskingPreference;
+ @JsonProperty(value = SERIALIZED_NAME_REFUND_TYPE, required = true)
+ private String refundType;
+ @JsonProperty(SERIALIZED_NAME_STOREFRONT)
+ private String storefront;
+
+ private AdvancedCommerceSubscriptionRevokeRequest() {
+ super();
+ }
+
+ public AdvancedCommerceSubscriptionRevokeRequest(
+ AdvancedCommerceRequestInfo requestInfo,
+ Boolean refundRiskingPreference,
+ AdvancedCommerceRefundReason refundReason,
+ String refundType
+ ) {
+ super(requestInfo);
+ this.refundReason = Objects.requireNonNull(refundReason);
+ this.refundRiskingPreference = Objects.requireNonNull(refundRiskingPreference);
+ this.refundType = Objects.requireNonNull(refundType);
+ }
+
+ @Override
+ protected AdvancedCommerceSubscriptionRevokeRequest self() {
+ return this;
+ }
+
+ public AdvancedCommerceSubscriptionRevokeRequest refundReason(AdvancedCommerceRefundReason refundReason) {
+ this.refundReason = Objects.requireNonNull(refundReason);
+ return this;
+ }
+
+ /**
+ * @return refundReason
+ * @see refundReason
+ **/
+ public AdvancedCommerceRefundReason getRefundReason() {
+ return refundReason;
+ }
+
+ public void setRefundReason(AdvancedCommerceRefundReason refundReason) {
+ this.refundReason = Objects.requireNonNull(refundReason);
+ }
+
+ public AdvancedCommerceSubscriptionRevokeRequest refundRiskingPreference(Boolean refundRiskingPreference) {
+ this.refundRiskingPreference = Objects.requireNonNull(refundRiskingPreference);
+ return this;
+ }
+
+ /**
+ * @return refundRiskingPreference
+ * @see refundRiskingPreference
+ **/
+ public Boolean getRefundRiskingPreference() {
+ return refundRiskingPreference;
+ }
+
+ public void setRefundRiskingPreference(Boolean refundRiskingPreference) {
+ this.refundRiskingPreference = Objects.requireNonNull(refundRiskingPreference);
+ }
+
+ public AdvancedCommerceSubscriptionRevokeRequest refundType(String refundType) {
+ this.refundType = Objects.requireNonNull(refundType);
+ return this;
+ }
+
+ public String getRefundType() {
+ return refundType;
+ }
+
+ public void setRefundType(String refundType) {
+ this.refundType = Objects.requireNonNull(refundType);
+ }
+
+ public AdvancedCommerceSubscriptionRevokeRequest storefront(String storefront) {
+ this.storefront = storefront;
+ return this;
+ }
+
+ /**
+ * @return storefront
+ * @see storefront
+ **/
+ public String getStorefront() {
+ return storefront;
+ }
+
+ public void setStorefront(String storefront) {
+ this.storefront = storefront;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o)
+ return true;
+ if (o == null || getClass() != o.getClass())
+ return false;
+ if (!super.equals(o))
+ return false;
+ AdvancedCommerceSubscriptionRevokeRequest that = (AdvancedCommerceSubscriptionRevokeRequest) o;
+ return Objects.equals(refundReason, that.refundReason)
+ && Objects.equals(refundRiskingPreference, that.refundRiskingPreference)
+ && Objects.equals(refundType, that.refundType)
+ && Objects.equals(storefront, that.storefront);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), refundReason, refundRiskingPreference, refundType, storefront);
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "{" +
+ "refundReason=" + refundReason +
+ ", refundRiskingPreference=" + refundRiskingPreference +
+ ", refundType='" + refundType + '\'' +
+ ", requestInfo=" + getRequestInfo() +
+ ", storefront='" + storefront + '\'' +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionRevokeResponse.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionRevokeResponse.java
new file mode 100644
index 00000000..b2972ef7
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionRevokeResponse.java
@@ -0,0 +1,57 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import java.util.Objects;
+
+/**
+ * The response body for a successful revoke-subscription request.
+ *
+ * @see SubscriptionRevokeResponse
+ */
+public class AdvancedCommerceSubscriptionRevokeResponse extends AbstractAdvancedCommerceResponse {
+ private AdvancedCommerceSubscriptionRevokeResponse() {
+ super();
+ }
+
+ public AdvancedCommerceSubscriptionRevokeResponse(String signedRenewalInfo, String signedTransactionInfo) {
+ super(Objects.requireNonNull(signedRenewalInfo), Objects.requireNonNull(signedTransactionInfo));
+ }
+
+ @Override
+ protected AdvancedCommerceSubscriptionRevokeResponse self() {
+ return this;
+ }
+
+ @Override
+ public AdvancedCommerceSubscriptionRevokeResponse signedRenewalInfo(String signedRenewalInfo) {
+ Objects.requireNonNull(signedRenewalInfo);
+ return (AdvancedCommerceSubscriptionRevokeResponse) super.signedRenewalInfo(signedRenewalInfo);
+ }
+
+ @Override
+ public AdvancedCommerceSubscriptionRevokeResponse signedTransactionInfo(String signedTransactionInfo) {
+ Objects.requireNonNull(signedTransactionInfo);
+ return (AdvancedCommerceSubscriptionRevokeResponse) super.signedTransactionInfo(signedTransactionInfo);
+ }
+
+ @Override
+ public void setSignedRenewalInfo(String signedRenewalInfo) {
+ Objects.requireNonNull(signedRenewalInfo);
+ super.setSignedRenewalInfo(signedRenewalInfo);
+ }
+
+ @Override
+ public void setSignedTransactionInfo(String signedTransactionInfo) {
+ Objects.requireNonNull(signedTransactionInfo);
+ super.setSignedTransactionInfo(signedTransactionInfo);
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "{" +
+ "signedRenewalInfo='" + getSignedRenewalInfo() + '\'' +
+ ", signedTransactionInfo='" + getSignedTransactionInfo() + '\'' +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceValidationUtils.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceValidationUtils.java
new file mode 100644
index 00000000..851ec78c
--- /dev/null
+++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceValidationUtils.java
@@ -0,0 +1,99 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import java.util.List;
+import java.util.Objects;
+
+public final class AdvancedCommerceValidationUtils {
+
+ public static final int MAXIMUM_DESCRIPTION_LENGTH = 45;
+ public static final int MAXIMUM_DISPLAY_NAME_LENGTH = 30;
+ private static final int MAXIMUM_SKU_LENGTH = 128;
+ private static final int MIN_PERIOD = 1;
+ private static final int MAX_PERIOD = 12;
+
+ /**
+ * Validates description is not null and does not exceed maximum length.
+ *
+ * @param description the description to validate
+ * @return the validated description
+ * @throws IllegalArgumentException if description exceeds maximum length
+ */
+ public static String validateDescription(String description) {
+ return validateStringWithMaxLength(description, MAXIMUM_DESCRIPTION_LENGTH, "description");
+ }
+
+ /**
+ * Validates display name is not null and does not exceed maximum length.
+ *
+ * @param displayName the display name to validate
+ * @return the validated display name
+ * @throws IllegalArgumentException if display name exceeds maximum length
+ */
+ public static String validateDisplayName(String displayName) {
+ return validateStringWithMaxLength(displayName, MAXIMUM_DISPLAY_NAME_LENGTH, "displayName");
+ }
+
+ /**
+ * Validates SKU does not exceed maximum length.
+ *
+ * @param sku
+ * @return the validated SKU
+ * @throws IllegalArgumentException if SKU exceeds maximum length
+ */
+ public static String validateSku(String sku) {
+ if (sku != null && sku.length() > MAXIMUM_SKU_LENGTH) {
+ throw new IllegalArgumentException("SKU length cannot exceed " + MAXIMUM_SKU_LENGTH + " characters");
+ }
+ return sku;
+ }
+
+ /**
+ * Validates periodCount is not null and between `MIN_PERIOD` and `MAX_PERIOD` inclusive.
+ *
+ * @param periodCount
+ * @throws IllegalArgumentException if periodCount is null or out of range
+ */
+ public static Integer validatePeriodCount(Integer periodCount) {
+ Objects.requireNonNull(periodCount, "periodCount cannot be null");
+ if (periodCount < MIN_PERIOD || periodCount > MAX_PERIOD) {
+ throw new IllegalArgumentException("Period count must be between " + MIN_PERIOD + " and " + MAX_PERIOD);
+ }
+ return periodCount;
+ }
+
+ /**
+ * Validates a list of items is not null, not empty, and contains no null elements.
+ *
+ * @param list the list of items to validate
+ * @param the type of items in the list, must extend AbstractAdvancedCommerceItem
+ * @return the validated list of items
+ * @throws IllegalArgumentException if the list is null, empty, or contains null elements
+ */
+ public static List validateItems(List list) {
+ if (list == null) {
+ throw new IllegalArgumentException("Items list cannot be null");
+ }
+
+ if (list.isEmpty()) {
+ throw new IllegalArgumentException("Items list cannot be empty");
+ }
+
+ for (T item : list) {
+ if (item == null) {
+ throw new IllegalArgumentException("Item in the list cannot be null");
+ }
+ }
+
+ return list;
+ }
+
+ private static String validateStringWithMaxLength(String value, int maxLength, String fieldName) {
+ Objects.requireNonNull(value, fieldName + " cannot be null");
+ if (value.length() > maxLength) {
+ throw new IllegalArgumentException(fieldName + " length cannot exceed " + maxLength + " characters");
+ }
+ return value;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/apple/itunes/storekit/model/UpdateAppAccountTokenRequest.java b/src/main/java/com/apple/itunes/storekit/model/UpdateAppAccountTokenRequest.java
index 2fd7f4c9..2933b1dd 100644
--- a/src/main/java/com/apple/itunes/storekit/model/UpdateAppAccountTokenRequest.java
+++ b/src/main/java/com/apple/itunes/storekit/model/UpdateAppAccountTokenRequest.java
@@ -23,13 +23,11 @@ private UpdateAppAccountTokenRequest() {
}
public UpdateAppAccountTokenRequest(UUID appAccountToken) {
- Objects.requireNonNull(appAccountToken);
- this.appAccountToken = appAccountToken;
+ this.appAccountToken = Objects.requireNonNull(appAccountToken);
}
public UpdateAppAccountTokenRequest appAccountToken(UUID appAccountToken) {
- Objects.requireNonNull(appAccountToken);
- this.appAccountToken = appAccountToken;
+ this.appAccountToken = Objects.requireNonNull(appAccountToken);
return this;
}
@@ -44,8 +42,7 @@ public UUID getAppAccountToken() {
}
public void setAppAccountToken(UUID appAccountToken) {
- Objects.requireNonNull(appAccountToken);
- this.appAccountToken = appAccountToken;
+ this.appAccountToken = Objects.requireNonNull(appAccountToken);
}
@Override
diff --git a/src/test/java/com/apple/itunes/storekit/model/AdvancedCommerceModelsTest.java b/src/test/java/com/apple/itunes/storekit/model/AdvancedCommerceModelsTest.java
new file mode 100644
index 00000000..a5d05b10
--- /dev/null
+++ b/src/test/java/com/apple/itunes/storekit/model/AdvancedCommerceModelsTest.java
@@ -0,0 +1,655 @@
+// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
+
+package com.apple.itunes.storekit.model;
+
+import com.apple.itunes.storekit.util.TestingUtility;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.UUID;
+
+public class AdvancedCommerceModelsTest {
+
+ private final ObjectMapper objectMapper = new ObjectMapper();
+
+ @Test
+ public void testAdvancedCommercePeriod() {
+ Assertions.assertEquals("P1W", AdvancedCommercePeriod.P1W.getValue());
+ Assertions.assertEquals("P1M", AdvancedCommercePeriod.P1M.getValue());
+ Assertions.assertEquals("P2M", AdvancedCommercePeriod.P2M.getValue());
+ Assertions.assertEquals("P3M", AdvancedCommercePeriod.P3M.getValue());
+ Assertions.assertEquals("P6M", AdvancedCommercePeriod.P6M.getValue());
+ Assertions.assertEquals("P1Y", AdvancedCommercePeriod.P1Y.getValue());
+
+ Assertions.assertEquals(AdvancedCommercePeriod.P1W, AdvancedCommercePeriod.fromValue("P1W"));
+ Assertions.assertEquals(AdvancedCommercePeriod.P1M, AdvancedCommercePeriod.fromValue("P1M"));
+ Assertions.assertEquals(AdvancedCommercePeriod.P1Y, AdvancedCommercePeriod.fromValue("P1Y"));
+ Assertions.assertNull(AdvancedCommercePeriod.fromValue("INVALID"));
+
+ Assertions.assertEquals("P1W", AdvancedCommercePeriod.P1W.toString());
+ }
+
+ @Test
+ public void testAdvancedCommerceReason() {
+ Assertions.assertEquals("UPGRADE", AdvancedCommerceReason.UPGRADE.getValue());
+ Assertions.assertEquals("DOWNGRADE", AdvancedCommerceReason.DOWNGRADE.getValue());
+ Assertions.assertEquals("APPLY_OFFER", AdvancedCommerceReason.APPLY_OFFER.getValue());
+
+ Assertions.assertEquals(AdvancedCommerceReason.UPGRADE, AdvancedCommerceReason.fromValue("UPGRADE"));
+ Assertions.assertEquals(AdvancedCommerceReason.DOWNGRADE, AdvancedCommerceReason.fromValue("DOWNGRADE"));
+ Assertions.assertEquals(AdvancedCommerceReason.APPLY_OFFER, AdvancedCommerceReason.fromValue("APPLY_OFFER"));
+ Assertions.assertNull(AdvancedCommerceReason.fromValue("INVALID"));
+
+ Assertions.assertEquals("UPGRADE", AdvancedCommerceReason.UPGRADE.toString());
+ }
+
+ @Test
+ public void testAdvancedCommerceRefundReason() {
+ Assertions.assertEquals("UNINTENDED_PURCHASE", AdvancedCommerceRefundReason.UNINTENDED_PURCHASE.getValue());
+ Assertions.assertEquals("FULFILLMENT_ISSUE", AdvancedCommerceRefundReason.FULFILLMENT_ISSUE.getValue());
+ Assertions.assertEquals("UNSATISFIED_WITH_PURCHASE", AdvancedCommerceRefundReason.UNSATISFIED_WITH_PURCHASE.getValue());
+ Assertions.assertEquals("LEGAL", AdvancedCommerceRefundReason.LEGAL.getValue());
+ Assertions.assertEquals("OTHER", AdvancedCommerceRefundReason.OTHER.getValue());
+ Assertions.assertEquals("MODIFY_ITEMS_REFUND", AdvancedCommerceRefundReason.MODIFY_ITEMS_REFUND.getValue());
+ Assertions.assertEquals("SIMULATE_REFUND_DECLINE", AdvancedCommerceRefundReason.SIMULATE_REFUND_DECLINE.getValue());
+
+ Assertions.assertEquals(AdvancedCommerceRefundReason.LEGAL,
+ AdvancedCommerceRefundReason.fromValue("LEGAL"));
+ Assertions.assertEquals(AdvancedCommerceRefundReason.OTHER,
+ AdvancedCommerceRefundReason.fromValue("OTHER"));
+ Assertions.assertNull(AdvancedCommerceRefundReason.fromValue("INVALID"));
+
+ Assertions.assertEquals("LEGAL", AdvancedCommerceRefundReason.LEGAL.toString());
+ }
+
+ @Test
+ public void testAdvancedCommerceRefundType() {
+ Assertions.assertEquals("FULL", AdvancedCommerceRefundType.FULL.getValue());
+ Assertions.assertEquals("PRORATED", AdvancedCommerceRefundType.PRORATED.getValue());
+ Assertions.assertEquals("CUSTOM", AdvancedCommerceRefundType.CUSTOM.getValue());
+
+ Assertions.assertEquals(AdvancedCommerceRefundType.FULL, AdvancedCommerceRefundType.fromValue("FULL"));
+ Assertions.assertEquals(AdvancedCommerceRefundType.PRORATED, AdvancedCommerceRefundType.fromValue("PRORATED"));
+ Assertions.assertEquals(AdvancedCommerceRefundType.CUSTOM, AdvancedCommerceRefundType.fromValue("CUSTOM"));
+ Assertions.assertNull(AdvancedCommerceRefundType.fromValue("INVALID"));
+
+ Assertions.assertEquals("FULL", AdvancedCommerceRefundType.FULL.toString());
+ }
+
+ @Test
+ public void testAdvancedCommerceOfferPeriod() {
+ Assertions.assertEquals("P3D", AdvancedCommerceOfferPeriod.P3D.getValue());
+ Assertions.assertEquals("P1W", AdvancedCommerceOfferPeriod.P1W.getValue());
+ Assertions.assertEquals("P2W", AdvancedCommerceOfferPeriod.P2W.getValue());
+ Assertions.assertEquals("P1M", AdvancedCommerceOfferPeriod.P1M.getValue());
+ Assertions.assertEquals("P2M", AdvancedCommerceOfferPeriod.P2M.getValue());
+ Assertions.assertEquals("P3M", AdvancedCommerceOfferPeriod.P3M.getValue());
+
+ Assertions.assertEquals(AdvancedCommerceOfferPeriod.P1W, AdvancedCommerceOfferPeriod.fromValue("P1W"));
+ Assertions.assertEquals(AdvancedCommerceOfferPeriod.P1M, AdvancedCommerceOfferPeriod.fromValue("P1M"));
+ Assertions.assertEquals(AdvancedCommerceOfferPeriod.P3D, AdvancedCommerceOfferPeriod.fromValue("P3D"));
+ Assertions.assertNull(AdvancedCommerceOfferPeriod.fromValue("INVALID"));
+
+ Assertions.assertEquals("P1W", AdvancedCommerceOfferPeriod.P1W.toString());
+ }
+
+ @Test
+ public void testAdvancedCommerceOfferReason() {
+ Assertions.assertEquals("ACQUISITION", AdvancedCommerceOfferReason.ACQUISITION.getValue());
+ Assertions.assertEquals("WIN_BACK", AdvancedCommerceOfferReason.WIN_BACK.getValue());
+ Assertions.assertEquals("RETENTION", AdvancedCommerceOfferReason.RETENTION.getValue());
+
+ Assertions.assertEquals(AdvancedCommerceOfferReason.ACQUISITION,
+ AdvancedCommerceOfferReason.fromValue("ACQUISITION"));
+ Assertions.assertEquals(AdvancedCommerceOfferReason.WIN_BACK,
+ AdvancedCommerceOfferReason.fromValue("WIN_BACK"));
+ Assertions.assertEquals(AdvancedCommerceOfferReason.RETENTION,
+ AdvancedCommerceOfferReason.fromValue("RETENTION"));
+ Assertions.assertNull(AdvancedCommerceOfferReason.fromValue("INVALID"));
+
+ Assertions.assertEquals("WIN_BACK", AdvancedCommerceOfferReason.WIN_BACK.toString());
+ }
+
+ @Test
+ public void testAdvancedCommerceEffective() {
+ Assertions.assertEquals("IMMEDIATELY", AdvancedCommerceEffective.IMMEDIATELY.getValue());
+ Assertions.assertEquals("NEXT_BILL_CYCLE", AdvancedCommerceEffective.NEXT_BILL_CYCLE.getValue());
+
+ Assertions.assertEquals(AdvancedCommerceEffective.IMMEDIATELY,
+ AdvancedCommerceEffective.fromValue("IMMEDIATELY"));
+ Assertions.assertEquals(AdvancedCommerceEffective.NEXT_BILL_CYCLE,
+ AdvancedCommerceEffective.fromValue("NEXT_BILL_CYCLE"));
+ Assertions.assertNull(AdvancedCommerceEffective.fromValue("INVALID"));
+
+ Assertions.assertEquals("IMMEDIATELY", AdvancedCommerceEffective.IMMEDIATELY.toString());
+ }
+
+ @Test
+ public void testValidationUtilsDescription() {
+ String validDescription = "Valid description";
+ Assertions.assertEquals(validDescription, AdvancedCommerceValidationUtils.validateDescription(validDescription));
+
+ String maxLengthDescription = "A".repeat(45);
+ Assertions.assertEquals(maxLengthDescription,
+ AdvancedCommerceValidationUtils.validateDescription(maxLengthDescription));
+
+ String tooLongDescription = "A".repeat(46);
+ Assertions.assertThrows(IllegalArgumentException.class,
+ () -> AdvancedCommerceValidationUtils.validateDescription(tooLongDescription));
+
+ Assertions.assertThrows(NullPointerException.class,
+ () -> AdvancedCommerceValidationUtils.validateDescription(null));
+ }
+
+ @Test
+ public void testValidationUtilsDisplayName() {
+ String validDisplayName = "Valid Name";
+ Assertions.assertEquals(validDisplayName, AdvancedCommerceValidationUtils.validateDisplayName(validDisplayName));
+
+ String maxLengthDisplayName = "A".repeat(30);
+ Assertions.assertEquals(maxLengthDisplayName,
+ AdvancedCommerceValidationUtils.validateDisplayName(maxLengthDisplayName));
+
+ String tooLongDisplayName = "A".repeat(31);
+ Assertions.assertThrows(IllegalArgumentException.class,
+ () -> AdvancedCommerceValidationUtils.validateDisplayName(tooLongDisplayName));
+
+ Assertions.assertThrows(NullPointerException.class,
+ () -> AdvancedCommerceValidationUtils.validateDisplayName(null));
+ }
+
+ @Test
+ public void testValidationUtilsSku() {
+ String validSku = "valid.sku.123";
+ Assertions.assertEquals(validSku, AdvancedCommerceValidationUtils.validateSku(validSku));
+
+ String maxLengthSku = "A".repeat(128);
+ Assertions.assertEquals(maxLengthSku, AdvancedCommerceValidationUtils.validateSku(maxLengthSku));
+
+ String tooLongSku = "A".repeat(129);
+ Assertions.assertThrows(IllegalArgumentException.class,
+ () -> AdvancedCommerceValidationUtils.validateSku(tooLongSku));
+
+ Assertions.assertNull(AdvancedCommerceValidationUtils.validateSku(null));
+ }
+
+ @Test
+ public void testValidationUtilsPeriodCount() {
+ Assertions.assertEquals(1, AdvancedCommerceValidationUtils.validatePeriodCount(1));
+ Assertions.assertEquals(6, AdvancedCommerceValidationUtils.validatePeriodCount(6));
+ Assertions.assertEquals(12, AdvancedCommerceValidationUtils.validatePeriodCount(12));
+
+ Assertions.assertThrows(IllegalArgumentException.class,
+ () -> AdvancedCommerceValidationUtils.validatePeriodCount(0));
+ Assertions.assertThrows(IllegalArgumentException.class,
+ () -> AdvancedCommerceValidationUtils.validatePeriodCount(13));
+ Assertions.assertThrows(NullPointerException.class,
+ () -> AdvancedCommerceValidationUtils.validatePeriodCount(null));
+ }
+
+ @Test
+ public void testValidationUtilsItems() {
+ List validList = Arrays.asList(
+ new AdvancedCommerceOneTimeChargeItem("desc", "name", "sku1", 1000L)
+ );
+ Assertions.assertEquals(validList, AdvancedCommerceValidationUtils.validateItems(validList));
+
+ Assertions.assertThrows(IllegalArgumentException.class,
+ () -> AdvancedCommerceValidationUtils.validateItems(null));
+ Assertions.assertThrows(IllegalArgumentException.class,
+ () -> AdvancedCommerceValidationUtils.validateItems(new ArrayList<>()));
+
+ List listWithNull = new ArrayList<>();
+ listWithNull.add(null);
+ Assertions.assertThrows(IllegalArgumentException.class,
+ () -> AdvancedCommerceValidationUtils.validateItems(listWithNull));
+ }
+
+ @Test
+ public void testAdvancedCommerceDescriptors() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceDescriptors.json");
+
+ AdvancedCommerceDescriptors descriptors = objectMapper.readValue(json, AdvancedCommerceDescriptors.class);
+ Assertions.assertEquals("description", descriptors.getDescription());
+ Assertions.assertEquals("display name", descriptors.getDisplayName());
+ }
+
+ @Test
+ public void testAdvancedCommerceOneTimeChargeItem() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceOneTimeChargeItem.json");
+
+ AdvancedCommerceOneTimeChargeItem item = objectMapper.readValue(json, AdvancedCommerceOneTimeChargeItem.class);
+ Assertions.assertEquals("description", item.getDescription());
+ Assertions.assertEquals("display name", item.getDisplayName());
+ Assertions.assertEquals("sku", item.getSku());
+ Assertions.assertEquals(15000L, item.getPrice());
+ }
+
+ @Test
+ public void testAdvancedCommerceSubscriptionCreateItem() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceSubscriptionCreateItem.json");
+
+ AdvancedCommerceSubscriptionCreateItem item = objectMapper.readValue(json, AdvancedCommerceSubscriptionCreateItem.class);
+ Assertions.assertEquals("description", item.getDescription());
+ Assertions.assertEquals("display name", item.getDisplayName());
+ Assertions.assertEquals("sku", item.getSku());
+ Assertions.assertEquals(20000L, item.getPrice());
+ }
+
+ @Test
+ public void testAdvancedCommerceRequestRefundItem() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceRequestRefundItem.json");
+
+ AdvancedCommerceRequestRefundItem item = objectMapper.readValue(json, AdvancedCommerceRequestRefundItem.class);
+ Assertions.assertEquals("sku", item.getSku());
+ Assertions.assertEquals(AdvancedCommerceRefundReason.LEGAL, item.getRefundReason());
+ Assertions.assertEquals(AdvancedCommerceRefundType.FULL, item.getRefundType());
+ Assertions.assertEquals(true, item.getRevoke());
+ Assertions.assertEquals(5000, item.getRefundAmount());
+ }
+
+ @Test
+ public void testAdvancedCommerceOffer() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceOffer.json");
+
+ AdvancedCommerceOffer offer = objectMapper.readValue(json, AdvancedCommerceOffer.class);
+ Assertions.assertEquals(AdvancedCommerceOfferPeriod.P1W, offer.getPeriod());
+ Assertions.assertEquals(3, offer.getPeriodCount());
+ Assertions.assertEquals(5000L, offer.getPrice());
+ Assertions.assertEquals(AdvancedCommerceOfferReason.WIN_BACK, offer.getReason());
+ }
+
+
+ @Test
+ public void testAdvancedCommerceOneTimeChargeCreateRequest() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceOneTimeChargeCreateRequest.json");
+
+ AdvancedCommerceOneTimeChargeCreateRequest request =
+ objectMapper.readValue(json, AdvancedCommerceOneTimeChargeCreateRequest.class);
+
+ Assertions.assertEquals("USD", request.getCurrency());
+ Assertions.assertNotNull(request.getItem());
+ Assertions.assertEquals("taxCode", request.getTaxCode());
+ Assertions.assertNotNull(request.getRequestInfo());
+ Assertions.assertEquals("USA", request.getStorefront());
+ }
+
+ @Test
+ public void testAdvancedCommerceSubscriptionCreateRequest() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceSubscriptionCreateRequest.json");
+
+ AdvancedCommerceSubscriptionCreateRequest request =
+ objectMapper.readValue(json, AdvancedCommerceSubscriptionCreateRequest.class);
+
+ Assertions.assertEquals("USD", request.getCurrency());
+ Assertions.assertNotNull(request.getDescriptors());
+ Assertions.assertNotNull(request.getItems());
+ Assertions.assertEquals(2, request.getItems().size());
+ Assertions.assertEquals(AdvancedCommercePeriod.P1M, request.getPeriod());
+ Assertions.assertEquals("taxCode", request.getTaxCode());
+ Assertions.assertEquals("USA", request.getStorefront());
+ Assertions.assertEquals("transactionId", request.getPreviousTransactionId());
+ }
+
+ @Test
+ public void testAdvancedCommerceRequestRefundRequest() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceRequestRefundRequest.json");
+
+ AdvancedCommerceRequestRefundRequest request =
+ objectMapper.readValue(json, AdvancedCommerceRequestRefundRequest.class);
+
+ Assertions.assertNotNull(request.getItems());
+ Assertions.assertEquals(2, request.getItems().size());
+ Assertions.assertTrue(request.getRefundRiskingPreference());
+ Assertions.assertNotNull(request.getRequestInfo());
+ Assertions.assertEquals("USD", request.getCurrency());
+ Assertions.assertEquals("USA", request.getStorefront());
+ }
+
+ @Test
+ public void testAdvancedCommerceSubscriptionCancelRequest() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceSubscriptionCancelRequest.json");
+
+ AdvancedCommerceSubscriptionCancelRequest request =
+ objectMapper.readValue(json, AdvancedCommerceSubscriptionCancelRequest.class);
+
+ Assertions.assertNotNull(request.getRequestInfo());
+ Assertions.assertEquals("USA", request.getStorefront());
+ }
+
+ @Test
+ public void testAdvancedCommerceSubscriptionRevokeRequest() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceSubscriptionRevokeRequest.json");
+
+ AdvancedCommerceSubscriptionRevokeRequest request =
+ objectMapper.readValue(json, AdvancedCommerceSubscriptionRevokeRequest.class);
+
+ Assertions.assertNotNull(request.getRequestInfo());
+ Assertions.assertTrue(request.getRefundRiskingPreference());
+ Assertions.assertEquals(AdvancedCommerceRefundReason.LEGAL, request.getRefundReason());
+ Assertions.assertEquals("FULL", request.getRefundType());
+ Assertions.assertEquals("USA", request.getStorefront());
+ }
+
+ @Test
+ public void testAdvancedCommerceSubscriptionPriceChangeRequest() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceSubscriptionPriceChangeRequest.json");
+
+ AdvancedCommerceSubscriptionPriceChangeRequest request =
+ objectMapper.readValue(json, AdvancedCommerceSubscriptionPriceChangeRequest.class);
+
+ Assertions.assertNotNull(request.getItems());
+ Assertions.assertNotNull(request.getRequestInfo());
+ Assertions.assertEquals("USD", request.getCurrency());
+ }
+
+
+ @Test
+ public void testAdvancedCommerceRequestRefundResponse() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceRequestRefundResponse.json");
+
+ AdvancedCommerceRequestRefundResponse response = objectMapper.readValue(json, AdvancedCommerceRequestRefundResponse.class);
+
+ Assertions.assertNull(response.getSignedRenewalInfo());
+ Assertions.assertEquals("signed_transaction_info_value", response.getSignedTransactionInfo());
+ }
+
+ @Test
+ public void testAdvancedCommerceSubscriptionCancelResponse() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceSubscriptionCancelResponse.json");
+
+ AdvancedCommerceSubscriptionCancelResponse response = objectMapper.readValue(json, AdvancedCommerceSubscriptionCancelResponse.class);
+
+ Assertions.assertEquals("signed_renewal_info", response.getSignedRenewalInfo());
+ Assertions.assertEquals("signed_transaction_info", response.getSignedTransactionInfo());
+ }
+
+ @Test
+ public void testAdvancedCommerceSubscriptionRevokeResponse() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceSubscriptionRevokeResponse.json");
+
+ AdvancedCommerceSubscriptionRevokeResponse response = objectMapper.readValue(json, AdvancedCommerceSubscriptionRevokeResponse.class);
+
+ Assertions.assertEquals("signed_renewal_info", response.getSignedRenewalInfo());
+ Assertions.assertEquals("signed_transaction_info", response.getSignedTransactionInfo());
+ }
+
+ @Test
+ public void testAdvancedCommerceSubscriptionPriceChangeResponse() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceSubscriptionPriceChangeResponse.json");
+
+ AdvancedCommerceSubscriptionPriceChangeResponse response =
+ objectMapper.readValue(json, AdvancedCommerceSubscriptionPriceChangeResponse.class);
+
+ Assertions.assertEquals("signed_renewal_info", response.getSignedRenewalInfo());
+ Assertions.assertEquals("signed_transaction_info", response.getSignedTransactionInfo());
+ }
+
+ @Test
+ public void testAdvancedCommerceSubscriptionChangeMetadataResponse() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceSubscriptionChangeMetadataResponse.json");
+
+ AdvancedCommerceSubscriptionChangeMetadataResponse response =
+ objectMapper.readValue(json, AdvancedCommerceSubscriptionChangeMetadataResponse.class);
+
+ Assertions.assertEquals("signed_renewal_info", response.getSignedRenewalInfo());
+ Assertions.assertEquals("signed_transaction_info", response.getSignedTransactionInfo());
+ }
+
+ @Test
+ public void testAbstractAdvancedCommerceResponseWithUnknownFields() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceResponseWithUnknownFields.json");
+
+ AdvancedCommerceSubscriptionCancelResponse response =
+ objectMapper.readValue(json, AdvancedCommerceSubscriptionCancelResponse.class);
+
+ Assertions.assertEquals("signed_renewal_info_value", response.getSignedRenewalInfo());
+ Assertions.assertEquals("signed_transaction_info_value", response.getSignedTransactionInfo());
+ Assertions.assertNotNull(response.getUnknownFields());
+ Assertions.assertEquals(1, response.getUnknownFields().size());
+ Assertions.assertEquals("unknown_value", response.getUnknownFields().get("unknownField"));
+ }
+
+
+ @Test
+ public void testAdvancedCommerceSubscriptionMigrateRequest() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceSubscriptionMigrateRequest.json");
+
+ AdvancedCommerceSubscriptionMigrateRequest request =
+ objectMapper.readValue(json, AdvancedCommerceSubscriptionMigrateRequest.class);
+
+ Assertions.assertNotNull(request.getDescriptors());
+ Assertions.assertNotNull(request.getItems());
+ Assertions.assertEquals("taxCode", request.getTaxCode());
+ Assertions.assertEquals("targetProductId", request.getTargetProductId());
+ }
+
+ @Test
+ public void testAdvancedCommerceSubscriptionModifyInAppRequest() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceSubscriptionModifyInAppRequest.json");
+
+ AdvancedCommerceSubscriptionModifyInAppRequest request =
+ objectMapper.readValue(json, AdvancedCommerceSubscriptionModifyInAppRequest.class);
+
+ Assertions.assertEquals("USD", request.getCurrency());
+ Assertions.assertNotNull(request.getDescriptors());
+ Assertions.assertEquals("taxCode", request.getTaxCode());
+ Assertions.assertEquals("transactionId", request.getTransactionId());
+ Assertions.assertTrue(request.getRetainBillingCycle());
+ }
+
+ @Test
+ public void testAdvancedCommerceSubscriptionReactivateInAppRequest() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceSubscriptionReactivateInAppRequest.json");
+
+ AdvancedCommerceSubscriptionReactivateInAppRequest request =
+ objectMapper.readValue(json, AdvancedCommerceSubscriptionReactivateInAppRequest.class);
+
+ Assertions.assertNotNull(request.getItems());
+ Assertions.assertEquals("transactionId", request.getTransactionId());
+ }
+
+ @Test
+ public void testAdvancedCommerceSubscriptionChangeMetadataRequest() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceSubscriptionChangeMetadataRequest.json");
+
+ AdvancedCommerceSubscriptionChangeMetadataRequest request =
+ objectMapper.readValue(json, AdvancedCommerceSubscriptionChangeMetadataRequest.class);
+
+ Assertions.assertNotNull(request.getItems());
+ Assertions.assertNotNull(request.getRequestInfo());
+ }
+
+
+ @Test
+ public void testAdvancedCommerceSubscriptionMigrateDescriptors() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceSubscriptionMigrateDescriptors.json");
+
+ AdvancedCommerceSubscriptionMigrateDescriptors descriptors =
+ objectMapper.readValue(json, AdvancedCommerceSubscriptionMigrateDescriptors.class);
+
+ Assertions.assertEquals("description", descriptors.getDescription());
+ Assertions.assertEquals("displayName", descriptors.getDisplayName());
+ }
+
+ @Test
+ public void testAdvancedCommerceSubscriptionModifyDescriptors() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceSubscriptionModifyDescriptors.json");
+
+ AdvancedCommerceSubscriptionModifyDescriptors descriptors =
+ objectMapper.readValue(json, AdvancedCommerceSubscriptionModifyDescriptors.class);
+
+ Assertions.assertEquals("description", descriptors.getDescription());
+ Assertions.assertEquals("displayName", descriptors.getDisplayName());
+ Assertions.assertEquals(AdvancedCommerceEffective.IMMEDIATELY, descriptors.getEffective());
+ }
+
+ @Test
+ public void testAdvancedCommerceSubscriptionChangeMetadataDescriptors() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceSubscriptionChangeMetadataDescriptors.json");
+
+ AdvancedCommerceSubscriptionChangeMetadataDescriptors descriptors =
+ objectMapper.readValue(json, AdvancedCommerceSubscriptionChangeMetadataDescriptors.class);
+
+ Assertions.assertEquals("description", descriptors.getDescription());
+ Assertions.assertEquals("displayName", descriptors.getDisplayName());
+ Assertions.assertEquals(AdvancedCommerceEffective.IMMEDIATELY, descriptors.getEffective());
+ }
+
+ @Test
+ public void testAdvancedCommerceSubscriptionMigrateItem() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceSubscriptionMigrateItem.json");
+
+ AdvancedCommerceSubscriptionMigrateItem item = objectMapper.readValue(json, AdvancedCommerceSubscriptionMigrateItem.class);
+
+ Assertions.assertEquals("description", item.getDescription());
+ Assertions.assertEquals("displayName", item.getDisplayName());
+ Assertions.assertEquals("sku", item.getSku());
+ }
+
+ @Test
+ public void testAdvancedCommerceSubscriptionMigrateRenewalItem() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceSubscriptionMigrateRenewalItem.json");
+
+ AdvancedCommerceSubscriptionMigrateRenewalItem item =
+ objectMapper.readValue(json, AdvancedCommerceSubscriptionMigrateRenewalItem.class);
+
+ Assertions.assertEquals("description", item.getDescription());
+ Assertions.assertEquals("displayName", item.getDisplayName());
+ Assertions.assertEquals("sku", item.getSku());
+ }
+
+ @Test
+ public void testAdvancedCommerceSubscriptionModifyAddItem() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceSubscriptionModifyAddItem.json");
+
+ AdvancedCommerceSubscriptionModifyAddItem item = objectMapper.readValue(json, AdvancedCommerceSubscriptionModifyAddItem.class);
+
+ Assertions.assertEquals("description", item.getDescription());
+ Assertions.assertEquals("displayName", item.getDisplayName());
+ Assertions.assertEquals("sku", item.getSku());
+ Assertions.assertEquals(12000L, item.getPrice());
+ }
+
+ @Test
+ public void testAdvancedCommerceSubscriptionModifyChangeItem() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceSubscriptionModifyChangeItem.json");
+
+ AdvancedCommerceSubscriptionModifyChangeItem item = objectMapper.readValue(json, AdvancedCommerceSubscriptionModifyChangeItem.class);
+
+ Assertions.assertEquals("description", item.getDescription());
+ Assertions.assertEquals("displayName", item.getDisplayName());
+ Assertions.assertEquals("sku", item.getSku());
+ Assertions.assertEquals("currentSKU", item.getCurrentSKU());
+ Assertions.assertEquals(13000L, item.getPrice());
+ Assertions.assertEquals(AdvancedCommerceEffective.IMMEDIATELY, item.getEffective());
+ Assertions.assertEquals(AdvancedCommerceReason.UPGRADE, item.getReason());
+ }
+
+ @Test
+ public void testAdvancedCommerceSubscriptionModifyRemoveItem() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceSubscriptionModifyRemoveItem.json");
+
+ AdvancedCommerceSubscriptionModifyRemoveItem item = objectMapper.readValue(json, AdvancedCommerceSubscriptionModifyRemoveItem.class);
+
+ Assertions.assertEquals("sku", item.getSku());
+ }
+
+ @Test
+ public void testAdvancedCommerceSubscriptionModifyPeriodChange() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceSubscriptionModifyPeriodChange.json");
+
+ AdvancedCommerceSubscriptionModifyPeriodChange periodChange =
+ objectMapper.readValue(json, AdvancedCommerceSubscriptionModifyPeriodChange.class);
+
+ Assertions.assertEquals(AdvancedCommercePeriod.P3M, periodChange.getPeriod());
+ Assertions.assertEquals(AdvancedCommerceEffective.IMMEDIATELY, periodChange.getEffective());
+ }
+
+ @Test
+ public void testAdvancedCommerceSubscriptionPriceChangeItem() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceSubscriptionPriceChangeItem.json");
+
+ AdvancedCommerceSubscriptionPriceChangeItem item = objectMapper.readValue(json, AdvancedCommerceSubscriptionPriceChangeItem.class);
+
+ Assertions.assertEquals("sku", item.getSku());
+ Assertions.assertEquals(16000L, item.getPrice());
+ Assertions.assertEquals("dependentSKU", item.getDependentSKUs().get(0));
+ }
+
+ @Test
+ public void testAdvancedCommerceSubscriptionPriceChangeItemDependentSKUValidation() {
+ String validSku = "A".repeat(128);
+ String tooLongSku = "A".repeat(129);
+
+ AdvancedCommerceSubscriptionPriceChangeItem item = new AdvancedCommerceSubscriptionPriceChangeItem("sku", 1000L);
+ item.addDependentSKU(validSku);
+ Assertions.assertEquals(validSku, item.getDependentSKUs().get(0));
+
+ Assertions.assertThrows(IllegalArgumentException.class,
+ () -> new AdvancedCommerceSubscriptionPriceChangeItem("sku", 1000L).addDependentSKU(tooLongSku));
+
+ Assertions.assertThrows(IllegalArgumentException.class,
+ () -> new AdvancedCommerceSubscriptionPriceChangeItem("sku", 1000L).dependentSKUs(List.of(tooLongSku)));
+
+ Assertions.assertThrows(IllegalArgumentException.class, () -> {
+ AdvancedCommerceSubscriptionPriceChangeItem i = new AdvancedCommerceSubscriptionPriceChangeItem("sku", 1000L);
+ i.setDependentSKUs(List.of(tooLongSku));
+ });
+
+ AdvancedCommerceSubscriptionPriceChangeItem nullListItem = new AdvancedCommerceSubscriptionPriceChangeItem("sku", 1000L);
+ nullListItem.setDependentSKUs(null);
+ Assertions.assertNull(nullListItem.getDependentSKUs());
+ }
+
+ @Test
+ public void testAdvancedCommerceSubscriptionReactivateItem() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceSubscriptionReactivateItem.json");
+
+ AdvancedCommerceSubscriptionReactivateItem item = objectMapper.readValue(json, AdvancedCommerceSubscriptionReactivateItem.class);
+
+ Assertions.assertEquals("sku", item.getSku());
+ }
+
+ @Test
+ public void testAdvancedCommerceSubscriptionChangeMetadataItem() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceSubscriptionChangeMetadataItem.json");
+
+ AdvancedCommerceSubscriptionChangeMetadataItem item =
+ objectMapper.readValue(json, AdvancedCommerceSubscriptionChangeMetadataItem.class);
+
+ Assertions.assertEquals("description", item.getDescription());
+ Assertions.assertEquals("displayName", item.getDisplayName());
+ Assertions.assertEquals("sku", item.getSku());
+ Assertions.assertEquals("currentSKU", item.getCurrentSku());
+ Assertions.assertEquals(AdvancedCommerceEffective.NEXT_BILL_CYCLE, item.getEffective());
+ }
+
+
+ @Test
+ public void testAdvancedCommerceRequestInfo() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceRequestInfo.json");
+
+ AdvancedCommerceRequestInfo requestInfo = objectMapper.readValue(json, AdvancedCommerceRequestInfo.class);
+
+ Assertions.assertEquals(UUID.fromString("550e8400-e29b-41d4-a716-446655440010"), requestInfo.getRequestReferenceId());
+ Assertions.assertEquals(UUID.fromString("660e8400-e29b-41d4-a716-446655440011"), requestInfo.getAppAccountToken());
+ Assertions.assertEquals("consistency_token_value", requestInfo.consistencyToken());
+ }
+
+
+ @Test
+ public void testAdvancedCommerceSubscriptionMigrateResponse() throws Exception {
+ String json = TestingUtility.readFile("models/advancedCommerceSubscriptionMigrateResponse.json");
+
+ AdvancedCommerceSubscriptionMigrateResponse response =
+ objectMapper.readValue(json, AdvancedCommerceSubscriptionMigrateResponse.class);
+
+ Assertions.assertEquals("signed_renewal_info_value", response.getSignedRenewalInfo());
+ Assertions.assertEquals("signed_transaction_info_value", response.getSignedTransactionInfo());
+ }
+}
diff --git a/src/test/resources/models/advancedCommerceDescriptors.json b/src/test/resources/models/advancedCommerceDescriptors.json
new file mode 100644
index 00000000..5fe14d4c
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceDescriptors.json
@@ -0,0 +1,4 @@
+{
+ "description": "description",
+ "displayName": "display name"
+}
diff --git a/src/test/resources/models/advancedCommerceOffer.json b/src/test/resources/models/advancedCommerceOffer.json
new file mode 100644
index 00000000..83a413fb
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceOffer.json
@@ -0,0 +1,6 @@
+{
+ "period": "P1W",
+ "periodCount": 3,
+ "price": 5000,
+ "reason": "WIN_BACK"
+}
diff --git a/src/test/resources/models/advancedCommerceOneTimeChargeCreateRequest.json b/src/test/resources/models/advancedCommerceOneTimeChargeCreateRequest.json
new file mode 100644
index 00000000..d9874797
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceOneTimeChargeCreateRequest.json
@@ -0,0 +1,16 @@
+{
+ "currency": "USD",
+ "item": {
+ "description": "description",
+ "displayName": "display name",
+ "SKU": "sku",
+ "price": 10000
+ },
+ "requestInfo": {
+ "requestReferenceId": "550e8400-e29b-41d4-a716-446655440000"
+ },
+ "taxCode": "taxCode",
+ "storefront": "USA",
+ "operation": "CREATE",
+ "version": "1.0"
+}
diff --git a/src/test/resources/models/advancedCommerceOneTimeChargeItem.json b/src/test/resources/models/advancedCommerceOneTimeChargeItem.json
new file mode 100644
index 00000000..0849bf28
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceOneTimeChargeItem.json
@@ -0,0 +1,6 @@
+{
+ "description": "description",
+ "displayName": "display name",
+ "SKU": "sku",
+ "price": 15000
+}
diff --git a/src/test/resources/models/advancedCommerceRequestInfo.json b/src/test/resources/models/advancedCommerceRequestInfo.json
new file mode 100644
index 00000000..a57cbdca
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceRequestInfo.json
@@ -0,0 +1,5 @@
+{
+ "requestReferenceId": "550e8400-e29b-41d4-a716-446655440010",
+ "appAccountToken": "660e8400-e29b-41d4-a716-446655440011",
+ "consistencyToken": "consistency_token_value"
+}
diff --git a/src/test/resources/models/advancedCommerceRequestRefundItem.json b/src/test/resources/models/advancedCommerceRequestRefundItem.json
new file mode 100644
index 00000000..875107fa
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceRequestRefundItem.json
@@ -0,0 +1,7 @@
+{
+ "SKU": "sku",
+ "refundReason": "LEGAL",
+ "refundType": "FULL",
+ "revoke": true,
+ "refundAmount": 5000
+}
diff --git a/src/test/resources/models/advancedCommerceRequestRefundRequest.json b/src/test/resources/models/advancedCommerceRequestRefundRequest.json
new file mode 100644
index 00000000..6a58aa7a
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceRequestRefundRequest.json
@@ -0,0 +1,22 @@
+{
+ "items": [
+ {
+ "SKU": "sku",
+ "refundReason": "LEGAL",
+ "refundType": "FULL",
+ "revoke": true
+ },
+ {
+ "SKU": "sku",
+ "refundReason": "OTHER",
+ "refundType": "PRORATED",
+ "revoke": false
+ }
+ ],
+ "refundRiskingPreference": true,
+ "requestInfo": {
+ "requestReferenceId": "550e8400-e29b-41d4-a716-446655440002"
+ },
+ "currency": "USD",
+ "storefront": "USA"
+}
diff --git a/src/test/resources/models/advancedCommerceRequestRefundResponse.json b/src/test/resources/models/advancedCommerceRequestRefundResponse.json
new file mode 100644
index 00000000..0e4f409c
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceRequestRefundResponse.json
@@ -0,0 +1,3 @@
+{
+ "signedTransactionInfo": "signed_transaction_info_value"
+}
diff --git a/src/test/resources/models/advancedCommerceResponseWithUnknownFields.json b/src/test/resources/models/advancedCommerceResponseWithUnknownFields.json
new file mode 100644
index 00000000..6e516d74
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceResponseWithUnknownFields.json
@@ -0,0 +1,5 @@
+{
+ "signedRenewalInfo": "signed_renewal_info_value",
+ "signedTransactionInfo": "signed_transaction_info_value",
+ "unknownField": "unknown_value"
+}
diff --git a/src/test/resources/models/advancedCommerceSubscriptionCancelRequest.json b/src/test/resources/models/advancedCommerceSubscriptionCancelRequest.json
new file mode 100644
index 00000000..9cbe08c5
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceSubscriptionCancelRequest.json
@@ -0,0 +1,6 @@
+{
+ "requestInfo": {
+ "requestReferenceId": "550e8400-e29b-41d4-a716-446655440003"
+ },
+ "storefront": "USA"
+}
diff --git a/src/test/resources/models/advancedCommerceSubscriptionCancelResponse.json b/src/test/resources/models/advancedCommerceSubscriptionCancelResponse.json
new file mode 100644
index 00000000..6f14b309
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceSubscriptionCancelResponse.json
@@ -0,0 +1,4 @@
+{
+ "signedRenewalInfo": "signed_renewal_info",
+ "signedTransactionInfo": "signed_transaction_info"
+}
diff --git a/src/test/resources/models/advancedCommerceSubscriptionChangeMetadataDescriptors.json b/src/test/resources/models/advancedCommerceSubscriptionChangeMetadataDescriptors.json
new file mode 100644
index 00000000..b07d7400
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceSubscriptionChangeMetadataDescriptors.json
@@ -0,0 +1,5 @@
+{
+ "effective": "IMMEDIATELY",
+ "description": "description",
+ "displayName": "displayName"
+}
diff --git a/src/test/resources/models/advancedCommerceSubscriptionChangeMetadataItem.json b/src/test/resources/models/advancedCommerceSubscriptionChangeMetadataItem.json
new file mode 100644
index 00000000..4ec7192b
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceSubscriptionChangeMetadataItem.json
@@ -0,0 +1,7 @@
+{
+ "currentSKU": "currentSKU",
+ "effective": "NEXT_BILL_CYCLE",
+ "description": "description",
+ "displayName": "displayName",
+ "SKU": "sku"
+}
diff --git a/src/test/resources/models/advancedCommerceSubscriptionChangeMetadataRequest.json b/src/test/resources/models/advancedCommerceSubscriptionChangeMetadataRequest.json
new file mode 100644
index 00000000..20a1e396
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceSubscriptionChangeMetadataRequest.json
@@ -0,0 +1,14 @@
+{
+ "requestInfo": {
+ "requestReferenceId": "550e8400-e29b-41d4-a716-446655440009"
+ },
+ "items": [
+ {
+ "currentSKU": "currentSKU",
+ "effective": "IMMEDIATELY",
+ "description": "description",
+ "displayName": "display name",
+ "SKU": "sku"
+ }
+ ]
+}
diff --git a/src/test/resources/models/advancedCommerceSubscriptionChangeMetadataResponse.json b/src/test/resources/models/advancedCommerceSubscriptionChangeMetadataResponse.json
new file mode 100644
index 00000000..6f14b309
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceSubscriptionChangeMetadataResponse.json
@@ -0,0 +1,4 @@
+{
+ "signedRenewalInfo": "signed_renewal_info",
+ "signedTransactionInfo": "signed_transaction_info"
+}
diff --git a/src/test/resources/models/advancedCommerceSubscriptionCreateItem.json b/src/test/resources/models/advancedCommerceSubscriptionCreateItem.json
new file mode 100644
index 00000000..f1b00ea2
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceSubscriptionCreateItem.json
@@ -0,0 +1,6 @@
+{
+ "description": "description",
+ "displayName": "display name",
+ "SKU": "sku",
+ "price": 20000
+}
diff --git a/src/test/resources/models/advancedCommerceSubscriptionCreateRequest.json b/src/test/resources/models/advancedCommerceSubscriptionCreateRequest.json
new file mode 100644
index 00000000..2b7a132c
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceSubscriptionCreateRequest.json
@@ -0,0 +1,28 @@
+{
+ "currency": "USD",
+ "descriptors": {
+ "description": "description",
+ "displayName": "display name"
+ },
+ "items": [
+ {
+ "SKU": "sku",
+ "description": "description",
+ "displayName": "display name",
+ "price": 20000
+ },
+ {
+ "SKU": "sku",
+ "description": "description",
+ "displayName": "display name",
+ "price": 30000
+ }
+ ],
+ "period": "P1M",
+ "requestInfo": {
+ "requestReferenceId": "550e8400-e29b-41d4-a716-446655440001"
+ },
+ "taxCode": "taxCode",
+ "storefront": "USA",
+ "previousTransactionId": "transactionId"
+}
diff --git a/src/test/resources/models/advancedCommerceSubscriptionMigrateDescriptors.json b/src/test/resources/models/advancedCommerceSubscriptionMigrateDescriptors.json
new file mode 100644
index 00000000..6d0bd6ee
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceSubscriptionMigrateDescriptors.json
@@ -0,0 +1,4 @@
+{
+ "description": "description",
+ "displayName": "displayName"
+}
diff --git a/src/test/resources/models/advancedCommerceSubscriptionMigrateItem.json b/src/test/resources/models/advancedCommerceSubscriptionMigrateItem.json
new file mode 100644
index 00000000..00fce710
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceSubscriptionMigrateItem.json
@@ -0,0 +1,5 @@
+{
+ "SKU": "sku",
+ "description": "description",
+ "displayName": "displayName"
+}
diff --git a/src/test/resources/models/advancedCommerceSubscriptionMigrateRenewalItem.json b/src/test/resources/models/advancedCommerceSubscriptionMigrateRenewalItem.json
new file mode 100644
index 00000000..00fce710
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceSubscriptionMigrateRenewalItem.json
@@ -0,0 +1,5 @@
+{
+ "SKU": "sku",
+ "description": "description",
+ "displayName": "displayName"
+}
diff --git a/src/test/resources/models/advancedCommerceSubscriptionMigrateRequest.json b/src/test/resources/models/advancedCommerceSubscriptionMigrateRequest.json
new file mode 100644
index 00000000..d670da51
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceSubscriptionMigrateRequest.json
@@ -0,0 +1,18 @@
+{
+ "requestInfo": {
+ "requestReferenceId": "550e8400-e29b-41d4-a716-446655440006"
+ },
+ "descriptors": {
+ "description": "description",
+ "displayName": "display name"
+ },
+ "items": [
+ {
+ "SKU": "sku",
+ "description": "description",
+ "displayName": "display name"
+ }
+ ],
+ "targetProductId": "targetProductId",
+ "taxCode": "taxCode"
+}
diff --git a/src/test/resources/models/advancedCommerceSubscriptionMigrateResponse.json b/src/test/resources/models/advancedCommerceSubscriptionMigrateResponse.json
new file mode 100644
index 00000000..2b12972a
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceSubscriptionMigrateResponse.json
@@ -0,0 +1,4 @@
+{
+ "signedRenewalInfo": "signed_renewal_info_value",
+ "signedTransactionInfo": "signed_transaction_info_value"
+}
diff --git a/src/test/resources/models/advancedCommerceSubscriptionModifyAddItem.json b/src/test/resources/models/advancedCommerceSubscriptionModifyAddItem.json
new file mode 100644
index 00000000..935ffb42
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceSubscriptionModifyAddItem.json
@@ -0,0 +1,6 @@
+{
+ "SKU": "sku",
+ "description": "description",
+ "displayName": "displayName",
+ "price": 12000
+}
diff --git a/src/test/resources/models/advancedCommerceSubscriptionModifyChangeItem.json b/src/test/resources/models/advancedCommerceSubscriptionModifyChangeItem.json
new file mode 100644
index 00000000..2874d6c4
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceSubscriptionModifyChangeItem.json
@@ -0,0 +1,9 @@
+{
+ "currentSKU": "currentSKU",
+ "description": "description",
+ "displayName": "displayName",
+ "effective": "IMMEDIATELY",
+ "price": 13000,
+ "reason": "UPGRADE",
+ "SKU": "sku"
+}
diff --git a/src/test/resources/models/advancedCommerceSubscriptionModifyDescriptors.json b/src/test/resources/models/advancedCommerceSubscriptionModifyDescriptors.json
new file mode 100644
index 00000000..b07d7400
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceSubscriptionModifyDescriptors.json
@@ -0,0 +1,5 @@
+{
+ "effective": "IMMEDIATELY",
+ "description": "description",
+ "displayName": "displayName"
+}
diff --git a/src/test/resources/models/advancedCommerceSubscriptionModifyInAppRequest.json b/src/test/resources/models/advancedCommerceSubscriptionModifyInAppRequest.json
new file mode 100644
index 00000000..0934cb8c
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceSubscriptionModifyInAppRequest.json
@@ -0,0 +1,14 @@
+{
+ "requestInfo": {
+ "requestReferenceId": "550e8400-e29b-41d4-a716-446655440007"
+ },
+ "transactionId": "transactionId",
+ "retainBillingCycle": true,
+ "descriptors": {
+ "effective": "IMMEDIATELY",
+ "description": "description",
+ "displayName": "display name"
+ },
+ "taxCode": "taxCode",
+ "currency": "USD"
+}
diff --git a/src/test/resources/models/advancedCommerceSubscriptionModifyPeriodChange.json b/src/test/resources/models/advancedCommerceSubscriptionModifyPeriodChange.json
new file mode 100644
index 00000000..b46ebb58
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceSubscriptionModifyPeriodChange.json
@@ -0,0 +1,4 @@
+{
+ "effective": "IMMEDIATELY",
+ "period": "P3M"
+}
diff --git a/src/test/resources/models/advancedCommerceSubscriptionModifyRemoveItem.json b/src/test/resources/models/advancedCommerceSubscriptionModifyRemoveItem.json
new file mode 100644
index 00000000..c9767fb0
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceSubscriptionModifyRemoveItem.json
@@ -0,0 +1,3 @@
+{
+ "SKU": "sku"
+}
diff --git a/src/test/resources/models/advancedCommerceSubscriptionPriceChangeItem.json b/src/test/resources/models/advancedCommerceSubscriptionPriceChangeItem.json
new file mode 100644
index 00000000..8a4b90f0
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceSubscriptionPriceChangeItem.json
@@ -0,0 +1,5 @@
+{
+ "SKU": "sku",
+ "price": 16000,
+ "dependentSKUs": ["dependentSKU"]
+}
diff --git a/src/test/resources/models/advancedCommerceSubscriptionPriceChangeRequest.json b/src/test/resources/models/advancedCommerceSubscriptionPriceChangeRequest.json
new file mode 100644
index 00000000..fba8aded
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceSubscriptionPriceChangeRequest.json
@@ -0,0 +1,12 @@
+{
+ "requestInfo": {
+ "requestReferenceId": "550e8400-e29b-41d4-a716-446655440005"
+ },
+ "items": [
+ {
+ "SKU": "sku123",
+ "price": 15000
+ }
+ ],
+ "currency": "USD"
+}
diff --git a/src/test/resources/models/advancedCommerceSubscriptionPriceChangeResponse.json b/src/test/resources/models/advancedCommerceSubscriptionPriceChangeResponse.json
new file mode 100644
index 00000000..6f14b309
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceSubscriptionPriceChangeResponse.json
@@ -0,0 +1,4 @@
+{
+ "signedRenewalInfo": "signed_renewal_info",
+ "signedTransactionInfo": "signed_transaction_info"
+}
diff --git a/src/test/resources/models/advancedCommerceSubscriptionReactivateInAppRequest.json b/src/test/resources/models/advancedCommerceSubscriptionReactivateInAppRequest.json
new file mode 100644
index 00000000..408a99b3
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceSubscriptionReactivateInAppRequest.json
@@ -0,0 +1,11 @@
+{
+ "requestInfo": {
+ "requestReferenceId": "550e8400-e29b-41d4-a716-446655440008"
+ },
+ "transactionId": "transactionId",
+ "items": [
+ {
+ "SKU": "sku"
+ }
+ ]
+}
diff --git a/src/test/resources/models/advancedCommerceSubscriptionReactivateItem.json b/src/test/resources/models/advancedCommerceSubscriptionReactivateItem.json
new file mode 100644
index 00000000..c9767fb0
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceSubscriptionReactivateItem.json
@@ -0,0 +1,3 @@
+{
+ "SKU": "sku"
+}
diff --git a/src/test/resources/models/advancedCommerceSubscriptionRevokeRequest.json b/src/test/resources/models/advancedCommerceSubscriptionRevokeRequest.json
new file mode 100644
index 00000000..d723be45
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceSubscriptionRevokeRequest.json
@@ -0,0 +1,9 @@
+{
+ "requestInfo": {
+ "requestReferenceId": "550e8400-e29b-41d4-a716-446655440004"
+ },
+ "refundRiskingPreference": true,
+ "refundReason": "LEGAL",
+ "refundType": "FULL",
+ "storefront": "USA"
+}
diff --git a/src/test/resources/models/advancedCommerceSubscriptionRevokeResponse.json b/src/test/resources/models/advancedCommerceSubscriptionRevokeResponse.json
new file mode 100644
index 00000000..6f14b309
--- /dev/null
+++ b/src/test/resources/models/advancedCommerceSubscriptionRevokeResponse.json
@@ -0,0 +1,4 @@
+{
+ "signedRenewalInfo": "signed_renewal_info",
+ "signedTransactionInfo": "signed_transaction_info"
+}