diff --git a/java-recaptchaenterprise/README.md b/java-recaptchaenterprise/README.md
index e5198229f0ad..143bb14995e2 100644
--- a/java-recaptchaenterprise/README.md
+++ b/java-recaptchaenterprise/README.md
@@ -50,7 +50,7 @@ The client application making API calls must be granted [authorization scopes][a
 You will need a [Google Cloud Platform Console][developer-console] project with the reCAPTCHA Enterprise [API enabled][enable-api].
 
 [Follow these instructions][create-project] to get your project set up. You will also need to set up the local development environment by
-[installing the Google Cloud SDK][cloud-sdk] and running the following commands in command line:
+[installing the Google Cloud Command Line Interface][cloud-cli] and running the following commands in command line:
 `gcloud auth login` and `gcloud config set project [YOUR PROJECT ID]`.
 
 ### Installation and setup
@@ -171,14 +171,14 @@ Java is a registered trademark of Oracle and/or its affiliates.
 [kokoro-badge-link-5]: http://storage.googleapis.com/cloud-devrel-public/java/badges/google-cloud-java/java11.html
 [stability-image]: https://img.shields.io/badge/stability-stable-green
 [maven-version-image]: https://img.shields.io/maven-central/v/com.google.cloud/google-cloud-recaptchaenterprise.svg
-[maven-version-link]: https://search.maven.org/search?q=g:com.google.cloud%20AND%20a:google-cloud-recaptchaenterprise&core=gav
+[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-recaptchaenterprise/3.9.0
 [authentication]: https://github.com/googleapis/google-cloud-java#authentication
 [auth-scopes]: https://developers.google.com/identity/protocols/oauth2/scopes
 [predefined-iam-roles]: https://cloud.google.com/iam/docs/understanding-roles#predefined_roles
 [iam-policy]: https://cloud.google.com/iam/docs/overview#cloud-iam-policy
 [developer-console]: https://console.developers.google.com/
 [create-project]: https://cloud.google.com/resource-manager/docs/creating-managing-projects
-[cloud-sdk]: https://cloud.google.com/sdk/
+[cloud-cli]: https://cloud.google.com/cli
 [troubleshooting]: https://github.com/googleapis/google-cloud-common/blob/main/troubleshooting/readme.md#troubleshooting
 [contributing]: https://github.com/googleapis/google-cloud-java/blob/main/CONTRIBUTING.md
 [code-of-conduct]: https://github.com/googleapis/google-cloud-java/blob/main/CODE_OF_CONDUCT.md#contributor-code-of-conduct
diff --git a/java-recaptchaenterprise/google-cloud-recaptchaenterprise/src/main/java/com/google/cloud/recaptchaenterprise/v1beta1/RecaptchaEnterpriseServiceV1Beta1Client.java b/java-recaptchaenterprise/google-cloud-recaptchaenterprise/src/main/java/com/google/cloud/recaptchaenterprise/v1beta1/RecaptchaEnterpriseServiceV1Beta1Client.java
index 106bc47d9818..0586b923fd6c 100644
--- a/java-recaptchaenterprise/google-cloud-recaptchaenterprise/src/main/java/com/google/cloud/recaptchaenterprise/v1beta1/RecaptchaEnterpriseServiceV1Beta1Client.java
+++ b/java-recaptchaenterprise/google-cloud-recaptchaenterprise/src/main/java/com/google/cloud/recaptchaenterprise/v1beta1/RecaptchaEnterpriseServiceV1Beta1Client.java
@@ -407,6 +407,7 @@ public final AnnotateAssessmentResponse annotateAssessment(
    *           .setName(AssessmentName.of("[PROJECT]", "[ASSESSMENT]").toString())
    *           .addAllReasons(new ArrayList<AnnotateAssessmentRequest.Reason>())
    *           .setHashedAccountId(ByteString.EMPTY)
+   *           .setTransactionEvent(TransactionEvent.newBuilder().build())
    *           .build();
    *   AnnotateAssessmentResponse response =
    *       recaptchaEnterpriseServiceV1Beta1Client.annotateAssessment(request);
@@ -440,6 +441,7 @@ public final AnnotateAssessmentResponse annotateAssessment(AnnotateAssessmentReq
    *           .setName(AssessmentName.of("[PROJECT]", "[ASSESSMENT]").toString())
    *           .addAllReasons(new ArrayList<AnnotateAssessmentRequest.Reason>())
    *           .setHashedAccountId(ByteString.EMPTY)
+   *           .setTransactionEvent(TransactionEvent.newBuilder().build())
    *           .build();
    *   ApiFuture<AnnotateAssessmentResponse> future =
    *       recaptchaEnterpriseServiceV1Beta1Client.annotateAssessmentCallable().futureCall(request);
diff --git a/java-recaptchaenterprise/google-cloud-recaptchaenterprise/src/test/java/com/google/cloud/recaptchaenterprise/v1beta1/RecaptchaEnterpriseServiceV1Beta1ClientHttpJsonTest.java b/java-recaptchaenterprise/google-cloud-recaptchaenterprise/src/test/java/com/google/cloud/recaptchaenterprise/v1beta1/RecaptchaEnterpriseServiceV1Beta1ClientHttpJsonTest.java
index 4244a4798797..f39ada20baff 100644
--- a/java-recaptchaenterprise/google-cloud-recaptchaenterprise/src/test/java/com/google/cloud/recaptchaenterprise/v1beta1/RecaptchaEnterpriseServiceV1Beta1ClientHttpJsonTest.java
+++ b/java-recaptchaenterprise/google-cloud-recaptchaenterprise/src/test/java/com/google/cloud/recaptchaenterprise/v1beta1/RecaptchaEnterpriseServiceV1Beta1ClientHttpJsonTest.java
@@ -32,6 +32,7 @@
 import com.google.recaptchaenterprise.v1beta1.Assessment;
 import com.google.recaptchaenterprise.v1beta1.AssessmentName;
 import com.google.recaptchaenterprise.v1beta1.Event;
+import com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment;
 import com.google.recaptchaenterprise.v1beta1.PasswordLeakVerification;
 import com.google.recaptchaenterprise.v1beta1.ProjectName;
 import com.google.recaptchaenterprise.v1beta1.TokenProperties;
@@ -92,6 +93,7 @@ public void createAssessmentTest() throws Exception {
             .addAllReasons(new ArrayList<Assessment.ClassificationReason>())
             .setPasswordLeakVerification(PasswordLeakVerification.newBuilder().build())
             .setAccountDefenderAssessment(AccountDefenderAssessment.newBuilder().build())
+            .setFraudPreventionAssessment(FraudPreventionAssessment.newBuilder().build())
             .build();
     mockService.addResponse(expectedResponse);
 
@@ -144,6 +146,7 @@ public void createAssessmentTest2() throws Exception {
             .addAllReasons(new ArrayList<Assessment.ClassificationReason>())
             .setPasswordLeakVerification(PasswordLeakVerification.newBuilder().build())
             .setAccountDefenderAssessment(AccountDefenderAssessment.newBuilder().build())
+            .setFraudPreventionAssessment(FraudPreventionAssessment.newBuilder().build())
             .build();
     mockService.addResponse(expectedResponse);
 
diff --git a/java-recaptchaenterprise/google-cloud-recaptchaenterprise/src/test/java/com/google/cloud/recaptchaenterprise/v1beta1/RecaptchaEnterpriseServiceV1Beta1ClientTest.java b/java-recaptchaenterprise/google-cloud-recaptchaenterprise/src/test/java/com/google/cloud/recaptchaenterprise/v1beta1/RecaptchaEnterpriseServiceV1Beta1ClientTest.java
index a51285cfbc27..2ab0b01ad342 100644
--- a/java-recaptchaenterprise/google-cloud-recaptchaenterprise/src/test/java/com/google/cloud/recaptchaenterprise/v1beta1/RecaptchaEnterpriseServiceV1Beta1ClientTest.java
+++ b/java-recaptchaenterprise/google-cloud-recaptchaenterprise/src/test/java/com/google/cloud/recaptchaenterprise/v1beta1/RecaptchaEnterpriseServiceV1Beta1ClientTest.java
@@ -31,6 +31,7 @@
 import com.google.recaptchaenterprise.v1beta1.AssessmentName;
 import com.google.recaptchaenterprise.v1beta1.CreateAssessmentRequest;
 import com.google.recaptchaenterprise.v1beta1.Event;
+import com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment;
 import com.google.recaptchaenterprise.v1beta1.PasswordLeakVerification;
 import com.google.recaptchaenterprise.v1beta1.ProjectName;
 import com.google.recaptchaenterprise.v1beta1.TokenProperties;
@@ -98,6 +99,7 @@ public void createAssessmentTest() throws Exception {
             .addAllReasons(new ArrayList<Assessment.ClassificationReason>())
             .setPasswordLeakVerification(PasswordLeakVerification.newBuilder().build())
             .setAccountDefenderAssessment(AccountDefenderAssessment.newBuilder().build())
+            .setFraudPreventionAssessment(FraudPreventionAssessment.newBuilder().build())
             .build();
     mockRecaptchaEnterpriseServiceV1Beta1.addResponse(expectedResponse);
 
@@ -145,6 +147,7 @@ public void createAssessmentTest2() throws Exception {
             .addAllReasons(new ArrayList<Assessment.ClassificationReason>())
             .setPasswordLeakVerification(PasswordLeakVerification.newBuilder().build())
             .setAccountDefenderAssessment(AccountDefenderAssessment.newBuilder().build())
+            .setFraudPreventionAssessment(FraudPreventionAssessment.newBuilder().build())
             .build();
     mockRecaptchaEnterpriseServiceV1Beta1.addResponse(expectedResponse);
 
diff --git a/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/AccountDefenderAssessment.java b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/AccountDefenderAssessment.java
index 4f10f2cbe4f3..2fb9ca7f160c 100644
--- a/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/AccountDefenderAssessment.java
+++ b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/AccountDefenderAssessment.java
@@ -22,7 +22,7 @@
  *
  *
  * <pre>
- * Account Defender risk assessment.
+ * Account defender risk assessment.
  * </pre>
  *
  * Protobuf type {@code google.cloud.recaptchaenterprise.v1beta1.AccountDefenderAssessment}
@@ -71,7 +71,7 @@ public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
    *
    *
    * <pre>
-   * Labels returned by Account Defender for this request.
+   * Labels returned by account defender for this request.
    * </pre>
    *
    * Protobuf enum {@code
@@ -584,7 +584,7 @@ protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.Build
    *
    *
    * <pre>
-   * Account Defender risk assessment.
+   * Account defender risk assessment.
    * </pre>
    *
    * Protobuf type {@code google.cloud.recaptchaenterprise.v1beta1.AccountDefenderAssessment}
diff --git a/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/AnnotateAssessmentRequest.java b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/AnnotateAssessmentRequest.java
index b7036f9a6b6b..6fd5cc865197 100644
--- a/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/AnnotateAssessmentRequest.java
+++ b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/AnnotateAssessmentRequest.java
@@ -308,8 +308,8 @@ public enum Reason implements com.google.protobuf.ProtocolMessageEnum {
      *
      *
      * <pre>
-     * Indicates a chargeback issued for the transaction with no other details.
-     * When possible, specify the type by using CHARGEBACK_FRAUD or
+     * Indicates that the transaction had a chargeback issued with no other
+     * details. When possible, specify the type by using CHARGEBACK_FRAUD or
      * CHARGEBACK_DISPUTE instead.
      * </pre>
      *
@@ -320,9 +320,9 @@ public enum Reason implements com.google.protobuf.ProtocolMessageEnum {
      *
      *
      * <pre>
-     * Indicates a chargeback related to an alleged unauthorized transaction
-     * from the cardholder's perspective (for example, the card number was
-     * stolen).
+     * Indicates that the transaction had a chargeback issued related to an
+     * alleged unauthorized transaction from the cardholder's perspective (for
+     * example, the card number was stolen).
      * </pre>
      *
      * <code>CHARGEBACK_FRAUD = 8;</code>
@@ -332,14 +332,59 @@ public enum Reason implements com.google.protobuf.ProtocolMessageEnum {
      *
      *
      * <pre>
-     * Indicates a chargeback related to the cardholder having provided their
-     * card details but allegedly not being satisfied with the purchase
-     * (for example, misrepresentation, attempted cancellation).
+     * Indicates that the transaction had a chargeback issued related to the
+     * cardholder having provided their card details but allegedly not being
+     * satisfied with the purchase (for example, misrepresentation, attempted
+     * cancellation).
      * </pre>
      *
      * <code>CHARGEBACK_DISPUTE = 9;</code>
      */
     CHARGEBACK_DISPUTE(9),
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the completed payment transaction was refunded by the
+     * seller.
+     * </pre>
+     *
+     * <code>REFUND = 10;</code>
+     */
+    REFUND(10),
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the completed payment transaction was determined to be
+     * fraudulent by the seller, and was cancelled and refunded as a result.
+     * </pre>
+     *
+     * <code>REFUND_FRAUD = 11;</code>
+     */
+    REFUND_FRAUD(11),
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the payment transaction was accepted, and the user was
+     * charged.
+     * </pre>
+     *
+     * <code>TRANSACTION_ACCEPTED = 12;</code>
+     */
+    TRANSACTION_ACCEPTED(12),
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the payment transaction was declined, for example due to
+     * invalid card details.
+     * </pre>
+     *
+     * <code>TRANSACTION_DECLINED = 13;</code>
+     */
+    TRANSACTION_DECLINED(13),
     /**
      *
      *
@@ -405,6 +450,17 @@ public enum Reason implements com.google.protobuf.ProtocolMessageEnum {
      * <code>INCORRECT_PASSWORD = 6;</code>
      */
     INCORRECT_PASSWORD(6),
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the user sent unwanted and abusive messages to other users
+     * of the platform, such as spam, scams, phishing, or social engineering.
+     * </pre>
+     *
+     * <code>SOCIAL_SPAM = 14;</code>
+     */
+    SOCIAL_SPAM(14),
     UNRECOGNIZED(-1),
     ;
 
@@ -422,8 +478,8 @@ public enum Reason implements com.google.protobuf.ProtocolMessageEnum {
      *
      *
      * <pre>
-     * Indicates a chargeback issued for the transaction with no other details.
-     * When possible, specify the type by using CHARGEBACK_FRAUD or
+     * Indicates that the transaction had a chargeback issued with no other
+     * details. When possible, specify the type by using CHARGEBACK_FRAUD or
      * CHARGEBACK_DISPUTE instead.
      * </pre>
      *
@@ -434,9 +490,9 @@ public enum Reason implements com.google.protobuf.ProtocolMessageEnum {
      *
      *
      * <pre>
-     * Indicates a chargeback related to an alleged unauthorized transaction
-     * from the cardholder's perspective (for example, the card number was
-     * stolen).
+     * Indicates that the transaction had a chargeback issued related to an
+     * alleged unauthorized transaction from the cardholder's perspective (for
+     * example, the card number was stolen).
      * </pre>
      *
      * <code>CHARGEBACK_FRAUD = 8;</code>
@@ -446,14 +502,59 @@ public enum Reason implements com.google.protobuf.ProtocolMessageEnum {
      *
      *
      * <pre>
-     * Indicates a chargeback related to the cardholder having provided their
-     * card details but allegedly not being satisfied with the purchase
-     * (for example, misrepresentation, attempted cancellation).
+     * Indicates that the transaction had a chargeback issued related to the
+     * cardholder having provided their card details but allegedly not being
+     * satisfied with the purchase (for example, misrepresentation, attempted
+     * cancellation).
      * </pre>
      *
      * <code>CHARGEBACK_DISPUTE = 9;</code>
      */
     public static final int CHARGEBACK_DISPUTE_VALUE = 9;
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the completed payment transaction was refunded by the
+     * seller.
+     * </pre>
+     *
+     * <code>REFUND = 10;</code>
+     */
+    public static final int REFUND_VALUE = 10;
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the completed payment transaction was determined to be
+     * fraudulent by the seller, and was cancelled and refunded as a result.
+     * </pre>
+     *
+     * <code>REFUND_FRAUD = 11;</code>
+     */
+    public static final int REFUND_FRAUD_VALUE = 11;
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the payment transaction was accepted, and the user was
+     * charged.
+     * </pre>
+     *
+     * <code>TRANSACTION_ACCEPTED = 12;</code>
+     */
+    public static final int TRANSACTION_ACCEPTED_VALUE = 12;
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the payment transaction was declined, for example due to
+     * invalid card details.
+     * </pre>
+     *
+     * <code>TRANSACTION_DECLINED = 13;</code>
+     */
+    public static final int TRANSACTION_DECLINED_VALUE = 13;
     /**
      *
      *
@@ -519,6 +620,17 @@ public enum Reason implements com.google.protobuf.ProtocolMessageEnum {
      * <code>INCORRECT_PASSWORD = 6;</code>
      */
     public static final int INCORRECT_PASSWORD_VALUE = 6;
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the user sent unwanted and abusive messages to other users
+     * of the platform, such as spam, scams, phishing, or social engineering.
+     * </pre>
+     *
+     * <code>SOCIAL_SPAM = 14;</code>
+     */
+    public static final int SOCIAL_SPAM_VALUE = 14;
 
     public final int getNumber() {
       if (this == UNRECOGNIZED) {
@@ -552,6 +664,14 @@ public static Reason forNumber(int value) {
           return CHARGEBACK_FRAUD;
         case 9:
           return CHARGEBACK_DISPUTE;
+        case 10:
+          return REFUND;
+        case 11:
+          return REFUND_FRAUD;
+        case 12:
+          return TRANSACTION_ACCEPTED;
+        case 13:
+          return TRANSACTION_DECLINED;
         case 2:
           return PAYMENT_HEURISTICS;
         case 7:
@@ -564,6 +684,8 @@ public static Reason forNumber(int value) {
           return CORRECT_PASSWORD;
         case 6:
           return INCORRECT_PASSWORD;
+        case 14:
+          return SOCIAL_SPAM;
         default:
           return null;
       }
@@ -682,9 +804,9 @@ public com.google.protobuf.ByteString getNameBytes() {
    *
    *
    * <pre>
-   * Optional. The annotation that will be assigned to the Event. This field can be left
-   * empty to provide reasons that apply to an event without concluding whether
-   * the event is legitimate or fraudulent.
+   * Optional. The annotation that will be assigned to the Event. This field can
+   * be left empty to provide reasons that apply to an event without concluding
+   * whether the event is legitimate or fraudulent.
    * </pre>
    *
    * <code>
@@ -701,9 +823,9 @@ public int getAnnotationValue() {
    *
    *
    * <pre>
-   * Optional. The annotation that will be assigned to the Event. This field can be left
-   * empty to provide reasons that apply to an event without concluding whether
-   * the event is legitimate or fraudulent.
+   * Optional. The annotation that will be assigned to the Event. This field can
+   * be left empty to provide reasons that apply to an event without concluding
+   * whether the event is legitimate or fraudulent.
    * </pre>
    *
    * <code>
@@ -750,7 +872,8 @@ public com.google.recaptchaenterprise.v1beta1.AnnotateAssessmentRequest.Reason c
    *
    *
    * <pre>
-   * Optional. Optional reasons for the annotation that will be assigned to the Event.
+   * Optional. Optional reasons for the annotation that will be assigned to the
+   * Event.
    * </pre>
    *
    * <code>
@@ -770,7 +893,8 @@ public com.google.recaptchaenterprise.v1beta1.AnnotateAssessmentRequest.Reason c
    *
    *
    * <pre>
-   * Optional. Optional reasons for the annotation that will be assigned to the Event.
+   * Optional. Optional reasons for the annotation that will be assigned to the
+   * Event.
    * </pre>
    *
    * <code>
@@ -787,7 +911,8 @@ public int getReasonsCount() {
    *
    *
    * <pre>
-   * Optional. Optional reasons for the annotation that will be assigned to the Event.
+   * Optional. Optional reasons for the annotation that will be assigned to the
+   * Event.
    * </pre>
    *
    * <code>
@@ -806,7 +931,8 @@ public com.google.recaptchaenterprise.v1beta1.AnnotateAssessmentRequest.Reason g
    *
    *
    * <pre>
-   * Optional. Optional reasons for the annotation that will be assigned to the Event.
+   * Optional. Optional reasons for the annotation that will be assigned to the
+   * Event.
    * </pre>
    *
    * <code>
@@ -823,7 +949,8 @@ public java.util.List<java.lang.Integer> getReasonsValueList() {
    *
    *
    * <pre>
-   * Optional. Optional reasons for the annotation that will be assigned to the Event.
+   * Optional. Optional reasons for the annotation that will be assigned to the
+   * Event.
    * </pre>
    *
    * <code>
@@ -846,8 +973,8 @@ public int getReasonsValue(int index) {
    *
    *
    * <pre>
-   * Optional. Optional unique stable hashed user identifier to apply to the assessment.
-   * This is an alternative to setting the hashed_account_id in
+   * Optional. Optional unique stable hashed user identifier to apply to the
+   * assessment. This is an alternative to setting the hashed_account_id in
    * CreateAssessment, for example when the account identifier is not yet known
    * in the initial request. It is recommended that the identifier is hashed
    * using hmac-sha256 with stable secret.
@@ -862,6 +989,66 @@ public com.google.protobuf.ByteString getHashedAccountId() {
     return hashedAccountId_;
   }
 
+  public static final int TRANSACTION_EVENT_FIELD_NUMBER = 5;
+  private com.google.recaptchaenterprise.v1beta1.TransactionEvent transactionEvent_;
+  /**
+   *
+   *
+   * <pre>
+   * Optional. If the assessment is part of a payment transaction, provide
+   * details on payment lifecycle events that occur in the transaction.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.TransactionEvent transaction_event = 5 [(.google.api.field_behavior) = OPTIONAL];
+   * </code>
+   *
+   * @return Whether the transactionEvent field is set.
+   */
+  @java.lang.Override
+  public boolean hasTransactionEvent() {
+    return transactionEvent_ != null;
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Optional. If the assessment is part of a payment transaction, provide
+   * details on payment lifecycle events that occur in the transaction.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.TransactionEvent transaction_event = 5 [(.google.api.field_behavior) = OPTIONAL];
+   * </code>
+   *
+   * @return The transactionEvent.
+   */
+  @java.lang.Override
+  public com.google.recaptchaenterprise.v1beta1.TransactionEvent getTransactionEvent() {
+    return transactionEvent_ == null
+        ? com.google.recaptchaenterprise.v1beta1.TransactionEvent.getDefaultInstance()
+        : transactionEvent_;
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Optional. If the assessment is part of a payment transaction, provide
+   * details on payment lifecycle events that occur in the transaction.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.TransactionEvent transaction_event = 5 [(.google.api.field_behavior) = OPTIONAL];
+   * </code>
+   */
+  @java.lang.Override
+  public com.google.recaptchaenterprise.v1beta1.TransactionEventOrBuilder
+      getTransactionEventOrBuilder() {
+    return transactionEvent_ == null
+        ? com.google.recaptchaenterprise.v1beta1.TransactionEvent.getDefaultInstance()
+        : transactionEvent_;
+  }
+
   private byte memoizedIsInitialized = -1;
 
   @java.lang.Override
@@ -896,6 +1083,9 @@ public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io
     if (!hashedAccountId_.isEmpty()) {
       output.writeBytes(4, hashedAccountId_);
     }
+    if (transactionEvent_ != null) {
+      output.writeMessage(5, getTransactionEvent());
+    }
     getUnknownFields().writeTo(output);
   }
 
@@ -929,6 +1119,9 @@ public int getSerializedSize() {
     if (!hashedAccountId_.isEmpty()) {
       size += com.google.protobuf.CodedOutputStream.computeBytesSize(4, hashedAccountId_);
     }
+    if (transactionEvent_ != null) {
+      size += com.google.protobuf.CodedOutputStream.computeMessageSize(5, getTransactionEvent());
+    }
     size += getUnknownFields().getSerializedSize();
     memoizedSize = size;
     return size;
@@ -949,6 +1142,10 @@ public boolean equals(final java.lang.Object obj) {
     if (annotation_ != other.annotation_) return false;
     if (!reasons_.equals(other.reasons_)) return false;
     if (!getHashedAccountId().equals(other.getHashedAccountId())) return false;
+    if (hasTransactionEvent() != other.hasTransactionEvent()) return false;
+    if (hasTransactionEvent()) {
+      if (!getTransactionEvent().equals(other.getTransactionEvent())) return false;
+    }
     if (!getUnknownFields().equals(other.getUnknownFields())) return false;
     return true;
   }
@@ -970,6 +1167,10 @@ public int hashCode() {
     }
     hash = (37 * hash) + HASHED_ACCOUNT_ID_FIELD_NUMBER;
     hash = (53 * hash) + getHashedAccountId().hashCode();
+    if (hasTransactionEvent()) {
+      hash = (37 * hash) + TRANSACTION_EVENT_FIELD_NUMBER;
+      hash = (53 * hash) + getTransactionEvent().hashCode();
+    }
     hash = (29 * hash) + getUnknownFields().hashCode();
     memoizedHashCode = hash;
     return hash;
@@ -1115,6 +1316,11 @@ public Builder clear() {
       reasons_ = java.util.Collections.emptyList();
       bitField0_ = (bitField0_ & ~0x00000004);
       hashedAccountId_ = com.google.protobuf.ByteString.EMPTY;
+      transactionEvent_ = null;
+      if (transactionEventBuilder_ != null) {
+        transactionEventBuilder_.dispose();
+        transactionEventBuilder_ = null;
+      }
       return this;
     }
 
@@ -1172,6 +1378,10 @@ private void buildPartial0(
       if (((from_bitField0_ & 0x00000008) != 0)) {
         result.hashedAccountId_ = hashedAccountId_;
       }
+      if (((from_bitField0_ & 0x00000010) != 0)) {
+        result.transactionEvent_ =
+            transactionEventBuilder_ == null ? transactionEvent_ : transactionEventBuilder_.build();
+      }
     }
 
     @java.lang.Override
@@ -1243,6 +1453,9 @@ public Builder mergeFrom(
       if (other.getHashedAccountId() != com.google.protobuf.ByteString.EMPTY) {
         setHashedAccountId(other.getHashedAccountId());
       }
+      if (other.hasTransactionEvent()) {
+        mergeTransactionEvent(other.getTransactionEvent());
+      }
       this.mergeUnknownFields(other.getUnknownFields());
       onChanged();
       return this;
@@ -1306,6 +1519,13 @@ public Builder mergeFrom(
                 bitField0_ |= 0x00000008;
                 break;
               } // case 34
+            case 42:
+              {
+                input.readMessage(
+                    getTransactionEventFieldBuilder().getBuilder(), extensionRegistry);
+                bitField0_ |= 0x00000010;
+                break;
+              } // case 42
             default:
               {
                 if (!super.parseUnknownField(input, extensionRegistry, tag)) {
@@ -1451,9 +1671,9 @@ public Builder setNameBytes(com.google.protobuf.ByteString value) {
      *
      *
      * <pre>
-     * Optional. The annotation that will be assigned to the Event. This field can be left
-     * empty to provide reasons that apply to an event without concluding whether
-     * the event is legitimate or fraudulent.
+     * Optional. The annotation that will be assigned to the Event. This field can
+     * be left empty to provide reasons that apply to an event without concluding
+     * whether the event is legitimate or fraudulent.
      * </pre>
      *
      * <code>
@@ -1470,9 +1690,9 @@ public int getAnnotationValue() {
      *
      *
      * <pre>
-     * Optional. The annotation that will be assigned to the Event. This field can be left
-     * empty to provide reasons that apply to an event without concluding whether
-     * the event is legitimate or fraudulent.
+     * Optional. The annotation that will be assigned to the Event. This field can
+     * be left empty to provide reasons that apply to an event without concluding
+     * whether the event is legitimate or fraudulent.
      * </pre>
      *
      * <code>
@@ -1492,9 +1712,9 @@ public Builder setAnnotationValue(int value) {
      *
      *
      * <pre>
-     * Optional. The annotation that will be assigned to the Event. This field can be left
-     * empty to provide reasons that apply to an event without concluding whether
-     * the event is legitimate or fraudulent.
+     * Optional. The annotation that will be assigned to the Event. This field can
+     * be left empty to provide reasons that apply to an event without concluding
+     * whether the event is legitimate or fraudulent.
      * </pre>
      *
      * <code>
@@ -1517,9 +1737,9 @@ public Builder setAnnotationValue(int value) {
      *
      *
      * <pre>
-     * Optional. The annotation that will be assigned to the Event. This field can be left
-     * empty to provide reasons that apply to an event without concluding whether
-     * the event is legitimate or fraudulent.
+     * Optional. The annotation that will be assigned to the Event. This field can
+     * be left empty to provide reasons that apply to an event without concluding
+     * whether the event is legitimate or fraudulent.
      * </pre>
      *
      * <code>
@@ -1543,9 +1763,9 @@ public Builder setAnnotation(
      *
      *
      * <pre>
-     * Optional. The annotation that will be assigned to the Event. This field can be left
-     * empty to provide reasons that apply to an event without concluding whether
-     * the event is legitimate or fraudulent.
+     * Optional. The annotation that will be assigned to the Event. This field can
+     * be left empty to provide reasons that apply to an event without concluding
+     * whether the event is legitimate or fraudulent.
      * </pre>
      *
      * <code>
@@ -1573,7 +1793,8 @@ private void ensureReasonsIsMutable() {
      *
      *
      * <pre>
-     * Optional. Optional reasons for the annotation that will be assigned to the Event.
+     * Optional. Optional reasons for the annotation that will be assigned to the
+     * Event.
      * </pre>
      *
      * <code>
@@ -1593,7 +1814,8 @@ private void ensureReasonsIsMutable() {
      *
      *
      * <pre>
-     * Optional. Optional reasons for the annotation that will be assigned to the Event.
+     * Optional. Optional reasons for the annotation that will be assigned to the
+     * Event.
      * </pre>
      *
      * <code>
@@ -1609,7 +1831,8 @@ public int getReasonsCount() {
      *
      *
      * <pre>
-     * Optional. Optional reasons for the annotation that will be assigned to the Event.
+     * Optional. Optional reasons for the annotation that will be assigned to the
+     * Event.
      * </pre>
      *
      * <code>
@@ -1627,7 +1850,8 @@ public com.google.recaptchaenterprise.v1beta1.AnnotateAssessmentRequest.Reason g
      *
      *
      * <pre>
-     * Optional. Optional reasons for the annotation that will be assigned to the Event.
+     * Optional. Optional reasons for the annotation that will be assigned to the
+     * Event.
      * </pre>
      *
      * <code>
@@ -1652,7 +1876,8 @@ public Builder setReasons(
      *
      *
      * <pre>
-     * Optional. Optional reasons for the annotation that will be assigned to the Event.
+     * Optional. Optional reasons for the annotation that will be assigned to the
+     * Event.
      * </pre>
      *
      * <code>
@@ -1676,7 +1901,8 @@ public Builder addReasons(
      *
      *
      * <pre>
-     * Optional. Optional reasons for the annotation that will be assigned to the Event.
+     * Optional. Optional reasons for the annotation that will be assigned to the
+     * Event.
      * </pre>
      *
      * <code>
@@ -1701,7 +1927,8 @@ public Builder addAllReasons(
      *
      *
      * <pre>
-     * Optional. Optional reasons for the annotation that will be assigned to the Event.
+     * Optional. Optional reasons for the annotation that will be assigned to the
+     * Event.
      * </pre>
      *
      * <code>
@@ -1720,7 +1947,8 @@ public Builder clearReasons() {
      *
      *
      * <pre>
-     * Optional. Optional reasons for the annotation that will be assigned to the Event.
+     * Optional. Optional reasons for the annotation that will be assigned to the
+     * Event.
      * </pre>
      *
      * <code>
@@ -1736,7 +1964,8 @@ public java.util.List<java.lang.Integer> getReasonsValueList() {
      *
      *
      * <pre>
-     * Optional. Optional reasons for the annotation that will be assigned to the Event.
+     * Optional. Optional reasons for the annotation that will be assigned to the
+     * Event.
      * </pre>
      *
      * <code>
@@ -1753,7 +1982,8 @@ public int getReasonsValue(int index) {
      *
      *
      * <pre>
-     * Optional. Optional reasons for the annotation that will be assigned to the Event.
+     * Optional. Optional reasons for the annotation that will be assigned to the
+     * Event.
      * </pre>
      *
      * <code>
@@ -1774,7 +2004,8 @@ public Builder setReasonsValue(int index, int value) {
      *
      *
      * <pre>
-     * Optional. Optional reasons for the annotation that will be assigned to the Event.
+     * Optional. Optional reasons for the annotation that will be assigned to the
+     * Event.
      * </pre>
      *
      * <code>
@@ -1794,7 +2025,8 @@ public Builder addReasonsValue(int value) {
      *
      *
      * <pre>
-     * Optional. Optional reasons for the annotation that will be assigned to the Event.
+     * Optional. Optional reasons for the annotation that will be assigned to the
+     * Event.
      * </pre>
      *
      * <code>
@@ -1818,8 +2050,8 @@ public Builder addAllReasonsValue(java.lang.Iterable<java.lang.Integer> values)
      *
      *
      * <pre>
-     * Optional. Optional unique stable hashed user identifier to apply to the assessment.
-     * This is an alternative to setting the hashed_account_id in
+     * Optional. Optional unique stable hashed user identifier to apply to the
+     * assessment. This is an alternative to setting the hashed_account_id in
      * CreateAssessment, for example when the account identifier is not yet known
      * in the initial request. It is recommended that the identifier is hashed
      * using hmac-sha256 with stable secret.
@@ -1837,8 +2069,8 @@ public com.google.protobuf.ByteString getHashedAccountId() {
      *
      *
      * <pre>
-     * Optional. Optional unique stable hashed user identifier to apply to the assessment.
-     * This is an alternative to setting the hashed_account_id in
+     * Optional. Optional unique stable hashed user identifier to apply to the
+     * assessment. This is an alternative to setting the hashed_account_id in
      * CreateAssessment, for example when the account identifier is not yet known
      * in the initial request. It is recommended that the identifier is hashed
      * using hmac-sha256 with stable secret.
@@ -1862,8 +2094,8 @@ public Builder setHashedAccountId(com.google.protobuf.ByteString value) {
      *
      *
      * <pre>
-     * Optional. Optional unique stable hashed user identifier to apply to the assessment.
-     * This is an alternative to setting the hashed_account_id in
+     * Optional. Optional unique stable hashed user identifier to apply to the
+     * assessment. This is an alternative to setting the hashed_account_id in
      * CreateAssessment, for example when the account identifier is not yet known
      * in the initial request. It is recommended that the identifier is hashed
      * using hmac-sha256 with stable secret.
@@ -1880,6 +2112,222 @@ public Builder clearHashedAccountId() {
       return this;
     }
 
+    private com.google.recaptchaenterprise.v1beta1.TransactionEvent transactionEvent_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+            com.google.recaptchaenterprise.v1beta1.TransactionEvent,
+            com.google.recaptchaenterprise.v1beta1.TransactionEvent.Builder,
+            com.google.recaptchaenterprise.v1beta1.TransactionEventOrBuilder>
+        transactionEventBuilder_;
+    /**
+     *
+     *
+     * <pre>
+     * Optional. If the assessment is part of a payment transaction, provide
+     * details on payment lifecycle events that occur in the transaction.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.TransactionEvent transaction_event = 5 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     *
+     * @return Whether the transactionEvent field is set.
+     */
+    public boolean hasTransactionEvent() {
+      return ((bitField0_ & 0x00000010) != 0);
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. If the assessment is part of a payment transaction, provide
+     * details on payment lifecycle events that occur in the transaction.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.TransactionEvent transaction_event = 5 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     *
+     * @return The transactionEvent.
+     */
+    public com.google.recaptchaenterprise.v1beta1.TransactionEvent getTransactionEvent() {
+      if (transactionEventBuilder_ == null) {
+        return transactionEvent_ == null
+            ? com.google.recaptchaenterprise.v1beta1.TransactionEvent.getDefaultInstance()
+            : transactionEvent_;
+      } else {
+        return transactionEventBuilder_.getMessage();
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. If the assessment is part of a payment transaction, provide
+     * details on payment lifecycle events that occur in the transaction.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.TransactionEvent transaction_event = 5 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     */
+    public Builder setTransactionEvent(
+        com.google.recaptchaenterprise.v1beta1.TransactionEvent value) {
+      if (transactionEventBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        transactionEvent_ = value;
+      } else {
+        transactionEventBuilder_.setMessage(value);
+      }
+      bitField0_ |= 0x00000010;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. If the assessment is part of a payment transaction, provide
+     * details on payment lifecycle events that occur in the transaction.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.TransactionEvent transaction_event = 5 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     */
+    public Builder setTransactionEvent(
+        com.google.recaptchaenterprise.v1beta1.TransactionEvent.Builder builderForValue) {
+      if (transactionEventBuilder_ == null) {
+        transactionEvent_ = builderForValue.build();
+      } else {
+        transactionEventBuilder_.setMessage(builderForValue.build());
+      }
+      bitField0_ |= 0x00000010;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. If the assessment is part of a payment transaction, provide
+     * details on payment lifecycle events that occur in the transaction.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.TransactionEvent transaction_event = 5 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     */
+    public Builder mergeTransactionEvent(
+        com.google.recaptchaenterprise.v1beta1.TransactionEvent value) {
+      if (transactionEventBuilder_ == null) {
+        if (((bitField0_ & 0x00000010) != 0)
+            && transactionEvent_ != null
+            && transactionEvent_
+                != com.google.recaptchaenterprise.v1beta1.TransactionEvent.getDefaultInstance()) {
+          getTransactionEventBuilder().mergeFrom(value);
+        } else {
+          transactionEvent_ = value;
+        }
+      } else {
+        transactionEventBuilder_.mergeFrom(value);
+      }
+      bitField0_ |= 0x00000010;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. If the assessment is part of a payment transaction, provide
+     * details on payment lifecycle events that occur in the transaction.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.TransactionEvent transaction_event = 5 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     */
+    public Builder clearTransactionEvent() {
+      bitField0_ = (bitField0_ & ~0x00000010);
+      transactionEvent_ = null;
+      if (transactionEventBuilder_ != null) {
+        transactionEventBuilder_.dispose();
+        transactionEventBuilder_ = null;
+      }
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. If the assessment is part of a payment transaction, provide
+     * details on payment lifecycle events that occur in the transaction.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.TransactionEvent transaction_event = 5 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     */
+    public com.google.recaptchaenterprise.v1beta1.TransactionEvent.Builder
+        getTransactionEventBuilder() {
+      bitField0_ |= 0x00000010;
+      onChanged();
+      return getTransactionEventFieldBuilder().getBuilder();
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. If the assessment is part of a payment transaction, provide
+     * details on payment lifecycle events that occur in the transaction.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.TransactionEvent transaction_event = 5 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     */
+    public com.google.recaptchaenterprise.v1beta1.TransactionEventOrBuilder
+        getTransactionEventOrBuilder() {
+      if (transactionEventBuilder_ != null) {
+        return transactionEventBuilder_.getMessageOrBuilder();
+      } else {
+        return transactionEvent_ == null
+            ? com.google.recaptchaenterprise.v1beta1.TransactionEvent.getDefaultInstance()
+            : transactionEvent_;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. If the assessment is part of a payment transaction, provide
+     * details on payment lifecycle events that occur in the transaction.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.TransactionEvent transaction_event = 5 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+            com.google.recaptchaenterprise.v1beta1.TransactionEvent,
+            com.google.recaptchaenterprise.v1beta1.TransactionEvent.Builder,
+            com.google.recaptchaenterprise.v1beta1.TransactionEventOrBuilder>
+        getTransactionEventFieldBuilder() {
+      if (transactionEventBuilder_ == null) {
+        transactionEventBuilder_ =
+            new com.google.protobuf.SingleFieldBuilderV3<
+                com.google.recaptchaenterprise.v1beta1.TransactionEvent,
+                com.google.recaptchaenterprise.v1beta1.TransactionEvent.Builder,
+                com.google.recaptchaenterprise.v1beta1.TransactionEventOrBuilder>(
+                getTransactionEvent(), getParentForChildren(), isClean());
+        transactionEvent_ = null;
+      }
+      return transactionEventBuilder_;
+    }
+
     @java.lang.Override
     public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) {
       return super.setUnknownFields(unknownFields);
diff --git a/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/AnnotateAssessmentRequestOrBuilder.java b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/AnnotateAssessmentRequestOrBuilder.java
index a78a76f2fb53..e9f1905ced5a 100644
--- a/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/AnnotateAssessmentRequestOrBuilder.java
+++ b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/AnnotateAssessmentRequestOrBuilder.java
@@ -58,9 +58,9 @@ public interface AnnotateAssessmentRequestOrBuilder
    *
    *
    * <pre>
-   * Optional. The annotation that will be assigned to the Event. This field can be left
-   * empty to provide reasons that apply to an event without concluding whether
-   * the event is legitimate or fraudulent.
+   * Optional. The annotation that will be assigned to the Event. This field can
+   * be left empty to provide reasons that apply to an event without concluding
+   * whether the event is legitimate or fraudulent.
    * </pre>
    *
    * <code>
@@ -74,9 +74,9 @@ public interface AnnotateAssessmentRequestOrBuilder
    *
    *
    * <pre>
-   * Optional. The annotation that will be assigned to the Event. This field can be left
-   * empty to provide reasons that apply to an event without concluding whether
-   * the event is legitimate or fraudulent.
+   * Optional. The annotation that will be assigned to the Event. This field can
+   * be left empty to provide reasons that apply to an event without concluding
+   * whether the event is legitimate or fraudulent.
    * </pre>
    *
    * <code>
@@ -91,7 +91,8 @@ public interface AnnotateAssessmentRequestOrBuilder
    *
    *
    * <pre>
-   * Optional. Optional reasons for the annotation that will be assigned to the Event.
+   * Optional. Optional reasons for the annotation that will be assigned to the
+   * Event.
    * </pre>
    *
    * <code>
@@ -106,7 +107,8 @@ public interface AnnotateAssessmentRequestOrBuilder
    *
    *
    * <pre>
-   * Optional. Optional reasons for the annotation that will be assigned to the Event.
+   * Optional. Optional reasons for the annotation that will be assigned to the
+   * Event.
    * </pre>
    *
    * <code>
@@ -120,7 +122,8 @@ public interface AnnotateAssessmentRequestOrBuilder
    *
    *
    * <pre>
-   * Optional. Optional reasons for the annotation that will be assigned to the Event.
+   * Optional. Optional reasons for the annotation that will be assigned to the
+   * Event.
    * </pre>
    *
    * <code>
@@ -135,7 +138,8 @@ public interface AnnotateAssessmentRequestOrBuilder
    *
    *
    * <pre>
-   * Optional. Optional reasons for the annotation that will be assigned to the Event.
+   * Optional. Optional reasons for the annotation that will be assigned to the
+   * Event.
    * </pre>
    *
    * <code>
@@ -149,7 +153,8 @@ public interface AnnotateAssessmentRequestOrBuilder
    *
    *
    * <pre>
-   * Optional. Optional reasons for the annotation that will be assigned to the Event.
+   * Optional. Optional reasons for the annotation that will be assigned to the
+   * Event.
    * </pre>
    *
    * <code>
@@ -165,8 +170,8 @@ public interface AnnotateAssessmentRequestOrBuilder
    *
    *
    * <pre>
-   * Optional. Optional unique stable hashed user identifier to apply to the assessment.
-   * This is an alternative to setting the hashed_account_id in
+   * Optional. Optional unique stable hashed user identifier to apply to the
+   * assessment. This is an alternative to setting the hashed_account_id in
    * CreateAssessment, for example when the account identifier is not yet known
    * in the initial request. It is recommended that the identifier is hashed
    * using hmac-sha256 with stable secret.
@@ -177,4 +182,48 @@ public interface AnnotateAssessmentRequestOrBuilder
    * @return The hashedAccountId.
    */
   com.google.protobuf.ByteString getHashedAccountId();
+
+  /**
+   *
+   *
+   * <pre>
+   * Optional. If the assessment is part of a payment transaction, provide
+   * details on payment lifecycle events that occur in the transaction.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.TransactionEvent transaction_event = 5 [(.google.api.field_behavior) = OPTIONAL];
+   * </code>
+   *
+   * @return Whether the transactionEvent field is set.
+   */
+  boolean hasTransactionEvent();
+  /**
+   *
+   *
+   * <pre>
+   * Optional. If the assessment is part of a payment transaction, provide
+   * details on payment lifecycle events that occur in the transaction.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.TransactionEvent transaction_event = 5 [(.google.api.field_behavior) = OPTIONAL];
+   * </code>
+   *
+   * @return The transactionEvent.
+   */
+  com.google.recaptchaenterprise.v1beta1.TransactionEvent getTransactionEvent();
+  /**
+   *
+   *
+   * <pre>
+   * Optional. If the assessment is part of a payment transaction, provide
+   * details on payment lifecycle events that occur in the transaction.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.TransactionEvent transaction_event = 5 [(.google.api.field_behavior) = OPTIONAL];
+   * </code>
+   */
+  com.google.recaptchaenterprise.v1beta1.TransactionEventOrBuilder getTransactionEventOrBuilder();
 }
diff --git a/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/Assessment.java b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/Assessment.java
index 54f33eab59e0..315a26afdcff 100644
--- a/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/Assessment.java
+++ b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/Assessment.java
@@ -22,7 +22,7 @@
  *
  *
  * <pre>
- * A recaptcha assessment resource.
+ * A reCAPTCHA Enterprise assessment resource.
  * </pre>
  *
  * Protobuf type {@code google.cloud.recaptchaenterprise.v1beta1.Assessment}
@@ -140,6 +140,26 @@ public enum ClassificationReason implements com.google.protobuf.ProtocolMessageE
      * <code>LOW_CONFIDENCE_SCORE = 5;</code>
      */
     LOW_CONFIDENCE_SCORE(5),
+    /**
+     *
+     *
+     * <pre>
+     * The request matches behavioral characteristics of a carding attack.
+     * </pre>
+     *
+     * <code>SUSPECTED_CARDING = 6;</code>
+     */
+    SUSPECTED_CARDING(6),
+    /**
+     *
+     *
+     * <pre>
+     * The request matches behavioral characteristics of chargebacks for fraud.
+     * </pre>
+     *
+     * <code>SUSPECTED_CHARGEBACK = 7;</code>
+     */
+    SUSPECTED_CHARGEBACK(7),
     UNRECOGNIZED(-1),
     ;
 
@@ -205,6 +225,26 @@ public enum ClassificationReason implements com.google.protobuf.ProtocolMessageE
      * <code>LOW_CONFIDENCE_SCORE = 5;</code>
      */
     public static final int LOW_CONFIDENCE_SCORE_VALUE = 5;
+    /**
+     *
+     *
+     * <pre>
+     * The request matches behavioral characteristics of a carding attack.
+     * </pre>
+     *
+     * <code>SUSPECTED_CARDING = 6;</code>
+     */
+    public static final int SUSPECTED_CARDING_VALUE = 6;
+    /**
+     *
+     *
+     * <pre>
+     * The request matches behavioral characteristics of chargebacks for fraud.
+     * </pre>
+     *
+     * <code>SUSPECTED_CHARGEBACK = 7;</code>
+     */
+    public static final int SUSPECTED_CHARGEBACK_VALUE = 7;
 
     public final int getNumber() {
       if (this == UNRECOGNIZED) {
@@ -242,6 +282,10 @@ public static ClassificationReason forNumber(int value) {
           return UNEXPECTED_USAGE_PATTERNS;
         case 5:
           return LOW_CONFIDENCE_SCORE;
+        case 6:
+          return SUSPECTED_CARDING;
+        case 7:
+          return SUSPECTED_CHARGEBACK;
         default:
           return null;
       }
@@ -670,7 +714,7 @@ public boolean hasPasswordLeakVerification() {
    *
    *
    * <pre>
-   * Assessment returned by Account Defender when a hashed_account_id is
+   * Assessment returned by account defender when a hashed_account_id is
    * provided.
    * </pre>
    *
@@ -688,7 +732,7 @@ public boolean hasAccountDefenderAssessment() {
    *
    *
    * <pre>
-   * Assessment returned by Account Defender when a hashed_account_id is
+   * Assessment returned by account defender when a hashed_account_id is
    * provided.
    * </pre>
    *
@@ -709,7 +753,7 @@ public boolean hasAccountDefenderAssessment() {
    *
    *
    * <pre>
-   * Assessment returned by Account Defender when a hashed_account_id is
+   * Assessment returned by account defender when a hashed_account_id is
    * provided.
    * </pre>
    *
@@ -725,6 +769,65 @@ public boolean hasAccountDefenderAssessment() {
         : accountDefenderAssessment_;
   }
 
+  public static final int FRAUD_PREVENTION_ASSESSMENT_FIELD_NUMBER = 11;
+  private com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+      fraudPreventionAssessment_;
+  /**
+   *
+   *
+   * <pre>
+   * Assessment returned by Fraud Prevention when TransactionData is provided.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment fraud_prevention_assessment = 11;
+   * </code>
+   *
+   * @return Whether the fraudPreventionAssessment field is set.
+   */
+  @java.lang.Override
+  public boolean hasFraudPreventionAssessment() {
+    return fraudPreventionAssessment_ != null;
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Assessment returned by Fraud Prevention when TransactionData is provided.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment fraud_prevention_assessment = 11;
+   * </code>
+   *
+   * @return The fraudPreventionAssessment.
+   */
+  @java.lang.Override
+  public com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+      getFraudPreventionAssessment() {
+    return fraudPreventionAssessment_ == null
+        ? com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.getDefaultInstance()
+        : fraudPreventionAssessment_;
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Assessment returned by Fraud Prevention when TransactionData is provided.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment fraud_prevention_assessment = 11;
+   * </code>
+   */
+  @java.lang.Override
+  public com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessmentOrBuilder
+      getFraudPreventionAssessmentOrBuilder() {
+    return fraudPreventionAssessment_ == null
+        ? com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.getDefaultInstance()
+        : fraudPreventionAssessment_;
+  }
+
   private byte memoizedIsInitialized = -1;
 
   @java.lang.Override
@@ -765,6 +868,9 @@ public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io
     if (accountDefenderAssessment_ != null) {
       output.writeMessage(8, getAccountDefenderAssessment());
     }
+    if (fraudPreventionAssessment_ != null) {
+      output.writeMessage(11, getFraudPreventionAssessment());
+    }
     getUnknownFields().writeTo(output);
   }
 
@@ -808,6 +914,11 @@ public int getSerializedSize() {
           com.google.protobuf.CodedOutputStream.computeMessageSize(
               8, getAccountDefenderAssessment());
     }
+    if (fraudPreventionAssessment_ != null) {
+      size +=
+          com.google.protobuf.CodedOutputStream.computeMessageSize(
+              11, getFraudPreventionAssessment());
+    }
     size += getUnknownFields().getSerializedSize();
     memoizedSize = size;
     return size;
@@ -845,6 +956,11 @@ public boolean equals(final java.lang.Object obj) {
       if (!getAccountDefenderAssessment().equals(other.getAccountDefenderAssessment()))
         return false;
     }
+    if (hasFraudPreventionAssessment() != other.hasFraudPreventionAssessment()) return false;
+    if (hasFraudPreventionAssessment()) {
+      if (!getFraudPreventionAssessment().equals(other.getFraudPreventionAssessment()))
+        return false;
+    }
     if (!getUnknownFields().equals(other.getUnknownFields())) return false;
     return true;
   }
@@ -880,6 +996,10 @@ public int hashCode() {
       hash = (37 * hash) + ACCOUNT_DEFENDER_ASSESSMENT_FIELD_NUMBER;
       hash = (53 * hash) + getAccountDefenderAssessment().hashCode();
     }
+    if (hasFraudPreventionAssessment()) {
+      hash = (37 * hash) + FRAUD_PREVENTION_ASSESSMENT_FIELD_NUMBER;
+      hash = (53 * hash) + getFraudPreventionAssessment().hashCode();
+    }
     hash = (29 * hash) + getUnknownFields().hashCode();
     memoizedHashCode = hash;
     return hash;
@@ -984,7 +1104,7 @@ protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.Build
    *
    *
    * <pre>
-   * A recaptcha assessment resource.
+   * A reCAPTCHA Enterprise assessment resource.
    * </pre>
    *
    * Protobuf type {@code google.cloud.recaptchaenterprise.v1beta1.Assessment}
@@ -1043,6 +1163,11 @@ public Builder clear() {
         accountDefenderAssessmentBuilder_.dispose();
         accountDefenderAssessmentBuilder_ = null;
       }
+      fraudPreventionAssessment_ = null;
+      if (fraudPreventionAssessmentBuilder_ != null) {
+        fraudPreventionAssessmentBuilder_.dispose();
+        fraudPreventionAssessmentBuilder_ = null;
+      }
       return this;
     }
 
@@ -1114,6 +1239,12 @@ private void buildPartial0(com.google.recaptchaenterprise.v1beta1.Assessment res
                 ? accountDefenderAssessment_
                 : accountDefenderAssessmentBuilder_.build();
       }
+      if (((from_bitField0_ & 0x00000080) != 0)) {
+        result.fraudPreventionAssessment_ =
+            fraudPreventionAssessmentBuilder_ == null
+                ? fraudPreventionAssessment_
+                : fraudPreventionAssessmentBuilder_.build();
+      }
     }
 
     @java.lang.Override
@@ -1192,6 +1323,9 @@ public Builder mergeFrom(com.google.recaptchaenterprise.v1beta1.Assessment other
       if (other.hasAccountDefenderAssessment()) {
         mergeAccountDefenderAssessment(other.getAccountDefenderAssessment());
       }
+      if (other.hasFraudPreventionAssessment()) {
+        mergeFraudPreventionAssessment(other.getFraudPreventionAssessment());
+      }
       this.mergeUnknownFields(other.getUnknownFields());
       onChanged();
       return this;
@@ -1275,6 +1409,13 @@ public Builder mergeFrom(
                 bitField0_ |= 0x00000040;
                 break;
               } // case 66
+            case 90:
+              {
+                input.readMessage(
+                    getFraudPreventionAssessmentFieldBuilder().getBuilder(), extensionRegistry);
+                bitField0_ |= 0x00000080;
+                break;
+              } // case 90
             default:
               {
                 if (!super.parseUnknownField(input, extensionRegistry, tag)) {
@@ -2354,7 +2495,7 @@ public Builder clearPasswordLeakVerification() {
      *
      *
      * <pre>
-     * Assessment returned by Account Defender when a hashed_account_id is
+     * Assessment returned by account defender when a hashed_account_id is
      * provided.
      * </pre>
      *
@@ -2371,7 +2512,7 @@ public boolean hasAccountDefenderAssessment() {
      *
      *
      * <pre>
-     * Assessment returned by Account Defender when a hashed_account_id is
+     * Assessment returned by account defender when a hashed_account_id is
      * provided.
      * </pre>
      *
@@ -2395,7 +2536,7 @@ public boolean hasAccountDefenderAssessment() {
      *
      *
      * <pre>
-     * Assessment returned by Account Defender when a hashed_account_id is
+     * Assessment returned by account defender when a hashed_account_id is
      * provided.
      * </pre>
      *
@@ -2421,7 +2562,7 @@ public Builder setAccountDefenderAssessment(
      *
      *
      * <pre>
-     * Assessment returned by Account Defender when a hashed_account_id is
+     * Assessment returned by account defender when a hashed_account_id is
      * provided.
      * </pre>
      *
@@ -2444,7 +2585,7 @@ public Builder setAccountDefenderAssessment(
      *
      *
      * <pre>
-     * Assessment returned by Account Defender when a hashed_account_id is
+     * Assessment returned by account defender when a hashed_account_id is
      * provided.
      * </pre>
      *
@@ -2475,7 +2616,7 @@ public Builder mergeAccountDefenderAssessment(
      *
      *
      * <pre>
-     * Assessment returned by Account Defender when a hashed_account_id is
+     * Assessment returned by account defender when a hashed_account_id is
      * provided.
      * </pre>
      *
@@ -2497,7 +2638,7 @@ public Builder clearAccountDefenderAssessment() {
      *
      *
      * <pre>
-     * Assessment returned by Account Defender when a hashed_account_id is
+     * Assessment returned by account defender when a hashed_account_id is
      * provided.
      * </pre>
      *
@@ -2515,7 +2656,7 @@ public Builder clearAccountDefenderAssessment() {
      *
      *
      * <pre>
-     * Assessment returned by Account Defender when a hashed_account_id is
+     * Assessment returned by account defender when a hashed_account_id is
      * provided.
      * </pre>
      *
@@ -2537,7 +2678,7 @@ public Builder clearAccountDefenderAssessment() {
      *
      *
      * <pre>
-     * Assessment returned by Account Defender when a hashed_account_id is
+     * Assessment returned by account defender when a hashed_account_id is
      * provided.
      * </pre>
      *
@@ -2562,6 +2703,216 @@ public Builder clearAccountDefenderAssessment() {
       return accountDefenderAssessmentBuilder_;
     }
 
+    private com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+        fraudPreventionAssessment_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+            com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment,
+            com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.Builder,
+            com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessmentOrBuilder>
+        fraudPreventionAssessmentBuilder_;
+    /**
+     *
+     *
+     * <pre>
+     * Assessment returned by Fraud Prevention when TransactionData is provided.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment fraud_prevention_assessment = 11;
+     * </code>
+     *
+     * @return Whether the fraudPreventionAssessment field is set.
+     */
+    public boolean hasFraudPreventionAssessment() {
+      return ((bitField0_ & 0x00000080) != 0);
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Assessment returned by Fraud Prevention when TransactionData is provided.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment fraud_prevention_assessment = 11;
+     * </code>
+     *
+     * @return The fraudPreventionAssessment.
+     */
+    public com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+        getFraudPreventionAssessment() {
+      if (fraudPreventionAssessmentBuilder_ == null) {
+        return fraudPreventionAssessment_ == null
+            ? com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.getDefaultInstance()
+            : fraudPreventionAssessment_;
+      } else {
+        return fraudPreventionAssessmentBuilder_.getMessage();
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Assessment returned by Fraud Prevention when TransactionData is provided.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment fraud_prevention_assessment = 11;
+     * </code>
+     */
+    public Builder setFraudPreventionAssessment(
+        com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment value) {
+      if (fraudPreventionAssessmentBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        fraudPreventionAssessment_ = value;
+      } else {
+        fraudPreventionAssessmentBuilder_.setMessage(value);
+      }
+      bitField0_ |= 0x00000080;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Assessment returned by Fraud Prevention when TransactionData is provided.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment fraud_prevention_assessment = 11;
+     * </code>
+     */
+    public Builder setFraudPreventionAssessment(
+        com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.Builder builderForValue) {
+      if (fraudPreventionAssessmentBuilder_ == null) {
+        fraudPreventionAssessment_ = builderForValue.build();
+      } else {
+        fraudPreventionAssessmentBuilder_.setMessage(builderForValue.build());
+      }
+      bitField0_ |= 0x00000080;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Assessment returned by Fraud Prevention when TransactionData is provided.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment fraud_prevention_assessment = 11;
+     * </code>
+     */
+    public Builder mergeFraudPreventionAssessment(
+        com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment value) {
+      if (fraudPreventionAssessmentBuilder_ == null) {
+        if (((bitField0_ & 0x00000080) != 0)
+            && fraudPreventionAssessment_ != null
+            && fraudPreventionAssessment_
+                != com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+                    .getDefaultInstance()) {
+          getFraudPreventionAssessmentBuilder().mergeFrom(value);
+        } else {
+          fraudPreventionAssessment_ = value;
+        }
+      } else {
+        fraudPreventionAssessmentBuilder_.mergeFrom(value);
+      }
+      bitField0_ |= 0x00000080;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Assessment returned by Fraud Prevention when TransactionData is provided.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment fraud_prevention_assessment = 11;
+     * </code>
+     */
+    public Builder clearFraudPreventionAssessment() {
+      bitField0_ = (bitField0_ & ~0x00000080);
+      fraudPreventionAssessment_ = null;
+      if (fraudPreventionAssessmentBuilder_ != null) {
+        fraudPreventionAssessmentBuilder_.dispose();
+        fraudPreventionAssessmentBuilder_ = null;
+      }
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Assessment returned by Fraud Prevention when TransactionData is provided.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment fraud_prevention_assessment = 11;
+     * </code>
+     */
+    public com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.Builder
+        getFraudPreventionAssessmentBuilder() {
+      bitField0_ |= 0x00000080;
+      onChanged();
+      return getFraudPreventionAssessmentFieldBuilder().getBuilder();
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Assessment returned by Fraud Prevention when TransactionData is provided.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment fraud_prevention_assessment = 11;
+     * </code>
+     */
+    public com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessmentOrBuilder
+        getFraudPreventionAssessmentOrBuilder() {
+      if (fraudPreventionAssessmentBuilder_ != null) {
+        return fraudPreventionAssessmentBuilder_.getMessageOrBuilder();
+      } else {
+        return fraudPreventionAssessment_ == null
+            ? com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.getDefaultInstance()
+            : fraudPreventionAssessment_;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Assessment returned by Fraud Prevention when TransactionData is provided.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment fraud_prevention_assessment = 11;
+     * </code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+            com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment,
+            com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.Builder,
+            com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessmentOrBuilder>
+        getFraudPreventionAssessmentFieldBuilder() {
+      if (fraudPreventionAssessmentBuilder_ == null) {
+        fraudPreventionAssessmentBuilder_ =
+            new com.google.protobuf.SingleFieldBuilderV3<
+                com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment,
+                com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.Builder,
+                com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessmentOrBuilder>(
+                getFraudPreventionAssessment(), getParentForChildren(), isClean());
+        fraudPreventionAssessment_ = null;
+      }
+      return fraudPreventionAssessmentBuilder_;
+    }
+
     @java.lang.Override
     public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) {
       return super.setUnknownFields(unknownFields);
diff --git a/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/AssessmentOrBuilder.java b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/AssessmentOrBuilder.java
index c35100eb3758..4a48f4dc2a87 100644
--- a/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/AssessmentOrBuilder.java
+++ b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/AssessmentOrBuilder.java
@@ -270,7 +270,7 @@ public interface AssessmentOrBuilder
    *
    *
    * <pre>
-   * Assessment returned by Account Defender when a hashed_account_id is
+   * Assessment returned by account defender when a hashed_account_id is
    * provided.
    * </pre>
    *
@@ -285,7 +285,7 @@ public interface AssessmentOrBuilder
    *
    *
    * <pre>
-   * Assessment returned by Account Defender when a hashed_account_id is
+   * Assessment returned by account defender when a hashed_account_id is
    * provided.
    * </pre>
    *
@@ -300,7 +300,7 @@ public interface AssessmentOrBuilder
    *
    *
    * <pre>
-   * Assessment returned by Account Defender when a hashed_account_id is
+   * Assessment returned by account defender when a hashed_account_id is
    * provided.
    * </pre>
    *
@@ -310,4 +310,46 @@ public interface AssessmentOrBuilder
    */
   com.google.recaptchaenterprise.v1beta1.AccountDefenderAssessmentOrBuilder
       getAccountDefenderAssessmentOrBuilder();
+
+  /**
+   *
+   *
+   * <pre>
+   * Assessment returned by Fraud Prevention when TransactionData is provided.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment fraud_prevention_assessment = 11;
+   * </code>
+   *
+   * @return Whether the fraudPreventionAssessment field is set.
+   */
+  boolean hasFraudPreventionAssessment();
+  /**
+   *
+   *
+   * <pre>
+   * Assessment returned by Fraud Prevention when TransactionData is provided.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment fraud_prevention_assessment = 11;
+   * </code>
+   *
+   * @return The fraudPreventionAssessment.
+   */
+  com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment getFraudPreventionAssessment();
+  /**
+   *
+   *
+   * <pre>
+   * Assessment returned by Fraud Prevention when TransactionData is provided.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment fraud_prevention_assessment = 11;
+   * </code>
+   */
+  com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessmentOrBuilder
+      getFraudPreventionAssessmentOrBuilder();
 }
diff --git a/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/Event.java b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/Event.java
index 5908c362f974..d244e5c60f21 100644
--- a/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/Event.java
+++ b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/Event.java
@@ -72,8 +72,8 @@ public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
    *
    *
    * <pre>
-   * Optional. The user response token provided by the reCAPTCHA client-side integration
-   * on your site.
+   * Optional. The user response token provided by the reCAPTCHA Enterprise
+   * client-side integration on your site.
    * </pre>
    *
    * <code>string token = 1 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -96,8 +96,8 @@ public java.lang.String getToken() {
    *
    *
    * <pre>
-   * Optional. The user response token provided by the reCAPTCHA client-side integration
-   * on your site.
+   * Optional. The user response token provided by the reCAPTCHA Enterprise
+   * client-side integration on your site.
    * </pre>
    *
    * <code>string token = 1 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -125,8 +125,8 @@ public com.google.protobuf.ByteString getTokenBytes() {
    *
    *
    * <pre>
-   * Optional. The site key that was used to invoke reCAPTCHA on your site and generate
-   * the token.
+   * Optional. The site key that was used to invoke reCAPTCHA Enterprise on your
+   * site and generate the token.
    * </pre>
    *
    * <code>string site_key = 2 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -149,8 +149,8 @@ public java.lang.String getSiteKey() {
    *
    *
    * <pre>
-   * Optional. The site key that was used to invoke reCAPTCHA on your site and generate
-   * the token.
+   * Optional. The site key that was used to invoke reCAPTCHA Enterprise on your
+   * site and generate the token.
    * </pre>
    *
    * <code>string site_key = 2 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -178,8 +178,8 @@ public com.google.protobuf.ByteString getSiteKeyBytes() {
    *
    *
    * <pre>
-   * Optional. The user agent present in the request from the user's device related to
-   * this event.
+   * Optional. The user agent present in the request from the user's device
+   * related to this event.
    * </pre>
    *
    * <code>string user_agent = 3 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -202,8 +202,8 @@ public java.lang.String getUserAgent() {
    *
    *
    * <pre>
-   * Optional. The user agent present in the request from the user's device related to
-   * this event.
+   * Optional. The user agent present in the request from the user's device
+   * related to this event.
    * </pre>
    *
    * <code>string user_agent = 3 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -231,7 +231,8 @@ public com.google.protobuf.ByteString getUserAgentBytes() {
    *
    *
    * <pre>
-   * Optional. The IP address in the request from the user's device related to this event.
+   * Optional. The IP address in the request from the user's device related to
+   * this event.
    * </pre>
    *
    * <code>string user_ip_address = 4 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -254,7 +255,8 @@ public java.lang.String getUserIpAddress() {
    *
    *
    * <pre>
-   * Optional. The IP address in the request from the user's device related to this event.
+   * Optional. The IP address in the request from the user's device related to
+   * this event.
    * </pre>
    *
    * <code>string user_ip_address = 4 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -282,9 +284,9 @@ public com.google.protobuf.ByteString getUserIpAddressBytes() {
    *
    *
    * <pre>
-   * Optional. The expected action for this type of event. This should be the same action
-   * provided at token generation time on client-side platforms already
-   * integrated with recaptcha enterprise.
+   * Optional. The expected action for this type of event. This should be the
+   * same action provided at token generation time on client-side platforms
+   * already integrated with recaptcha enterprise.
    * </pre>
    *
    * <code>string expected_action = 5 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -307,9 +309,9 @@ public java.lang.String getExpectedAction() {
    *
    *
    * <pre>
-   * Optional. The expected action for this type of event. This should be the same action
-   * provided at token generation time on client-side platforms already
-   * integrated with recaptcha enterprise.
+   * Optional. The expected action for this type of event. This should be the
+   * same action provided at token generation time on client-side platforms
+   * already integrated with recaptcha enterprise.
    * </pre>
    *
    * <code>string expected_action = 5 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -335,8 +337,8 @@ public com.google.protobuf.ByteString getExpectedActionBytes() {
    *
    *
    * <pre>
-   * Optional. Optional unique stable hashed user identifier for the request. The
-   * identifier should ideally be hashed using sha256 with stable secret.
+   * Optional. Unique stable hashed user identifier for the request. The
+   * identifier must be hashed using hmac-sha256 with stable secret.
    * </pre>
    *
    * <code>bytes hashed_account_id = 6 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -348,6 +350,69 @@ public com.google.protobuf.ByteString getHashedAccountId() {
     return hashedAccountId_;
   }
 
+  public static final int TRANSACTION_DATA_FIELD_NUMBER = 13;
+  private com.google.recaptchaenterprise.v1beta1.TransactionData transactionData_;
+  /**
+   *
+   *
+   * <pre>
+   * Optional. Data describing a payment transaction to be assessed. Sending
+   * this data enables reCAPTCHA Enterprise Fraud Prevention and the
+   * FraudPreventionAssessment component in the response.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.TransactionData transaction_data = 13 [(.google.api.field_behavior) = OPTIONAL];
+   * </code>
+   *
+   * @return Whether the transactionData field is set.
+   */
+  @java.lang.Override
+  public boolean hasTransactionData() {
+    return transactionData_ != null;
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Optional. Data describing a payment transaction to be assessed. Sending
+   * this data enables reCAPTCHA Enterprise Fraud Prevention and the
+   * FraudPreventionAssessment component in the response.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.TransactionData transaction_data = 13 [(.google.api.field_behavior) = OPTIONAL];
+   * </code>
+   *
+   * @return The transactionData.
+   */
+  @java.lang.Override
+  public com.google.recaptchaenterprise.v1beta1.TransactionData getTransactionData() {
+    return transactionData_ == null
+        ? com.google.recaptchaenterprise.v1beta1.TransactionData.getDefaultInstance()
+        : transactionData_;
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Optional. Data describing a payment transaction to be assessed. Sending
+   * this data enables reCAPTCHA Enterprise Fraud Prevention and the
+   * FraudPreventionAssessment component in the response.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.TransactionData transaction_data = 13 [(.google.api.field_behavior) = OPTIONAL];
+   * </code>
+   */
+  @java.lang.Override
+  public com.google.recaptchaenterprise.v1beta1.TransactionDataOrBuilder
+      getTransactionDataOrBuilder() {
+    return transactionData_ == null
+        ? com.google.recaptchaenterprise.v1beta1.TransactionData.getDefaultInstance()
+        : transactionData_;
+  }
+
   private byte memoizedIsInitialized = -1;
 
   @java.lang.Override
@@ -380,6 +445,9 @@ public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io
     if (!hashedAccountId_.isEmpty()) {
       output.writeBytes(6, hashedAccountId_);
     }
+    if (transactionData_ != null) {
+      output.writeMessage(13, getTransactionData());
+    }
     getUnknownFields().writeTo(output);
   }
 
@@ -407,6 +475,9 @@ public int getSerializedSize() {
     if (!hashedAccountId_.isEmpty()) {
       size += com.google.protobuf.CodedOutputStream.computeBytesSize(6, hashedAccountId_);
     }
+    if (transactionData_ != null) {
+      size += com.google.protobuf.CodedOutputStream.computeMessageSize(13, getTransactionData());
+    }
     size += getUnknownFields().getSerializedSize();
     memoizedSize = size;
     return size;
@@ -429,6 +500,10 @@ public boolean equals(final java.lang.Object obj) {
     if (!getUserIpAddress().equals(other.getUserIpAddress())) return false;
     if (!getExpectedAction().equals(other.getExpectedAction())) return false;
     if (!getHashedAccountId().equals(other.getHashedAccountId())) return false;
+    if (hasTransactionData() != other.hasTransactionData()) return false;
+    if (hasTransactionData()) {
+      if (!getTransactionData().equals(other.getTransactionData())) return false;
+    }
     if (!getUnknownFields().equals(other.getUnknownFields())) return false;
     return true;
   }
@@ -452,6 +527,10 @@ public int hashCode() {
     hash = (53 * hash) + getExpectedAction().hashCode();
     hash = (37 * hash) + HASHED_ACCOUNT_ID_FIELD_NUMBER;
     hash = (53 * hash) + getHashedAccountId().hashCode();
+    if (hasTransactionData()) {
+      hash = (37 * hash) + TRANSACTION_DATA_FIELD_NUMBER;
+      hash = (53 * hash) + getTransactionData().hashCode();
+    }
     hash = (29 * hash) + getUnknownFields().hashCode();
     memoizedHashCode = hash;
     return hash;
@@ -589,6 +668,11 @@ public Builder clear() {
       userIpAddress_ = "";
       expectedAction_ = "";
       hashedAccountId_ = com.google.protobuf.ByteString.EMPTY;
+      transactionData_ = null;
+      if (transactionDataBuilder_ != null) {
+        transactionDataBuilder_.dispose();
+        transactionDataBuilder_ = null;
+      }
       return this;
     }
 
@@ -643,6 +727,10 @@ private void buildPartial0(com.google.recaptchaenterprise.v1beta1.Event result)
       if (((from_bitField0_ & 0x00000020) != 0)) {
         result.hashedAccountId_ = hashedAccountId_;
       }
+      if (((from_bitField0_ & 0x00000040) != 0)) {
+        result.transactionData_ =
+            transactionDataBuilder_ == null ? transactionData_ : transactionDataBuilder_.build();
+      }
     }
 
     @java.lang.Override
@@ -718,6 +806,9 @@ public Builder mergeFrom(com.google.recaptchaenterprise.v1beta1.Event other) {
       if (other.getHashedAccountId() != com.google.protobuf.ByteString.EMPTY) {
         setHashedAccountId(other.getHashedAccountId());
       }
+      if (other.hasTransactionData()) {
+        mergeTransactionData(other.getTransactionData());
+      }
       this.mergeUnknownFields(other.getUnknownFields());
       onChanged();
       return this;
@@ -780,6 +871,12 @@ public Builder mergeFrom(
                 bitField0_ |= 0x00000020;
                 break;
               } // case 50
+            case 106:
+              {
+                input.readMessage(getTransactionDataFieldBuilder().getBuilder(), extensionRegistry);
+                bitField0_ |= 0x00000040;
+                break;
+              } // case 106
             default:
               {
                 if (!super.parseUnknownField(input, extensionRegistry, tag)) {
@@ -804,8 +901,8 @@ public Builder mergeFrom(
      *
      *
      * <pre>
-     * Optional. The user response token provided by the reCAPTCHA client-side integration
-     * on your site.
+     * Optional. The user response token provided by the reCAPTCHA Enterprise
+     * client-side integration on your site.
      * </pre>
      *
      * <code>string token = 1 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -827,8 +924,8 @@ public java.lang.String getToken() {
      *
      *
      * <pre>
-     * Optional. The user response token provided by the reCAPTCHA client-side integration
-     * on your site.
+     * Optional. The user response token provided by the reCAPTCHA Enterprise
+     * client-side integration on your site.
      * </pre>
      *
      * <code>string token = 1 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -850,8 +947,8 @@ public com.google.protobuf.ByteString getTokenBytes() {
      *
      *
      * <pre>
-     * Optional. The user response token provided by the reCAPTCHA client-side integration
-     * on your site.
+     * Optional. The user response token provided by the reCAPTCHA Enterprise
+     * client-side integration on your site.
      * </pre>
      *
      * <code>string token = 1 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -872,8 +969,8 @@ public Builder setToken(java.lang.String value) {
      *
      *
      * <pre>
-     * Optional. The user response token provided by the reCAPTCHA client-side integration
-     * on your site.
+     * Optional. The user response token provided by the reCAPTCHA Enterprise
+     * client-side integration on your site.
      * </pre>
      *
      * <code>string token = 1 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -890,8 +987,8 @@ public Builder clearToken() {
      *
      *
      * <pre>
-     * Optional. The user response token provided by the reCAPTCHA client-side integration
-     * on your site.
+     * Optional. The user response token provided by the reCAPTCHA Enterprise
+     * client-side integration on your site.
      * </pre>
      *
      * <code>string token = 1 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -915,8 +1012,8 @@ public Builder setTokenBytes(com.google.protobuf.ByteString value) {
      *
      *
      * <pre>
-     * Optional. The site key that was used to invoke reCAPTCHA on your site and generate
-     * the token.
+     * Optional. The site key that was used to invoke reCAPTCHA Enterprise on your
+     * site and generate the token.
      * </pre>
      *
      * <code>string site_key = 2 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -938,8 +1035,8 @@ public java.lang.String getSiteKey() {
      *
      *
      * <pre>
-     * Optional. The site key that was used to invoke reCAPTCHA on your site and generate
-     * the token.
+     * Optional. The site key that was used to invoke reCAPTCHA Enterprise on your
+     * site and generate the token.
      * </pre>
      *
      * <code>string site_key = 2 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -961,8 +1058,8 @@ public com.google.protobuf.ByteString getSiteKeyBytes() {
      *
      *
      * <pre>
-     * Optional. The site key that was used to invoke reCAPTCHA on your site and generate
-     * the token.
+     * Optional. The site key that was used to invoke reCAPTCHA Enterprise on your
+     * site and generate the token.
      * </pre>
      *
      * <code>string site_key = 2 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -983,8 +1080,8 @@ public Builder setSiteKey(java.lang.String value) {
      *
      *
      * <pre>
-     * Optional. The site key that was used to invoke reCAPTCHA on your site and generate
-     * the token.
+     * Optional. The site key that was used to invoke reCAPTCHA Enterprise on your
+     * site and generate the token.
      * </pre>
      *
      * <code>string site_key = 2 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -1001,8 +1098,8 @@ public Builder clearSiteKey() {
      *
      *
      * <pre>
-     * Optional. The site key that was used to invoke reCAPTCHA on your site and generate
-     * the token.
+     * Optional. The site key that was used to invoke reCAPTCHA Enterprise on your
+     * site and generate the token.
      * </pre>
      *
      * <code>string site_key = 2 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -1026,8 +1123,8 @@ public Builder setSiteKeyBytes(com.google.protobuf.ByteString value) {
      *
      *
      * <pre>
-     * Optional. The user agent present in the request from the user's device related to
-     * this event.
+     * Optional. The user agent present in the request from the user's device
+     * related to this event.
      * </pre>
      *
      * <code>string user_agent = 3 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -1049,8 +1146,8 @@ public java.lang.String getUserAgent() {
      *
      *
      * <pre>
-     * Optional. The user agent present in the request from the user's device related to
-     * this event.
+     * Optional. The user agent present in the request from the user's device
+     * related to this event.
      * </pre>
      *
      * <code>string user_agent = 3 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -1072,8 +1169,8 @@ public com.google.protobuf.ByteString getUserAgentBytes() {
      *
      *
      * <pre>
-     * Optional. The user agent present in the request from the user's device related to
-     * this event.
+     * Optional. The user agent present in the request from the user's device
+     * related to this event.
      * </pre>
      *
      * <code>string user_agent = 3 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -1094,8 +1191,8 @@ public Builder setUserAgent(java.lang.String value) {
      *
      *
      * <pre>
-     * Optional. The user agent present in the request from the user's device related to
-     * this event.
+     * Optional. The user agent present in the request from the user's device
+     * related to this event.
      * </pre>
      *
      * <code>string user_agent = 3 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -1112,8 +1209,8 @@ public Builder clearUserAgent() {
      *
      *
      * <pre>
-     * Optional. The user agent present in the request from the user's device related to
-     * this event.
+     * Optional. The user agent present in the request from the user's device
+     * related to this event.
      * </pre>
      *
      * <code>string user_agent = 3 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -1137,7 +1234,8 @@ public Builder setUserAgentBytes(com.google.protobuf.ByteString value) {
      *
      *
      * <pre>
-     * Optional. The IP address in the request from the user's device related to this event.
+     * Optional. The IP address in the request from the user's device related to
+     * this event.
      * </pre>
      *
      * <code>string user_ip_address = 4 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -1159,7 +1257,8 @@ public java.lang.String getUserIpAddress() {
      *
      *
      * <pre>
-     * Optional. The IP address in the request from the user's device related to this event.
+     * Optional. The IP address in the request from the user's device related to
+     * this event.
      * </pre>
      *
      * <code>string user_ip_address = 4 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -1181,7 +1280,8 @@ public com.google.protobuf.ByteString getUserIpAddressBytes() {
      *
      *
      * <pre>
-     * Optional. The IP address in the request from the user's device related to this event.
+     * Optional. The IP address in the request from the user's device related to
+     * this event.
      * </pre>
      *
      * <code>string user_ip_address = 4 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -1202,7 +1302,8 @@ public Builder setUserIpAddress(java.lang.String value) {
      *
      *
      * <pre>
-     * Optional. The IP address in the request from the user's device related to this event.
+     * Optional. The IP address in the request from the user's device related to
+     * this event.
      * </pre>
      *
      * <code>string user_ip_address = 4 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -1219,7 +1320,8 @@ public Builder clearUserIpAddress() {
      *
      *
      * <pre>
-     * Optional. The IP address in the request from the user's device related to this event.
+     * Optional. The IP address in the request from the user's device related to
+     * this event.
      * </pre>
      *
      * <code>string user_ip_address = 4 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -1243,9 +1345,9 @@ public Builder setUserIpAddressBytes(com.google.protobuf.ByteString value) {
      *
      *
      * <pre>
-     * Optional. The expected action for this type of event. This should be the same action
-     * provided at token generation time on client-side platforms already
-     * integrated with recaptcha enterprise.
+     * Optional. The expected action for this type of event. This should be the
+     * same action provided at token generation time on client-side platforms
+     * already integrated with recaptcha enterprise.
      * </pre>
      *
      * <code>string expected_action = 5 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -1267,9 +1369,9 @@ public java.lang.String getExpectedAction() {
      *
      *
      * <pre>
-     * Optional. The expected action for this type of event. This should be the same action
-     * provided at token generation time on client-side platforms already
-     * integrated with recaptcha enterprise.
+     * Optional. The expected action for this type of event. This should be the
+     * same action provided at token generation time on client-side platforms
+     * already integrated with recaptcha enterprise.
      * </pre>
      *
      * <code>string expected_action = 5 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -1291,9 +1393,9 @@ public com.google.protobuf.ByteString getExpectedActionBytes() {
      *
      *
      * <pre>
-     * Optional. The expected action for this type of event. This should be the same action
-     * provided at token generation time on client-side platforms already
-     * integrated with recaptcha enterprise.
+     * Optional. The expected action for this type of event. This should be the
+     * same action provided at token generation time on client-side platforms
+     * already integrated with recaptcha enterprise.
      * </pre>
      *
      * <code>string expected_action = 5 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -1314,9 +1416,9 @@ public Builder setExpectedAction(java.lang.String value) {
      *
      *
      * <pre>
-     * Optional. The expected action for this type of event. This should be the same action
-     * provided at token generation time on client-side platforms already
-     * integrated with recaptcha enterprise.
+     * Optional. The expected action for this type of event. This should be the
+     * same action provided at token generation time on client-side platforms
+     * already integrated with recaptcha enterprise.
      * </pre>
      *
      * <code>string expected_action = 5 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -1333,9 +1435,9 @@ public Builder clearExpectedAction() {
      *
      *
      * <pre>
-     * Optional. The expected action for this type of event. This should be the same action
-     * provided at token generation time on client-side platforms already
-     * integrated with recaptcha enterprise.
+     * Optional. The expected action for this type of event. This should be the
+     * same action provided at token generation time on client-side platforms
+     * already integrated with recaptcha enterprise.
      * </pre>
      *
      * <code>string expected_action = 5 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -1359,8 +1461,8 @@ public Builder setExpectedActionBytes(com.google.protobuf.ByteString value) {
      *
      *
      * <pre>
-     * Optional. Optional unique stable hashed user identifier for the request. The
-     * identifier should ideally be hashed using sha256 with stable secret.
+     * Optional. Unique stable hashed user identifier for the request. The
+     * identifier must be hashed using hmac-sha256 with stable secret.
      * </pre>
      *
      * <code>bytes hashed_account_id = 6 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -1375,8 +1477,8 @@ public com.google.protobuf.ByteString getHashedAccountId() {
      *
      *
      * <pre>
-     * Optional. Optional unique stable hashed user identifier for the request. The
-     * identifier should ideally be hashed using sha256 with stable secret.
+     * Optional. Unique stable hashed user identifier for the request. The
+     * identifier must be hashed using hmac-sha256 with stable secret.
      * </pre>
      *
      * <code>bytes hashed_account_id = 6 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -1397,8 +1499,8 @@ public Builder setHashedAccountId(com.google.protobuf.ByteString value) {
      *
      *
      * <pre>
-     * Optional. Optional unique stable hashed user identifier for the request. The
-     * identifier should ideally be hashed using sha256 with stable secret.
+     * Optional. Unique stable hashed user identifier for the request. The
+     * identifier must be hashed using hmac-sha256 with stable secret.
      * </pre>
      *
      * <code>bytes hashed_account_id = 6 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -1412,6 +1514,231 @@ public Builder clearHashedAccountId() {
       return this;
     }
 
+    private com.google.recaptchaenterprise.v1beta1.TransactionData transactionData_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+            com.google.recaptchaenterprise.v1beta1.TransactionData,
+            com.google.recaptchaenterprise.v1beta1.TransactionData.Builder,
+            com.google.recaptchaenterprise.v1beta1.TransactionDataOrBuilder>
+        transactionDataBuilder_;
+    /**
+     *
+     *
+     * <pre>
+     * Optional. Data describing a payment transaction to be assessed. Sending
+     * this data enables reCAPTCHA Enterprise Fraud Prevention and the
+     * FraudPreventionAssessment component in the response.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.TransactionData transaction_data = 13 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     *
+     * @return Whether the transactionData field is set.
+     */
+    public boolean hasTransactionData() {
+      return ((bitField0_ & 0x00000040) != 0);
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. Data describing a payment transaction to be assessed. Sending
+     * this data enables reCAPTCHA Enterprise Fraud Prevention and the
+     * FraudPreventionAssessment component in the response.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.TransactionData transaction_data = 13 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     *
+     * @return The transactionData.
+     */
+    public com.google.recaptchaenterprise.v1beta1.TransactionData getTransactionData() {
+      if (transactionDataBuilder_ == null) {
+        return transactionData_ == null
+            ? com.google.recaptchaenterprise.v1beta1.TransactionData.getDefaultInstance()
+            : transactionData_;
+      } else {
+        return transactionDataBuilder_.getMessage();
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. Data describing a payment transaction to be assessed. Sending
+     * this data enables reCAPTCHA Enterprise Fraud Prevention and the
+     * FraudPreventionAssessment component in the response.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.TransactionData transaction_data = 13 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     */
+    public Builder setTransactionData(
+        com.google.recaptchaenterprise.v1beta1.TransactionData value) {
+      if (transactionDataBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        transactionData_ = value;
+      } else {
+        transactionDataBuilder_.setMessage(value);
+      }
+      bitField0_ |= 0x00000040;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. Data describing a payment transaction to be assessed. Sending
+     * this data enables reCAPTCHA Enterprise Fraud Prevention and the
+     * FraudPreventionAssessment component in the response.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.TransactionData transaction_data = 13 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     */
+    public Builder setTransactionData(
+        com.google.recaptchaenterprise.v1beta1.TransactionData.Builder builderForValue) {
+      if (transactionDataBuilder_ == null) {
+        transactionData_ = builderForValue.build();
+      } else {
+        transactionDataBuilder_.setMessage(builderForValue.build());
+      }
+      bitField0_ |= 0x00000040;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. Data describing a payment transaction to be assessed. Sending
+     * this data enables reCAPTCHA Enterprise Fraud Prevention and the
+     * FraudPreventionAssessment component in the response.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.TransactionData transaction_data = 13 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     */
+    public Builder mergeTransactionData(
+        com.google.recaptchaenterprise.v1beta1.TransactionData value) {
+      if (transactionDataBuilder_ == null) {
+        if (((bitField0_ & 0x00000040) != 0)
+            && transactionData_ != null
+            && transactionData_
+                != com.google.recaptchaenterprise.v1beta1.TransactionData.getDefaultInstance()) {
+          getTransactionDataBuilder().mergeFrom(value);
+        } else {
+          transactionData_ = value;
+        }
+      } else {
+        transactionDataBuilder_.mergeFrom(value);
+      }
+      bitField0_ |= 0x00000040;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. Data describing a payment transaction to be assessed. Sending
+     * this data enables reCAPTCHA Enterprise Fraud Prevention and the
+     * FraudPreventionAssessment component in the response.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.TransactionData transaction_data = 13 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     */
+    public Builder clearTransactionData() {
+      bitField0_ = (bitField0_ & ~0x00000040);
+      transactionData_ = null;
+      if (transactionDataBuilder_ != null) {
+        transactionDataBuilder_.dispose();
+        transactionDataBuilder_ = null;
+      }
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. Data describing a payment transaction to be assessed. Sending
+     * this data enables reCAPTCHA Enterprise Fraud Prevention and the
+     * FraudPreventionAssessment component in the response.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.TransactionData transaction_data = 13 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     */
+    public com.google.recaptchaenterprise.v1beta1.TransactionData.Builder
+        getTransactionDataBuilder() {
+      bitField0_ |= 0x00000040;
+      onChanged();
+      return getTransactionDataFieldBuilder().getBuilder();
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. Data describing a payment transaction to be assessed. Sending
+     * this data enables reCAPTCHA Enterprise Fraud Prevention and the
+     * FraudPreventionAssessment component in the response.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.TransactionData transaction_data = 13 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     */
+    public com.google.recaptchaenterprise.v1beta1.TransactionDataOrBuilder
+        getTransactionDataOrBuilder() {
+      if (transactionDataBuilder_ != null) {
+        return transactionDataBuilder_.getMessageOrBuilder();
+      } else {
+        return transactionData_ == null
+            ? com.google.recaptchaenterprise.v1beta1.TransactionData.getDefaultInstance()
+            : transactionData_;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. Data describing a payment transaction to be assessed. Sending
+     * this data enables reCAPTCHA Enterprise Fraud Prevention and the
+     * FraudPreventionAssessment component in the response.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.TransactionData transaction_data = 13 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+            com.google.recaptchaenterprise.v1beta1.TransactionData,
+            com.google.recaptchaenterprise.v1beta1.TransactionData.Builder,
+            com.google.recaptchaenterprise.v1beta1.TransactionDataOrBuilder>
+        getTransactionDataFieldBuilder() {
+      if (transactionDataBuilder_ == null) {
+        transactionDataBuilder_ =
+            new com.google.protobuf.SingleFieldBuilderV3<
+                com.google.recaptchaenterprise.v1beta1.TransactionData,
+                com.google.recaptchaenterprise.v1beta1.TransactionData.Builder,
+                com.google.recaptchaenterprise.v1beta1.TransactionDataOrBuilder>(
+                getTransactionData(), getParentForChildren(), isClean());
+        transactionData_ = null;
+      }
+      return transactionDataBuilder_;
+    }
+
     @java.lang.Override
     public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) {
       return super.setUnknownFields(unknownFields);
diff --git a/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/EventOrBuilder.java b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/EventOrBuilder.java
index 7d2608223ea7..d36b9adc17d2 100644
--- a/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/EventOrBuilder.java
+++ b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/EventOrBuilder.java
@@ -27,8 +27,8 @@ public interface EventOrBuilder
    *
    *
    * <pre>
-   * Optional. The user response token provided by the reCAPTCHA client-side integration
-   * on your site.
+   * Optional. The user response token provided by the reCAPTCHA Enterprise
+   * client-side integration on your site.
    * </pre>
    *
    * <code>string token = 1 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -40,8 +40,8 @@ public interface EventOrBuilder
    *
    *
    * <pre>
-   * Optional. The user response token provided by the reCAPTCHA client-side integration
-   * on your site.
+   * Optional. The user response token provided by the reCAPTCHA Enterprise
+   * client-side integration on your site.
    * </pre>
    *
    * <code>string token = 1 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -54,8 +54,8 @@ public interface EventOrBuilder
    *
    *
    * <pre>
-   * Optional. The site key that was used to invoke reCAPTCHA on your site and generate
-   * the token.
+   * Optional. The site key that was used to invoke reCAPTCHA Enterprise on your
+   * site and generate the token.
    * </pre>
    *
    * <code>string site_key = 2 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -67,8 +67,8 @@ public interface EventOrBuilder
    *
    *
    * <pre>
-   * Optional. The site key that was used to invoke reCAPTCHA on your site and generate
-   * the token.
+   * Optional. The site key that was used to invoke reCAPTCHA Enterprise on your
+   * site and generate the token.
    * </pre>
    *
    * <code>string site_key = 2 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -81,8 +81,8 @@ public interface EventOrBuilder
    *
    *
    * <pre>
-   * Optional. The user agent present in the request from the user's device related to
-   * this event.
+   * Optional. The user agent present in the request from the user's device
+   * related to this event.
    * </pre>
    *
    * <code>string user_agent = 3 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -94,8 +94,8 @@ public interface EventOrBuilder
    *
    *
    * <pre>
-   * Optional. The user agent present in the request from the user's device related to
-   * this event.
+   * Optional. The user agent present in the request from the user's device
+   * related to this event.
    * </pre>
    *
    * <code>string user_agent = 3 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -108,7 +108,8 @@ public interface EventOrBuilder
    *
    *
    * <pre>
-   * Optional. The IP address in the request from the user's device related to this event.
+   * Optional. The IP address in the request from the user's device related to
+   * this event.
    * </pre>
    *
    * <code>string user_ip_address = 4 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -120,7 +121,8 @@ public interface EventOrBuilder
    *
    *
    * <pre>
-   * Optional. The IP address in the request from the user's device related to this event.
+   * Optional. The IP address in the request from the user's device related to
+   * this event.
    * </pre>
    *
    * <code>string user_ip_address = 4 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -133,9 +135,9 @@ public interface EventOrBuilder
    *
    *
    * <pre>
-   * Optional. The expected action for this type of event. This should be the same action
-   * provided at token generation time on client-side platforms already
-   * integrated with recaptcha enterprise.
+   * Optional. The expected action for this type of event. This should be the
+   * same action provided at token generation time on client-side platforms
+   * already integrated with recaptcha enterprise.
    * </pre>
    *
    * <code>string expected_action = 5 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -147,9 +149,9 @@ public interface EventOrBuilder
    *
    *
    * <pre>
-   * Optional. The expected action for this type of event. This should be the same action
-   * provided at token generation time on client-side platforms already
-   * integrated with recaptcha enterprise.
+   * Optional. The expected action for this type of event. This should be the
+   * same action provided at token generation time on client-side platforms
+   * already integrated with recaptcha enterprise.
    * </pre>
    *
    * <code>string expected_action = 5 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -162,8 +164,8 @@ public interface EventOrBuilder
    *
    *
    * <pre>
-   * Optional. Optional unique stable hashed user identifier for the request. The
-   * identifier should ideally be hashed using sha256 with stable secret.
+   * Optional. Unique stable hashed user identifier for the request. The
+   * identifier must be hashed using hmac-sha256 with stable secret.
    * </pre>
    *
    * <code>bytes hashed_account_id = 6 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -171,4 +173,51 @@ public interface EventOrBuilder
    * @return The hashedAccountId.
    */
   com.google.protobuf.ByteString getHashedAccountId();
+
+  /**
+   *
+   *
+   * <pre>
+   * Optional. Data describing a payment transaction to be assessed. Sending
+   * this data enables reCAPTCHA Enterprise Fraud Prevention and the
+   * FraudPreventionAssessment component in the response.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.TransactionData transaction_data = 13 [(.google.api.field_behavior) = OPTIONAL];
+   * </code>
+   *
+   * @return Whether the transactionData field is set.
+   */
+  boolean hasTransactionData();
+  /**
+   *
+   *
+   * <pre>
+   * Optional. Data describing a payment transaction to be assessed. Sending
+   * this data enables reCAPTCHA Enterprise Fraud Prevention and the
+   * FraudPreventionAssessment component in the response.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.TransactionData transaction_data = 13 [(.google.api.field_behavior) = OPTIONAL];
+   * </code>
+   *
+   * @return The transactionData.
+   */
+  com.google.recaptchaenterprise.v1beta1.TransactionData getTransactionData();
+  /**
+   *
+   *
+   * <pre>
+   * Optional. Data describing a payment transaction to be assessed. Sending
+   * this data enables reCAPTCHA Enterprise Fraud Prevention and the
+   * FraudPreventionAssessment component in the response.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.TransactionData transaction_data = 13 [(.google.api.field_behavior) = OPTIONAL];
+   * </code>
+   */
+  com.google.recaptchaenterprise.v1beta1.TransactionDataOrBuilder getTransactionDataOrBuilder();
 }
diff --git a/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/FraudPreventionAssessment.java b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/FraudPreventionAssessment.java
new file mode 100644
index 000000000000..f756db49e4c7
--- /dev/null
+++ b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/FraudPreventionAssessment.java
@@ -0,0 +1,2424 @@
+/*
+ * Copyright 2020 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: google/cloud/recaptchaenterprise/v1beta1/recaptchaenterprise.proto
+
+package com.google.recaptchaenterprise.v1beta1;
+
+/**
+ *
+ *
+ * <pre>
+ * Assessment for Fraud Prevention.
+ * </pre>
+ *
+ * Protobuf type {@code google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment}
+ */
+public final class FraudPreventionAssessment extends com.google.protobuf.GeneratedMessageV3
+    implements
+    // @@protoc_insertion_point(message_implements:google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment)
+    FraudPreventionAssessmentOrBuilder {
+  private static final long serialVersionUID = 0L;
+  // Use FraudPreventionAssessment.newBuilder() to construct.
+  private FraudPreventionAssessment(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+
+  private FraudPreventionAssessment() {}
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(UnusedPrivateParameter unused) {
+    return new FraudPreventionAssessment();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+    return this.unknownFields;
+  }
+
+  public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+    return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+        .internal_static_google_cloud_recaptchaenterprise_v1beta1_FraudPreventionAssessment_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+        .internal_static_google_cloud_recaptchaenterprise_v1beta1_FraudPreventionAssessment_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.class,
+            com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.Builder.class);
+  }
+
+  public interface StolenInstrumentVerdictOrBuilder
+      extends
+      // @@protoc_insertion_point(interface_extends:google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     *
+     *
+     * <pre>
+     * Probability (0-1) of this transaction being executed with a stolen
+     * instrument.
+     * </pre>
+     *
+     * <code>float risk = 1;</code>
+     *
+     * @return The risk.
+     */
+    float getRisk();
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Information about stolen instrument fraud, where the user is not the
+   * legitimate owner of the instrument being used for the purchase.
+   * </pre>
+   *
+   * Protobuf type {@code
+   * google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict}
+   */
+  public static final class StolenInstrumentVerdict extends com.google.protobuf.GeneratedMessageV3
+      implements
+      // @@protoc_insertion_point(message_implements:google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict)
+      StolenInstrumentVerdictOrBuilder {
+    private static final long serialVersionUID = 0L;
+    // Use StolenInstrumentVerdict.newBuilder() to construct.
+    private StolenInstrumentVerdict(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+
+    private StolenInstrumentVerdict() {}
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(UnusedPrivateParameter unused) {
+      return new StolenInstrumentVerdict();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+      return this.unknownFields;
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+      return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+          .internal_static_google_cloud_recaptchaenterprise_v1beta1_FraudPreventionAssessment_StolenInstrumentVerdict_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+          .internal_static_google_cloud_recaptchaenterprise_v1beta1_FraudPreventionAssessment_StolenInstrumentVerdict_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+                  .StolenInstrumentVerdict.class,
+              com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+                  .StolenInstrumentVerdict.Builder.class);
+    }
+
+    public static final int RISK_FIELD_NUMBER = 1;
+    private float risk_ = 0F;
+    /**
+     *
+     *
+     * <pre>
+     * Probability (0-1) of this transaction being executed with a stolen
+     * instrument.
+     * </pre>
+     *
+     * <code>float risk = 1;</code>
+     *
+     * @return The risk.
+     */
+    @java.lang.Override
+    public float getRisk() {
+      return risk_;
+    }
+
+    private byte memoizedIsInitialized = -1;
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
+      if (java.lang.Float.floatToRawIntBits(risk_) != 0) {
+        output.writeFloat(1, risk_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (java.lang.Float.floatToRawIntBits(risk_) != 0) {
+        size += com.google.protobuf.CodedOutputStream.computeFloatSize(1, risk_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+        return true;
+      }
+      if (!(obj
+          instanceof
+          com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+              .StolenInstrumentVerdict)) {
+        return super.equals(obj);
+      }
+      com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict
+          other =
+              (com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+                      .StolenInstrumentVerdict)
+                  obj;
+
+      if (java.lang.Float.floatToIntBits(getRisk())
+          != java.lang.Float.floatToIntBits(other.getRisk())) return false;
+      if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + RISK_FIELD_NUMBER;
+      hash = (53 * hash) + java.lang.Float.floatToIntBits(getRisk());
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .StolenInstrumentVerdict
+        parseFrom(java.nio.ByteBuffer data)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .StolenInstrumentVerdict
+        parseFrom(
+            java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .StolenInstrumentVerdict
+        parseFrom(com.google.protobuf.ByteString data)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .StolenInstrumentVerdict
+        parseFrom(
+            com.google.protobuf.ByteString data,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .StolenInstrumentVerdict
+        parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .StolenInstrumentVerdict
+        parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .StolenInstrumentVerdict
+        parseFrom(java.io.InputStream input) throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .StolenInstrumentVerdict
+        parseFrom(
+            java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseWithIOException(
+          PARSER, input, extensionRegistry);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .StolenInstrumentVerdict
+        parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .StolenInstrumentVerdict
+        parseDelimitedFrom(
+            java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(
+          PARSER, input, extensionRegistry);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .StolenInstrumentVerdict
+        parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .StolenInstrumentVerdict
+        parseFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseWithIOException(
+          PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() {
+      return newBuilder();
+    }
+
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+
+    public static Builder newBuilder(
+        com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict
+            prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about stolen instrument fraud, where the user is not the
+     * legitimate owner of the instrument being used for the purchase.
+     * </pre>
+     *
+     * Protobuf type {@code
+     * google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict}
+     */
+    public static final class Builder
+        extends com.google.protobuf.GeneratedMessageV3.Builder<Builder>
+        implements
+        // @@protoc_insertion_point(builder_implements:google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict)
+        com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .StolenInstrumentVerdictOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+        return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+            .internal_static_google_cloud_recaptchaenterprise_v1beta1_FraudPreventionAssessment_StolenInstrumentVerdict_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+            .internal_static_google_cloud_recaptchaenterprise_v1beta1_FraudPreventionAssessment_StolenInstrumentVerdict_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+                    .StolenInstrumentVerdict.class,
+                com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+                    .StolenInstrumentVerdict.Builder.class);
+      }
+
+      // Construct using
+      // com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict.newBuilder()
+      private Builder() {}
+
+      private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+      }
+
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        bitField0_ = 0;
+        risk_ = 0F;
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+        return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+            .internal_static_google_cloud_recaptchaenterprise_v1beta1_FraudPreventionAssessment_StolenInstrumentVerdict_descriptor;
+      }
+
+      @java.lang.Override
+      public com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+              .StolenInstrumentVerdict
+          getDefaultInstanceForType() {
+        return com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .StolenInstrumentVerdict.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+              .StolenInstrumentVerdict
+          build() {
+        com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict
+            result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+              .StolenInstrumentVerdict
+          buildPartial() {
+        com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict
+            result =
+                new com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+                    .StolenInstrumentVerdict(this);
+        if (bitField0_ != 0) {
+          buildPartial0(result);
+        }
+        onBuilt();
+        return result;
+      }
+
+      private void buildPartial0(
+          com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict
+              result) {
+        int from_bitField0_ = bitField0_;
+        if (((from_bitField0_ & 0x00000001) != 0)) {
+          result.risk_ = risk_;
+        }
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+        return super.setField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+
+      @java.lang.Override
+      public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index,
+          java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other
+            instanceof
+            com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+                .StolenInstrumentVerdict) {
+          return mergeFrom(
+              (com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+                      .StolenInstrumentVerdict)
+                  other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(
+          com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict
+              other) {
+        if (other
+            == com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+                .StolenInstrumentVerdict.getDefaultInstance()) return this;
+        if (other.getRisk() != 0F) {
+          setRisk(other.getRisk());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 13:
+                {
+                  risk_ = input.readFloat();
+                  bitField0_ |= 0x00000001;
+                  break;
+                } // case 13
+              default:
+                {
+                  if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                    done = true; // was an endgroup tag
+                  }
+                  break;
+                } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+
+      private int bitField0_;
+
+      private float risk_;
+      /**
+       *
+       *
+       * <pre>
+       * Probability (0-1) of this transaction being executed with a stolen
+       * instrument.
+       * </pre>
+       *
+       * <code>float risk = 1;</code>
+       *
+       * @return The risk.
+       */
+      @java.lang.Override
+      public float getRisk() {
+        return risk_;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * Probability (0-1) of this transaction being executed with a stolen
+       * instrument.
+       * </pre>
+       *
+       * <code>float risk = 1;</code>
+       *
+       * @param value The risk to set.
+       * @return This builder for chaining.
+       */
+      public Builder setRisk(float value) {
+
+        risk_ = value;
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * Probability (0-1) of this transaction being executed with a stolen
+       * instrument.
+       * </pre>
+       *
+       * <code>float risk = 1;</code>
+       *
+       * @return This builder for chaining.
+       */
+      public Builder clearRisk() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        risk_ = 0F;
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+      // @@protoc_insertion_point(builder_scope:google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict)
+    }
+
+    // @@protoc_insertion_point(class_scope:google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict)
+    private static final com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .StolenInstrumentVerdict
+        DEFAULT_INSTANCE;
+
+    static {
+      DEFAULT_INSTANCE =
+          new com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+              .StolenInstrumentVerdict();
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .StolenInstrumentVerdict
+        getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<StolenInstrumentVerdict> PARSER =
+        new com.google.protobuf.AbstractParser<StolenInstrumentVerdict>() {
+          @java.lang.Override
+          public StolenInstrumentVerdict parsePartialFrom(
+              com.google.protobuf.CodedInputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            Builder builder = newBuilder();
+            try {
+              builder.mergeFrom(input, extensionRegistry);
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+              throw e.setUnfinishedMessage(builder.buildPartial());
+            } catch (com.google.protobuf.UninitializedMessageException e) {
+              throw e.asInvalidProtocolBufferException()
+                  .setUnfinishedMessage(builder.buildPartial());
+            } catch (java.io.IOException e) {
+              throw new com.google.protobuf.InvalidProtocolBufferException(e)
+                  .setUnfinishedMessage(builder.buildPartial());
+            }
+            return builder.buildPartial();
+          }
+        };
+
+    public static com.google.protobuf.Parser<StolenInstrumentVerdict> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<StolenInstrumentVerdict> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict
+        getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+  }
+
+  public interface CardTestingVerdictOrBuilder
+      extends
+      // @@protoc_insertion_point(interface_extends:google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     *
+     *
+     * <pre>
+     * Probability (0-1) of this transaction attempt being part of a card
+     * testing attack.
+     * </pre>
+     *
+     * <code>float risk = 1;</code>
+     *
+     * @return The risk.
+     */
+    float getRisk();
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Information about card testing fraud, where an adversary is testing
+   * fraudulently obtained cards or brute forcing their details.
+   * </pre>
+   *
+   * Protobuf type {@code
+   * google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict}
+   */
+  public static final class CardTestingVerdict extends com.google.protobuf.GeneratedMessageV3
+      implements
+      // @@protoc_insertion_point(message_implements:google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict)
+      CardTestingVerdictOrBuilder {
+    private static final long serialVersionUID = 0L;
+    // Use CardTestingVerdict.newBuilder() to construct.
+    private CardTestingVerdict(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+
+    private CardTestingVerdict() {}
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(UnusedPrivateParameter unused) {
+      return new CardTestingVerdict();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+      return this.unknownFields;
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+      return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+          .internal_static_google_cloud_recaptchaenterprise_v1beta1_FraudPreventionAssessment_CardTestingVerdict_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+          .internal_static_google_cloud_recaptchaenterprise_v1beta1_FraudPreventionAssessment_CardTestingVerdict_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict
+                  .class,
+              com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict
+                  .Builder.class);
+    }
+
+    public static final int RISK_FIELD_NUMBER = 1;
+    private float risk_ = 0F;
+    /**
+     *
+     *
+     * <pre>
+     * Probability (0-1) of this transaction attempt being part of a card
+     * testing attack.
+     * </pre>
+     *
+     * <code>float risk = 1;</code>
+     *
+     * @return The risk.
+     */
+    @java.lang.Override
+    public float getRisk() {
+      return risk_;
+    }
+
+    private byte memoizedIsInitialized = -1;
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
+      if (java.lang.Float.floatToRawIntBits(risk_) != 0) {
+        output.writeFloat(1, risk_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (java.lang.Float.floatToRawIntBits(risk_) != 0) {
+        size += com.google.protobuf.CodedOutputStream.computeFloatSize(1, risk_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+        return true;
+      }
+      if (!(obj
+          instanceof
+          com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict)) {
+        return super.equals(obj);
+      }
+      com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict other =
+          (com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict) obj;
+
+      if (java.lang.Float.floatToIntBits(getRisk())
+          != java.lang.Float.floatToIntBits(other.getRisk())) return false;
+      if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + RISK_FIELD_NUMBER;
+      hash = (53 * hash) + java.lang.Float.floatToIntBits(getRisk());
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .CardTestingVerdict
+        parseFrom(java.nio.ByteBuffer data)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .CardTestingVerdict
+        parseFrom(
+            java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .CardTestingVerdict
+        parseFrom(com.google.protobuf.ByteString data)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .CardTestingVerdict
+        parseFrom(
+            com.google.protobuf.ByteString data,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .CardTestingVerdict
+        parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .CardTestingVerdict
+        parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .CardTestingVerdict
+        parseFrom(java.io.InputStream input) throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .CardTestingVerdict
+        parseFrom(
+            java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseWithIOException(
+          PARSER, input, extensionRegistry);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .CardTestingVerdict
+        parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .CardTestingVerdict
+        parseDelimitedFrom(
+            java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(
+          PARSER, input, extensionRegistry);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .CardTestingVerdict
+        parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .CardTestingVerdict
+        parseFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseWithIOException(
+          PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() {
+      return newBuilder();
+    }
+
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+
+    public static Builder newBuilder(
+        com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict
+            prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about card testing fraud, where an adversary is testing
+     * fraudulently obtained cards or brute forcing their details.
+     * </pre>
+     *
+     * Protobuf type {@code
+     * google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict}
+     */
+    public static final class Builder
+        extends com.google.protobuf.GeneratedMessageV3.Builder<Builder>
+        implements
+        // @@protoc_insertion_point(builder_implements:google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict)
+        com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .CardTestingVerdictOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+        return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+            .internal_static_google_cloud_recaptchaenterprise_v1beta1_FraudPreventionAssessment_CardTestingVerdict_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+            .internal_static_google_cloud_recaptchaenterprise_v1beta1_FraudPreventionAssessment_CardTestingVerdict_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict
+                    .class,
+                com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict
+                    .Builder.class);
+      }
+
+      // Construct using
+      // com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict.newBuilder()
+      private Builder() {}
+
+      private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+      }
+
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        bitField0_ = 0;
+        risk_ = 0F;
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+        return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+            .internal_static_google_cloud_recaptchaenterprise_v1beta1_FraudPreventionAssessment_CardTestingVerdict_descriptor;
+      }
+
+      @java.lang.Override
+      public com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict
+          getDefaultInstanceForType() {
+        return com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict
+            .getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict
+          build() {
+        com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict result =
+            buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict
+          buildPartial() {
+        com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict result =
+            new com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict(
+                this);
+        if (bitField0_ != 0) {
+          buildPartial0(result);
+        }
+        onBuilt();
+        return result;
+      }
+
+      private void buildPartial0(
+          com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict
+              result) {
+        int from_bitField0_ = bitField0_;
+        if (((from_bitField0_ & 0x00000001) != 0)) {
+          result.risk_ = risk_;
+        }
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+        return super.setField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+
+      @java.lang.Override
+      public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index,
+          java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other
+            instanceof
+            com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict) {
+          return mergeFrom(
+              (com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict)
+                  other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(
+          com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict
+              other) {
+        if (other
+            == com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict
+                .getDefaultInstance()) return this;
+        if (other.getRisk() != 0F) {
+          setRisk(other.getRisk());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 13:
+                {
+                  risk_ = input.readFloat();
+                  bitField0_ |= 0x00000001;
+                  break;
+                } // case 13
+              default:
+                {
+                  if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                    done = true; // was an endgroup tag
+                  }
+                  break;
+                } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+
+      private int bitField0_;
+
+      private float risk_;
+      /**
+       *
+       *
+       * <pre>
+       * Probability (0-1) of this transaction attempt being part of a card
+       * testing attack.
+       * </pre>
+       *
+       * <code>float risk = 1;</code>
+       *
+       * @return The risk.
+       */
+      @java.lang.Override
+      public float getRisk() {
+        return risk_;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * Probability (0-1) of this transaction attempt being part of a card
+       * testing attack.
+       * </pre>
+       *
+       * <code>float risk = 1;</code>
+       *
+       * @param value The risk to set.
+       * @return This builder for chaining.
+       */
+      public Builder setRisk(float value) {
+
+        risk_ = value;
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * Probability (0-1) of this transaction attempt being part of a card
+       * testing attack.
+       * </pre>
+       *
+       * <code>float risk = 1;</code>
+       *
+       * @return This builder for chaining.
+       */
+      public Builder clearRisk() {
+        bitField0_ = (bitField0_ & ~0x00000001);
+        risk_ = 0F;
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+      // @@protoc_insertion_point(builder_scope:google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict)
+    }
+
+    // @@protoc_insertion_point(class_scope:google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict)
+    private static final com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .CardTestingVerdict
+        DEFAULT_INSTANCE;
+
+    static {
+      DEFAULT_INSTANCE =
+          new com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict();
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .CardTestingVerdict
+        getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<CardTestingVerdict> PARSER =
+        new com.google.protobuf.AbstractParser<CardTestingVerdict>() {
+          @java.lang.Override
+          public CardTestingVerdict parsePartialFrom(
+              com.google.protobuf.CodedInputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            Builder builder = newBuilder();
+            try {
+              builder.mergeFrom(input, extensionRegistry);
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+              throw e.setUnfinishedMessage(builder.buildPartial());
+            } catch (com.google.protobuf.UninitializedMessageException e) {
+              throw e.asInvalidProtocolBufferException()
+                  .setUnfinishedMessage(builder.buildPartial());
+            } catch (java.io.IOException e) {
+              throw new com.google.protobuf.InvalidProtocolBufferException(e)
+                  .setUnfinishedMessage(builder.buildPartial());
+            }
+            return builder.buildPartial();
+          }
+        };
+
+    public static com.google.protobuf.Parser<CardTestingVerdict> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<CardTestingVerdict> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict
+        getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+  }
+
+  public static final int TRANSACTION_RISK_FIELD_NUMBER = 1;
+  private float transactionRisk_ = 0F;
+  /**
+   *
+   *
+   * <pre>
+   * Probability (0-1) of this transaction being fraudulent. Summarizes the
+   * combined risk of attack vectors below.
+   * </pre>
+   *
+   * <code>float transaction_risk = 1;</code>
+   *
+   * @return The transactionRisk.
+   */
+  @java.lang.Override
+  public float getTransactionRisk() {
+    return transactionRisk_;
+  }
+
+  public static final int STOLEN_INSTRUMENT_VERDICT_FIELD_NUMBER = 2;
+  private com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict
+      stolenInstrumentVerdict_;
+  /**
+   *
+   *
+   * <pre>
+   * Assessment of this transaction for risk of a stolen instrument.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict stolen_instrument_verdict = 2;
+   * </code>
+   *
+   * @return Whether the stolenInstrumentVerdict field is set.
+   */
+  @java.lang.Override
+  public boolean hasStolenInstrumentVerdict() {
+    return stolenInstrumentVerdict_ != null;
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Assessment of this transaction for risk of a stolen instrument.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict stolen_instrument_verdict = 2;
+   * </code>
+   *
+   * @return The stolenInstrumentVerdict.
+   */
+  @java.lang.Override
+  public com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict
+      getStolenInstrumentVerdict() {
+    return stolenInstrumentVerdict_ == null
+        ? com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict
+            .getDefaultInstance()
+        : stolenInstrumentVerdict_;
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Assessment of this transaction for risk of a stolen instrument.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict stolen_instrument_verdict = 2;
+   * </code>
+   */
+  @java.lang.Override
+  public com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+          .StolenInstrumentVerdictOrBuilder
+      getStolenInstrumentVerdictOrBuilder() {
+    return stolenInstrumentVerdict_ == null
+        ? com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict
+            .getDefaultInstance()
+        : stolenInstrumentVerdict_;
+  }
+
+  public static final int CARD_TESTING_VERDICT_FIELD_NUMBER = 3;
+  private com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict
+      cardTestingVerdict_;
+  /**
+   *
+   *
+   * <pre>
+   * Assessment of this transaction for risk of being part of a card testing
+   * attack.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict card_testing_verdict = 3;
+   * </code>
+   *
+   * @return Whether the cardTestingVerdict field is set.
+   */
+  @java.lang.Override
+  public boolean hasCardTestingVerdict() {
+    return cardTestingVerdict_ != null;
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Assessment of this transaction for risk of being part of a card testing
+   * attack.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict card_testing_verdict = 3;
+   * </code>
+   *
+   * @return The cardTestingVerdict.
+   */
+  @java.lang.Override
+  public com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict
+      getCardTestingVerdict() {
+    return cardTestingVerdict_ == null
+        ? com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict
+            .getDefaultInstance()
+        : cardTestingVerdict_;
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Assessment of this transaction for risk of being part of a card testing
+   * attack.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict card_testing_verdict = 3;
+   * </code>
+   */
+  @java.lang.Override
+  public com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+          .CardTestingVerdictOrBuilder
+      getCardTestingVerdictOrBuilder() {
+    return cardTestingVerdict_ == null
+        ? com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict
+            .getDefaultInstance()
+        : cardTestingVerdict_;
+  }
+
+  private byte memoizedIsInitialized = -1;
+
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
+    if (java.lang.Float.floatToRawIntBits(transactionRisk_) != 0) {
+      output.writeFloat(1, transactionRisk_);
+    }
+    if (stolenInstrumentVerdict_ != null) {
+      output.writeMessage(2, getStolenInstrumentVerdict());
+    }
+    if (cardTestingVerdict_ != null) {
+      output.writeMessage(3, getCardTestingVerdict());
+    }
+    getUnknownFields().writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (java.lang.Float.floatToRawIntBits(transactionRisk_) != 0) {
+      size += com.google.protobuf.CodedOutputStream.computeFloatSize(1, transactionRisk_);
+    }
+    if (stolenInstrumentVerdict_ != null) {
+      size +=
+          com.google.protobuf.CodedOutputStream.computeMessageSize(2, getStolenInstrumentVerdict());
+    }
+    if (cardTestingVerdict_ != null) {
+      size += com.google.protobuf.CodedOutputStream.computeMessageSize(3, getCardTestingVerdict());
+    }
+    size += getUnknownFields().getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+      return true;
+    }
+    if (!(obj instanceof com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment)) {
+      return super.equals(obj);
+    }
+    com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment other =
+        (com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment) obj;
+
+    if (java.lang.Float.floatToIntBits(getTransactionRisk())
+        != java.lang.Float.floatToIntBits(other.getTransactionRisk())) return false;
+    if (hasStolenInstrumentVerdict() != other.hasStolenInstrumentVerdict()) return false;
+    if (hasStolenInstrumentVerdict()) {
+      if (!getStolenInstrumentVerdict().equals(other.getStolenInstrumentVerdict())) return false;
+    }
+    if (hasCardTestingVerdict() != other.hasCardTestingVerdict()) return false;
+    if (hasCardTestingVerdict()) {
+      if (!getCardTestingVerdict().equals(other.getCardTestingVerdict())) return false;
+    }
+    if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    hash = (37 * hash) + TRANSACTION_RISK_FIELD_NUMBER;
+    hash = (53 * hash) + java.lang.Float.floatToIntBits(getTransactionRisk());
+    if (hasStolenInstrumentVerdict()) {
+      hash = (37 * hash) + STOLEN_INSTRUMENT_VERDICT_FIELD_NUMBER;
+      hash = (53 * hash) + getStolenInstrumentVerdict().hashCode();
+    }
+    if (hasCardTestingVerdict()) {
+      hash = (37 * hash) + CARD_TESTING_VERDICT_FIELD_NUMBER;
+      hash = (53 * hash) + getCardTestingVerdict().hashCode();
+    }
+    hash = (29 * hash) + getUnknownFields().hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment parseFrom(
+      java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment parseFrom(
+      java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment parseFrom(
+      byte[] data) throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment parseFrom(
+      byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment parseFrom(
+      java.io.InputStream input) throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment parseFrom(
+      java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3.parseWithIOException(
+        PARSER, input, extensionRegistry);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment parseDelimitedFrom(
+      java.io.InputStream input) throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment parseDelimitedFrom(
+      java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(
+        PARSER, input, extensionRegistry);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment parseFrom(
+      com.google.protobuf.CodedInputStream input) throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3.parseWithIOException(
+        PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() {
+    return newBuilder();
+  }
+
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+
+  public static Builder newBuilder(
+      com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Assessment for Fraud Prevention.
+   * </pre>
+   *
+   * Protobuf type {@code google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment}
+   */
+  public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder<Builder>
+      implements
+      // @@protoc_insertion_point(builder_implements:google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment)
+      com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessmentOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+      return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+          .internal_static_google_cloud_recaptchaenterprise_v1beta1_FraudPreventionAssessment_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+          .internal_static_google_cloud_recaptchaenterprise_v1beta1_FraudPreventionAssessment_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.class,
+              com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.Builder.class);
+    }
+
+    // Construct using com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.newBuilder()
+    private Builder() {}
+
+    private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+    }
+
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      bitField0_ = 0;
+      transactionRisk_ = 0F;
+      stolenInstrumentVerdict_ = null;
+      if (stolenInstrumentVerdictBuilder_ != null) {
+        stolenInstrumentVerdictBuilder_.dispose();
+        stolenInstrumentVerdictBuilder_ = null;
+      }
+      cardTestingVerdict_ = null;
+      if (cardTestingVerdictBuilder_ != null) {
+        cardTestingVerdictBuilder_.dispose();
+        cardTestingVerdictBuilder_ = null;
+      }
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+      return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+          .internal_static_google_cloud_recaptchaenterprise_v1beta1_FraudPreventionAssessment_descriptor;
+    }
+
+    @java.lang.Override
+    public com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+        getDefaultInstanceForType() {
+      return com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment build() {
+      com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment buildPartial() {
+      com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment result =
+          new com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment(this);
+      if (bitField0_ != 0) {
+        buildPartial0(result);
+      }
+      onBuilt();
+      return result;
+    }
+
+    private void buildPartial0(
+        com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment result) {
+      int from_bitField0_ = bitField0_;
+      if (((from_bitField0_ & 0x00000001) != 0)) {
+        result.transactionRisk_ = transactionRisk_;
+      }
+      if (((from_bitField0_ & 0x00000002) != 0)) {
+        result.stolenInstrumentVerdict_ =
+            stolenInstrumentVerdictBuilder_ == null
+                ? stolenInstrumentVerdict_
+                : stolenInstrumentVerdictBuilder_.build();
+      }
+      if (((from_bitField0_ & 0x00000004) != 0)) {
+        result.cardTestingVerdict_ =
+            cardTestingVerdictBuilder_ == null
+                ? cardTestingVerdict_
+                : cardTestingVerdictBuilder_.build();
+      }
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+      return super.setField(field, value);
+    }
+
+    @java.lang.Override
+    public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+
+    @java.lang.Override
+    public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment) {
+        return mergeFrom((com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment) other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(
+        com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment other) {
+      if (other
+          == com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.getDefaultInstance())
+        return this;
+      if (other.getTransactionRisk() != 0F) {
+        setTransactionRisk(other.getTransactionRisk());
+      }
+      if (other.hasStolenInstrumentVerdict()) {
+        mergeStolenInstrumentVerdict(other.getStolenInstrumentVerdict());
+      }
+      if (other.hasCardTestingVerdict()) {
+        mergeCardTestingVerdict(other.getCardTestingVerdict());
+      }
+      this.mergeUnknownFields(other.getUnknownFields());
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
+      }
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 13:
+              {
+                transactionRisk_ = input.readFloat();
+                bitField0_ |= 0x00000001;
+                break;
+              } // case 13
+            case 18:
+              {
+                input.readMessage(
+                    getStolenInstrumentVerdictFieldBuilder().getBuilder(), extensionRegistry);
+                bitField0_ |= 0x00000002;
+                break;
+              } // case 18
+            case 26:
+              {
+                input.readMessage(
+                    getCardTestingVerdictFieldBuilder().getBuilder(), extensionRegistry);
+                bitField0_ |= 0x00000004;
+                break;
+              } // case 26
+            default:
+              {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+          } // switch (tag)
+        } // while (!done)
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.unwrapIOException();
+      } finally {
+        onChanged();
+      } // finally
+      return this;
+    }
+
+    private int bitField0_;
+
+    private float transactionRisk_;
+    /**
+     *
+     *
+     * <pre>
+     * Probability (0-1) of this transaction being fraudulent. Summarizes the
+     * combined risk of attack vectors below.
+     * </pre>
+     *
+     * <code>float transaction_risk = 1;</code>
+     *
+     * @return The transactionRisk.
+     */
+    @java.lang.Override
+    public float getTransactionRisk() {
+      return transactionRisk_;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Probability (0-1) of this transaction being fraudulent. Summarizes the
+     * combined risk of attack vectors below.
+     * </pre>
+     *
+     * <code>float transaction_risk = 1;</code>
+     *
+     * @param value The transactionRisk to set.
+     * @return This builder for chaining.
+     */
+    public Builder setTransactionRisk(float value) {
+
+      transactionRisk_ = value;
+      bitField0_ |= 0x00000001;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Probability (0-1) of this transaction being fraudulent. Summarizes the
+     * combined risk of attack vectors below.
+     * </pre>
+     *
+     * <code>float transaction_risk = 1;</code>
+     *
+     * @return This builder for chaining.
+     */
+    public Builder clearTransactionRisk() {
+      bitField0_ = (bitField0_ & ~0x00000001);
+      transactionRisk_ = 0F;
+      onChanged();
+      return this;
+    }
+
+    private com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict
+        stolenInstrumentVerdict_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+            com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+                .StolenInstrumentVerdict,
+            com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict
+                .Builder,
+            com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+                .StolenInstrumentVerdictOrBuilder>
+        stolenInstrumentVerdictBuilder_;
+    /**
+     *
+     *
+     * <pre>
+     * Assessment of this transaction for risk of a stolen instrument.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict stolen_instrument_verdict = 2;
+     * </code>
+     *
+     * @return Whether the stolenInstrumentVerdict field is set.
+     */
+    public boolean hasStolenInstrumentVerdict() {
+      return ((bitField0_ & 0x00000002) != 0);
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Assessment of this transaction for risk of a stolen instrument.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict stolen_instrument_verdict = 2;
+     * </code>
+     *
+     * @return The stolenInstrumentVerdict.
+     */
+    public com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict
+        getStolenInstrumentVerdict() {
+      if (stolenInstrumentVerdictBuilder_ == null) {
+        return stolenInstrumentVerdict_ == null
+            ? com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+                .StolenInstrumentVerdict.getDefaultInstance()
+            : stolenInstrumentVerdict_;
+      } else {
+        return stolenInstrumentVerdictBuilder_.getMessage();
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Assessment of this transaction for risk of a stolen instrument.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict stolen_instrument_verdict = 2;
+     * </code>
+     */
+    public Builder setStolenInstrumentVerdict(
+        com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict
+            value) {
+      if (stolenInstrumentVerdictBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        stolenInstrumentVerdict_ = value;
+      } else {
+        stolenInstrumentVerdictBuilder_.setMessage(value);
+      }
+      bitField0_ |= 0x00000002;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Assessment of this transaction for risk of a stolen instrument.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict stolen_instrument_verdict = 2;
+     * </code>
+     */
+    public Builder setStolenInstrumentVerdict(
+        com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict
+                .Builder
+            builderForValue) {
+      if (stolenInstrumentVerdictBuilder_ == null) {
+        stolenInstrumentVerdict_ = builderForValue.build();
+      } else {
+        stolenInstrumentVerdictBuilder_.setMessage(builderForValue.build());
+      }
+      bitField0_ |= 0x00000002;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Assessment of this transaction for risk of a stolen instrument.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict stolen_instrument_verdict = 2;
+     * </code>
+     */
+    public Builder mergeStolenInstrumentVerdict(
+        com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict
+            value) {
+      if (stolenInstrumentVerdictBuilder_ == null) {
+        if (((bitField0_ & 0x00000002) != 0)
+            && stolenInstrumentVerdict_ != null
+            && stolenInstrumentVerdict_
+                != com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+                    .StolenInstrumentVerdict.getDefaultInstance()) {
+          getStolenInstrumentVerdictBuilder().mergeFrom(value);
+        } else {
+          stolenInstrumentVerdict_ = value;
+        }
+      } else {
+        stolenInstrumentVerdictBuilder_.mergeFrom(value);
+      }
+      bitField0_ |= 0x00000002;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Assessment of this transaction for risk of a stolen instrument.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict stolen_instrument_verdict = 2;
+     * </code>
+     */
+    public Builder clearStolenInstrumentVerdict() {
+      bitField0_ = (bitField0_ & ~0x00000002);
+      stolenInstrumentVerdict_ = null;
+      if (stolenInstrumentVerdictBuilder_ != null) {
+        stolenInstrumentVerdictBuilder_.dispose();
+        stolenInstrumentVerdictBuilder_ = null;
+      }
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Assessment of this transaction for risk of a stolen instrument.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict stolen_instrument_verdict = 2;
+     * </code>
+     */
+    public com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict
+            .Builder
+        getStolenInstrumentVerdictBuilder() {
+      bitField0_ |= 0x00000002;
+      onChanged();
+      return getStolenInstrumentVerdictFieldBuilder().getBuilder();
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Assessment of this transaction for risk of a stolen instrument.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict stolen_instrument_verdict = 2;
+     * </code>
+     */
+    public com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .StolenInstrumentVerdictOrBuilder
+        getStolenInstrumentVerdictOrBuilder() {
+      if (stolenInstrumentVerdictBuilder_ != null) {
+        return stolenInstrumentVerdictBuilder_.getMessageOrBuilder();
+      } else {
+        return stolenInstrumentVerdict_ == null
+            ? com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+                .StolenInstrumentVerdict.getDefaultInstance()
+            : stolenInstrumentVerdict_;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Assessment of this transaction for risk of a stolen instrument.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict stolen_instrument_verdict = 2;
+     * </code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+            com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+                .StolenInstrumentVerdict,
+            com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict
+                .Builder,
+            com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+                .StolenInstrumentVerdictOrBuilder>
+        getStolenInstrumentVerdictFieldBuilder() {
+      if (stolenInstrumentVerdictBuilder_ == null) {
+        stolenInstrumentVerdictBuilder_ =
+            new com.google.protobuf.SingleFieldBuilderV3<
+                com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+                    .StolenInstrumentVerdict,
+                com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+                    .StolenInstrumentVerdict.Builder,
+                com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+                    .StolenInstrumentVerdictOrBuilder>(
+                getStolenInstrumentVerdict(), getParentForChildren(), isClean());
+        stolenInstrumentVerdict_ = null;
+      }
+      return stolenInstrumentVerdictBuilder_;
+    }
+
+    private com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict
+        cardTestingVerdict_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+            com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict,
+            com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict
+                .Builder,
+            com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+                .CardTestingVerdictOrBuilder>
+        cardTestingVerdictBuilder_;
+    /**
+     *
+     *
+     * <pre>
+     * Assessment of this transaction for risk of being part of a card testing
+     * attack.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict card_testing_verdict = 3;
+     * </code>
+     *
+     * @return Whether the cardTestingVerdict field is set.
+     */
+    public boolean hasCardTestingVerdict() {
+      return ((bitField0_ & 0x00000004) != 0);
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Assessment of this transaction for risk of being part of a card testing
+     * attack.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict card_testing_verdict = 3;
+     * </code>
+     *
+     * @return The cardTestingVerdict.
+     */
+    public com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict
+        getCardTestingVerdict() {
+      if (cardTestingVerdictBuilder_ == null) {
+        return cardTestingVerdict_ == null
+            ? com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict
+                .getDefaultInstance()
+            : cardTestingVerdict_;
+      } else {
+        return cardTestingVerdictBuilder_.getMessage();
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Assessment of this transaction for risk of being part of a card testing
+     * attack.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict card_testing_verdict = 3;
+     * </code>
+     */
+    public Builder setCardTestingVerdict(
+        com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict value) {
+      if (cardTestingVerdictBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        cardTestingVerdict_ = value;
+      } else {
+        cardTestingVerdictBuilder_.setMessage(value);
+      }
+      bitField0_ |= 0x00000004;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Assessment of this transaction for risk of being part of a card testing
+     * attack.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict card_testing_verdict = 3;
+     * </code>
+     */
+    public Builder setCardTestingVerdict(
+        com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict.Builder
+            builderForValue) {
+      if (cardTestingVerdictBuilder_ == null) {
+        cardTestingVerdict_ = builderForValue.build();
+      } else {
+        cardTestingVerdictBuilder_.setMessage(builderForValue.build());
+      }
+      bitField0_ |= 0x00000004;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Assessment of this transaction for risk of being part of a card testing
+     * attack.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict card_testing_verdict = 3;
+     * </code>
+     */
+    public Builder mergeCardTestingVerdict(
+        com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict value) {
+      if (cardTestingVerdictBuilder_ == null) {
+        if (((bitField0_ & 0x00000004) != 0)
+            && cardTestingVerdict_ != null
+            && cardTestingVerdict_
+                != com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+                    .CardTestingVerdict.getDefaultInstance()) {
+          getCardTestingVerdictBuilder().mergeFrom(value);
+        } else {
+          cardTestingVerdict_ = value;
+        }
+      } else {
+        cardTestingVerdictBuilder_.mergeFrom(value);
+      }
+      bitField0_ |= 0x00000004;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Assessment of this transaction for risk of being part of a card testing
+     * attack.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict card_testing_verdict = 3;
+     * </code>
+     */
+    public Builder clearCardTestingVerdict() {
+      bitField0_ = (bitField0_ & ~0x00000004);
+      cardTestingVerdict_ = null;
+      if (cardTestingVerdictBuilder_ != null) {
+        cardTestingVerdictBuilder_.dispose();
+        cardTestingVerdictBuilder_ = null;
+      }
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Assessment of this transaction for risk of being part of a card testing
+     * attack.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict card_testing_verdict = 3;
+     * </code>
+     */
+    public com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict
+            .Builder
+        getCardTestingVerdictBuilder() {
+      bitField0_ |= 0x00000004;
+      onChanged();
+      return getCardTestingVerdictFieldBuilder().getBuilder();
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Assessment of this transaction for risk of being part of a card testing
+     * attack.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict card_testing_verdict = 3;
+     * </code>
+     */
+    public com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+            .CardTestingVerdictOrBuilder
+        getCardTestingVerdictOrBuilder() {
+      if (cardTestingVerdictBuilder_ != null) {
+        return cardTestingVerdictBuilder_.getMessageOrBuilder();
+      } else {
+        return cardTestingVerdict_ == null
+            ? com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict
+                .getDefaultInstance()
+            : cardTestingVerdict_;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Assessment of this transaction for risk of being part of a card testing
+     * attack.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict card_testing_verdict = 3;
+     * </code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+            com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict,
+            com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict
+                .Builder,
+            com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+                .CardTestingVerdictOrBuilder>
+        getCardTestingVerdictFieldBuilder() {
+      if (cardTestingVerdictBuilder_ == null) {
+        cardTestingVerdictBuilder_ =
+            new com.google.protobuf.SingleFieldBuilderV3<
+                com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict,
+                com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict
+                    .Builder,
+                com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+                    .CardTestingVerdictOrBuilder>(
+                getCardTestingVerdict(), getParentForChildren(), isClean());
+        cardTestingVerdict_ = null;
+      }
+      return cardTestingVerdictBuilder_;
+    }
+
+    @java.lang.Override
+    public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+    // @@protoc_insertion_point(builder_scope:google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment)
+  }
+
+  // @@protoc_insertion_point(class_scope:google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment)
+  private static final com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+      DEFAULT_INSTANCE;
+
+  static {
+    DEFAULT_INSTANCE = new com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment();
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+      getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<FraudPreventionAssessment> PARSER =
+      new com.google.protobuf.AbstractParser<FraudPreventionAssessment>() {
+        @java.lang.Override
+        public FraudPreventionAssessment parsePartialFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          Builder builder = newBuilder();
+          try {
+            builder.mergeFrom(input, extensionRegistry);
+          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+            throw e.setUnfinishedMessage(builder.buildPartial());
+          } catch (com.google.protobuf.UninitializedMessageException e) {
+            throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+          } catch (java.io.IOException e) {
+            throw new com.google.protobuf.InvalidProtocolBufferException(e)
+                .setUnfinishedMessage(builder.buildPartial());
+          }
+          return builder.buildPartial();
+        }
+      };
+
+  public static com.google.protobuf.Parser<FraudPreventionAssessment> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<FraudPreventionAssessment> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment
+      getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+}
diff --git a/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/FraudPreventionAssessmentOrBuilder.java b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/FraudPreventionAssessmentOrBuilder.java
new file mode 100644
index 000000000000..9733ed01bc3b
--- /dev/null
+++ b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/FraudPreventionAssessmentOrBuilder.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2020 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: google/cloud/recaptchaenterprise/v1beta1/recaptchaenterprise.proto
+
+package com.google.recaptchaenterprise.v1beta1;
+
+public interface FraudPreventionAssessmentOrBuilder
+    extends
+    // @@protoc_insertion_point(interface_extends:google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   *
+   *
+   * <pre>
+   * Probability (0-1) of this transaction being fraudulent. Summarizes the
+   * combined risk of attack vectors below.
+   * </pre>
+   *
+   * <code>float transaction_risk = 1;</code>
+   *
+   * @return The transactionRisk.
+   */
+  float getTransactionRisk();
+
+  /**
+   *
+   *
+   * <pre>
+   * Assessment of this transaction for risk of a stolen instrument.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict stolen_instrument_verdict = 2;
+   * </code>
+   *
+   * @return Whether the stolenInstrumentVerdict field is set.
+   */
+  boolean hasStolenInstrumentVerdict();
+  /**
+   *
+   *
+   * <pre>
+   * Assessment of this transaction for risk of a stolen instrument.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict stolen_instrument_verdict = 2;
+   * </code>
+   *
+   * @return The stolenInstrumentVerdict.
+   */
+  com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict
+      getStolenInstrumentVerdict();
+  /**
+   *
+   *
+   * <pre>
+   * Assessment of this transaction for risk of a stolen instrument.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdict stolen_instrument_verdict = 2;
+   * </code>
+   */
+  com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.StolenInstrumentVerdictOrBuilder
+      getStolenInstrumentVerdictOrBuilder();
+
+  /**
+   *
+   *
+   * <pre>
+   * Assessment of this transaction for risk of being part of a card testing
+   * attack.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict card_testing_verdict = 3;
+   * </code>
+   *
+   * @return Whether the cardTestingVerdict field is set.
+   */
+  boolean hasCardTestingVerdict();
+  /**
+   *
+   *
+   * <pre>
+   * Assessment of this transaction for risk of being part of a card testing
+   * attack.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict card_testing_verdict = 3;
+   * </code>
+   *
+   * @return The cardTestingVerdict.
+   */
+  com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict
+      getCardTestingVerdict();
+  /**
+   *
+   *
+   * <pre>
+   * Assessment of this transaction for risk of being part of a card testing
+   * attack.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdict card_testing_verdict = 3;
+   * </code>
+   */
+  com.google.recaptchaenterprise.v1beta1.FraudPreventionAssessment.CardTestingVerdictOrBuilder
+      getCardTestingVerdictOrBuilder();
+}
diff --git a/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/PasswordLeakVerification.java b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/PasswordLeakVerification.java
index d57e756280ee..672127db5eea 100644
--- a/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/PasswordLeakVerification.java
+++ b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/PasswordLeakVerification.java
@@ -75,8 +75,8 @@ public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
    *
    *
    * <pre>
-   * Optional. Scrypt hash of the username+password that the customer wants to verify
-   * against a known password leak.
+   * Optional. Scrypt hash of the username+password that the customer wants to
+   * verify against a known password leak.
    * </pre>
    *
    * <code>bytes hashed_user_credentials = 1 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -94,7 +94,8 @@ public com.google.protobuf.ByteString getHashedUserCredentials() {
    *
    *
    * <pre>
-   * Output only. Whether or not the user's credentials are present in a known leak.
+   * Output only. Whether or not the user's credentials are present in a known
+   * leak.
    * </pre>
    *
    * <code>bool credentials_leaked = 2 [(.google.api.field_behavior) = OUTPUT_ONLY];</code>
@@ -114,9 +115,9 @@ public boolean getCredentialsLeaked() {
    *
    *
    * <pre>
-   * Optional. The username part of the user credentials for which we want to trigger a
-   * leak check in canonicalized form. This is the same data used to create the
-   * hashed_user_credentials on the customer side.
+   * Optional. The username part of the user credentials for which we want to
+   * trigger a leak check in canonicalized form. This is the same data used to
+   * create the hashed_user_credentials on the customer side.
    * </pre>
    *
    * <code>string canonicalized_username = 3 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -139,9 +140,9 @@ public java.lang.String getCanonicalizedUsername() {
    *
    *
    * <pre>
-   * Optional. The username part of the user credentials for which we want to trigger a
-   * leak check in canonicalized form. This is the same data used to create the
-   * hashed_user_credentials on the customer side.
+   * Optional. The username part of the user credentials for which we want to
+   * trigger a leak check in canonicalized form. This is the same data used to
+   * create the hashed_user_credentials on the customer side.
    * </pre>
    *
    * <code>string canonicalized_username = 3 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -558,8 +559,8 @@ public Builder mergeFrom(
      *
      *
      * <pre>
-     * Optional. Scrypt hash of the username+password that the customer wants to verify
-     * against a known password leak.
+     * Optional. Scrypt hash of the username+password that the customer wants to
+     * verify against a known password leak.
      * </pre>
      *
      * <code>bytes hashed_user_credentials = 1 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -574,8 +575,8 @@ public com.google.protobuf.ByteString getHashedUserCredentials() {
      *
      *
      * <pre>
-     * Optional. Scrypt hash of the username+password that the customer wants to verify
-     * against a known password leak.
+     * Optional. Scrypt hash of the username+password that the customer wants to
+     * verify against a known password leak.
      * </pre>
      *
      * <code>bytes hashed_user_credentials = 1 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -596,8 +597,8 @@ public Builder setHashedUserCredentials(com.google.protobuf.ByteString value) {
      *
      *
      * <pre>
-     * Optional. Scrypt hash of the username+password that the customer wants to verify
-     * against a known password leak.
+     * Optional. Scrypt hash of the username+password that the customer wants to
+     * verify against a known password leak.
      * </pre>
      *
      * <code>bytes hashed_user_credentials = 1 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -616,7 +617,8 @@ public Builder clearHashedUserCredentials() {
      *
      *
      * <pre>
-     * Output only. Whether or not the user's credentials are present in a known leak.
+     * Output only. Whether or not the user's credentials are present in a known
+     * leak.
      * </pre>
      *
      * <code>bool credentials_leaked = 2 [(.google.api.field_behavior) = OUTPUT_ONLY];</code>
@@ -631,7 +633,8 @@ public boolean getCredentialsLeaked() {
      *
      *
      * <pre>
-     * Output only. Whether or not the user's credentials are present in a known leak.
+     * Output only. Whether or not the user's credentials are present in a known
+     * leak.
      * </pre>
      *
      * <code>bool credentials_leaked = 2 [(.google.api.field_behavior) = OUTPUT_ONLY];</code>
@@ -650,7 +653,8 @@ public Builder setCredentialsLeaked(boolean value) {
      *
      *
      * <pre>
-     * Output only. Whether or not the user's credentials are present in a known leak.
+     * Output only. Whether or not the user's credentials are present in a known
+     * leak.
      * </pre>
      *
      * <code>bool credentials_leaked = 2 [(.google.api.field_behavior) = OUTPUT_ONLY];</code>
@@ -669,9 +673,9 @@ public Builder clearCredentialsLeaked() {
      *
      *
      * <pre>
-     * Optional. The username part of the user credentials for which we want to trigger a
-     * leak check in canonicalized form. This is the same data used to create the
-     * hashed_user_credentials on the customer side.
+     * Optional. The username part of the user credentials for which we want to
+     * trigger a leak check in canonicalized form. This is the same data used to
+     * create the hashed_user_credentials on the customer side.
      * </pre>
      *
      * <code>string canonicalized_username = 3 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -693,9 +697,9 @@ public java.lang.String getCanonicalizedUsername() {
      *
      *
      * <pre>
-     * Optional. The username part of the user credentials for which we want to trigger a
-     * leak check in canonicalized form. This is the same data used to create the
-     * hashed_user_credentials on the customer side.
+     * Optional. The username part of the user credentials for which we want to
+     * trigger a leak check in canonicalized form. This is the same data used to
+     * create the hashed_user_credentials on the customer side.
      * </pre>
      *
      * <code>string canonicalized_username = 3 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -717,9 +721,9 @@ public com.google.protobuf.ByteString getCanonicalizedUsernameBytes() {
      *
      *
      * <pre>
-     * Optional. The username part of the user credentials for which we want to trigger a
-     * leak check in canonicalized form. This is the same data used to create the
-     * hashed_user_credentials on the customer side.
+     * Optional. The username part of the user credentials for which we want to
+     * trigger a leak check in canonicalized form. This is the same data used to
+     * create the hashed_user_credentials on the customer side.
      * </pre>
      *
      * <code>string canonicalized_username = 3 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -740,9 +744,9 @@ public Builder setCanonicalizedUsername(java.lang.String value) {
      *
      *
      * <pre>
-     * Optional. The username part of the user credentials for which we want to trigger a
-     * leak check in canonicalized form. This is the same data used to create the
-     * hashed_user_credentials on the customer side.
+     * Optional. The username part of the user credentials for which we want to
+     * trigger a leak check in canonicalized form. This is the same data used to
+     * create the hashed_user_credentials on the customer side.
      * </pre>
      *
      * <code>string canonicalized_username = 3 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -759,9 +763,9 @@ public Builder clearCanonicalizedUsername() {
      *
      *
      * <pre>
-     * Optional. The username part of the user credentials for which we want to trigger a
-     * leak check in canonicalized form. This is the same data used to create the
-     * hashed_user_credentials on the customer side.
+     * Optional. The username part of the user credentials for which we want to
+     * trigger a leak check in canonicalized form. This is the same data used to
+     * create the hashed_user_credentials on the customer side.
      * </pre>
      *
      * <code>string canonicalized_username = 3 [(.google.api.field_behavior) = OPTIONAL];</code>
diff --git a/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/PasswordLeakVerificationOrBuilder.java b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/PasswordLeakVerificationOrBuilder.java
index fca30e3bb142..208a638f444e 100644
--- a/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/PasswordLeakVerificationOrBuilder.java
+++ b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/PasswordLeakVerificationOrBuilder.java
@@ -27,8 +27,8 @@ public interface PasswordLeakVerificationOrBuilder
    *
    *
    * <pre>
-   * Optional. Scrypt hash of the username+password that the customer wants to verify
-   * against a known password leak.
+   * Optional. Scrypt hash of the username+password that the customer wants to
+   * verify against a known password leak.
    * </pre>
    *
    * <code>bytes hashed_user_credentials = 1 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -41,7 +41,8 @@ public interface PasswordLeakVerificationOrBuilder
    *
    *
    * <pre>
-   * Output only. Whether or not the user's credentials are present in a known leak.
+   * Output only. Whether or not the user's credentials are present in a known
+   * leak.
    * </pre>
    *
    * <code>bool credentials_leaked = 2 [(.google.api.field_behavior) = OUTPUT_ONLY];</code>
@@ -54,9 +55,9 @@ public interface PasswordLeakVerificationOrBuilder
    *
    *
    * <pre>
-   * Optional. The username part of the user credentials for which we want to trigger a
-   * leak check in canonicalized form. This is the same data used to create the
-   * hashed_user_credentials on the customer side.
+   * Optional. The username part of the user credentials for which we want to
+   * trigger a leak check in canonicalized form. This is the same data used to
+   * create the hashed_user_credentials on the customer side.
    * </pre>
    *
    * <code>string canonicalized_username = 3 [(.google.api.field_behavior) = OPTIONAL];</code>
@@ -68,9 +69,9 @@ public interface PasswordLeakVerificationOrBuilder
    *
    *
    * <pre>
-   * Optional. The username part of the user credentials for which we want to trigger a
-   * leak check in canonicalized form. This is the same data used to create the
-   * hashed_user_credentials on the customer side.
+   * Optional. The username part of the user credentials for which we want to
+   * trigger a leak check in canonicalized form. This is the same data used to
+   * create the hashed_user_credentials on the customer side.
    * </pre>
    *
    * <code>string canonicalized_username = 3 [(.google.api.field_behavior) = OPTIONAL];</code>
diff --git a/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/RecaptchaEnterpriseProto.java b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/RecaptchaEnterpriseProto.java
index 1faaf9a2395e..827ff1ae48b2 100644
--- a/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/RecaptchaEnterpriseProto.java
+++ b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/RecaptchaEnterpriseProto.java
@@ -31,6 +31,10 @@ public static void registerAllExtensions(com.google.protobuf.ExtensionRegistry r
       internal_static_google_cloud_recaptchaenterprise_v1beta1_CreateAssessmentRequest_descriptor;
   static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
       internal_static_google_cloud_recaptchaenterprise_v1beta1_CreateAssessmentRequest_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+      internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionEvent_descriptor;
+  static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionEvent_fieldAccessorTable;
   static final com.google.protobuf.Descriptors.Descriptor
       internal_static_google_cloud_recaptchaenterprise_v1beta1_AnnotateAssessmentRequest_descriptor;
   static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
@@ -51,10 +55,42 @@ public static void registerAllExtensions(com.google.protobuf.ExtensionRegistry r
       internal_static_google_cloud_recaptchaenterprise_v1beta1_Event_descriptor;
   static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
       internal_static_google_cloud_recaptchaenterprise_v1beta1_Event_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+      internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_descriptor;
+  static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+      internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_Address_descriptor;
+  static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_Address_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+      internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_User_descriptor;
+  static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_User_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+      internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_Item_descriptor;
+  static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_Item_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+      internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_GatewayInfo_descriptor;
+  static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_GatewayInfo_fieldAccessorTable;
   static final com.google.protobuf.Descriptors.Descriptor
       internal_static_google_cloud_recaptchaenterprise_v1beta1_TokenProperties_descriptor;
   static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
       internal_static_google_cloud_recaptchaenterprise_v1beta1_TokenProperties_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+      internal_static_google_cloud_recaptchaenterprise_v1beta1_FraudPreventionAssessment_descriptor;
+  static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_google_cloud_recaptchaenterprise_v1beta1_FraudPreventionAssessment_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+      internal_static_google_cloud_recaptchaenterprise_v1beta1_FraudPreventionAssessment_StolenInstrumentVerdict_descriptor;
+  static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_google_cloud_recaptchaenterprise_v1beta1_FraudPreventionAssessment_StolenInstrumentVerdict_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+      internal_static_google_cloud_recaptchaenterprise_v1beta1_FraudPreventionAssessment_CardTestingVerdict_descriptor;
+  static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_google_cloud_recaptchaenterprise_v1beta1_FraudPreventionAssessment_CardTestingVerdict_fieldAccessorTable;
   static final com.google.protobuf.Descriptors.Descriptor
       internal_static_google_cloud_recaptchaenterprise_v1beta1_AccountDefenderAssessment_descriptor;
   static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
@@ -78,94 +114,160 @@ public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() {
           + "equest\022C\n\006parent\030\001 \001(\tB3\340A\002\372A-\n+cloudres"
           + "ourcemanager.googleapis.com/Project\022M\n\na"
           + "ssessment\030\002 \001(\01324.google.cloud.recaptcha"
-          + "enterprise.v1beta1.AssessmentB\003\340A\002\"\272\005\n\031A"
-          + "nnotateAssessmentRequest\022C\n\004name\030\001 \001(\tB5"
-          + "\340A\002\372A/\n-recaptchaenterprise.googleapis.c"
-          + "om/Assessment\022g\n\nannotation\030\002 \001(\0162N.goog"
-          + "le.cloud.recaptchaenterprise.v1beta1.Ann"
-          + "otateAssessmentRequest.AnnotationB\003\340A\001\022`"
-          + "\n\007reasons\030\003 \003(\0162J.google.cloud.recaptcha"
-          + "enterprise.v1beta1.AnnotateAssessmentReq"
-          + "uest.ReasonB\003\340A\001\022\036\n\021hashed_account_id\030\004 "
-          + "\001(\014B\003\340A\001\"~\n\nAnnotation\022\032\n\026ANNOTATION_UNS"
-          + "PECIFIED\020\000\022\016\n\nLEGITIMATE\020\001\022\016\n\nFRAUDULENT"
-          + "\020\002\022\030\n\020PASSWORD_CORRECT\020\003\032\002\010\001\022\032\n\022PASSWORD"
-          + "_INCORRECT\020\004\032\002\010\001\"\354\001\n\006Reason\022\026\n\022REASON_UN"
-          + "SPECIFIED\020\000\022\016\n\nCHARGEBACK\020\001\022\024\n\020CHARGEBAC"
-          + "K_FRAUD\020\010\022\026\n\022CHARGEBACK_DISPUTE\020\t\022\026\n\022PAY"
+          + "enterprise.v1beta1.AssessmentB\003\340A\002\"\227\005\n\020T"
+          + "ransactionEvent\022h\n\nevent_type\030\001 \001(\0162O.go"
+          + "ogle.cloud.recaptchaenterprise.v1beta1.T"
+          + "ransactionEvent.TransactionEventTypeB\003\340A"
+          + "\001\022\023\n\006reason\030\002 \001(\tB\003\340A\001\022\022\n\005value\030\003 \001(\001B\003\340"
+          + "A\001\0223\n\nevent_time\030\004 \001(\0132\032.google.protobuf"
+          + ".TimestampB\003\340A\001\"\272\003\n\024TransactionEventType"
+          + "\022&\n\"TRANSACTION_EVENT_TYPE_UNSPECIFIED\020\000"
+          + "\022\024\n\020MERCHANT_APPROVE\020\001\022\021\n\rMERCHANT_DENY\020"
+          + "\002\022\021\n\rMANUAL_REVIEW\020\003\022\021\n\rAUTHORIZATION\020\004\022"
+          + "\031\n\025AUTHORIZATION_DECLINE\020\005\022\023\n\017PAYMENT_CA"
+          + "PTURE\020\006\022\033\n\027PAYMENT_CAPTURE_DECLINE\020\007\022\n\n\006"
+          + "CANCEL\020\010\022\026\n\022CHARGEBACK_INQUIRY\020\t\022\024\n\020CHAR"
+          + "GEBACK_ALERT\020\n\022\026\n\022FRAUD_NOTIFICATION\020\013\022\016"
+          + "\n\nCHARGEBACK\020\014\022\034\n\030CHARGEBACK_REPRESENTME"
+          + "NT\020\r\022\026\n\022CHARGEBACK_REVERSE\020\016\022\022\n\016REFUND_R"
+          + "EQUEST\020\017\022\022\n\016REFUND_DECLINE\020\020\022\n\n\006REFUND\020\021"
+          + "\022\022\n\016REFUND_REVERSE\020\022\"\371\006\n\031AnnotateAssessm"
+          + "entRequest\022C\n\004name\030\001 \001(\tB5\340A\002\372A/\n-recapt"
+          + "chaenterprise.googleapis.com/Assessment\022"
+          + "g\n\nannotation\030\002 \001(\0162N.google.cloud.recap"
+          + "tchaenterprise.v1beta1.AnnotateAssessmen"
+          + "tRequest.AnnotationB\003\340A\001\022`\n\007reasons\030\003 \003("
+          + "\0162J.google.cloud.recaptchaenterprise.v1b"
+          + "eta1.AnnotateAssessmentRequest.ReasonB\003\340"
+          + "A\001\022\036\n\021hashed_account_id\030\004 \001(\014B\003\340A\001\022Z\n\021tr"
+          + "ansaction_event\030\005 \001(\0132:.google.cloud.rec"
+          + "aptchaenterprise.v1beta1.TransactionEven"
+          + "tB\003\340A\001\"~\n\nAnnotation\022\032\n\026ANNOTATION_UNSPE"
+          + "CIFIED\020\000\022\016\n\nLEGITIMATE\020\001\022\016\n\nFRAUDULENT\020\002"
+          + "\022\030\n\020PASSWORD_CORRECT\020\003\032\002\010\001\022\032\n\022PASSWORD_I"
+          + "NCORRECT\020\004\032\002\010\001\"\317\002\n\006Reason\022\026\n\022REASON_UNSP"
+          + "ECIFIED\020\000\022\016\n\nCHARGEBACK\020\001\022\024\n\020CHARGEBACK_"
+          + "FRAUD\020\010\022\026\n\022CHARGEBACK_DISPUTE\020\t\022\n\n\006REFUN"
+          + "D\020\n\022\020\n\014REFUND_FRAUD\020\013\022\030\n\024TRANSACTION_ACC"
+          + "EPTED\020\014\022\030\n\024TRANSACTION_DECLINED\020\r\022\026\n\022PAY"
           + "MENT_HEURISTICS\020\002\022\030\n\024INITIATED_TWO_FACTO"
           + "R\020\007\022\025\n\021PASSED_TWO_FACTOR\020\003\022\025\n\021FAILED_TWO"
           + "_FACTOR\020\004\022\024\n\020CORRECT_PASSWORD\020\005\022\026\n\022INCOR"
-          + "RECT_PASSWORD\020\006\"\034\n\032AnnotateAssessmentRes"
-          + "ponse\"\206\001\n\030PasswordLeakVerification\022$\n\027ha"
-          + "shed_user_credentials\030\001 \001(\014B\003\340A\001\022\037\n\022cred"
-          + "entials_leaked\030\002 \001(\010B\003\340A\003\022#\n\026canonicaliz"
-          + "ed_username\030\003 \001(\tB\003\340A\001\"\234\006\n\nAssessment\022\021\n"
-          + "\004name\030\001 \001(\tB\003\340A\003\022>\n\005event\030\002 \001(\0132/.google"
-          + ".cloud.recaptchaenterprise.v1beta1.Event"
-          + "\022\022\n\005score\030\003 \001(\002B\003\340A\003\022X\n\020token_properties"
-          + "\030\004 \001(\01329.google.cloud.recaptchaenterpris"
-          + "e.v1beta1.TokenPropertiesB\003\340A\003\022_\n\007reason"
-          + "s\030\005 \003(\0162I.google.cloud.recaptchaenterpri"
-          + "se.v1beta1.Assessment.ClassificationReas"
-          + "onB\003\340A\003\022f\n\032password_leak_verification\030\007 "
-          + "\001(\0132B.google.cloud.recaptchaenterprise.v"
-          + "1beta1.PasswordLeakVerification\022h\n\033accou"
-          + "nt_defender_assessment\030\010 \001(\0132C.google.cl"
-          + "oud.recaptchaenterprise.v1beta1.AccountD"
-          + "efenderAssessment\"\270\001\n\024ClassificationReas"
-          + "on\022%\n!CLASSIFICATION_REASON_UNSPECIFIED\020"
-          + "\000\022\016\n\nAUTOMATION\020\001\022\032\n\026UNEXPECTED_ENVIRONM"
-          + "ENT\020\002\022\024\n\020TOO_MUCH_TRAFFIC\020\003\022\035\n\031UNEXPECTE"
-          + "D_USAGE_PATTERNS\020\004\022\030\n\024LOW_CONFIDENCE_SCO"
-          + "RE\020\005:_\352A\\\n-recaptchaenterprise.googleapi"
-          + "s.com/Assessment\022+projects/{project}/ass"
-          + "essments/{assessment}\"\247\001\n\005Event\022\022\n\005token"
-          + "\030\001 \001(\tB\003\340A\001\022\025\n\010site_key\030\002 \001(\tB\003\340A\001\022\027\n\nus"
-          + "er_agent\030\003 \001(\tB\003\340A\001\022\034\n\017user_ip_address\030\004"
-          + " \001(\tB\003\340A\001\022\034\n\017expected_action\030\005 \001(\tB\003\340A\001\022"
-          + "\036\n\021hashed_account_id\030\006 \001(\014B\003\340A\001\"\377\002\n\017Toke"
-          + "nProperties\022\r\n\005valid\030\001 \001(\010\022_\n\016invalid_re"
-          + "ason\030\002 \001(\0162G.google.cloud.recaptchaenter"
-          + "prise.v1beta1.TokenProperties.InvalidRea"
-          + "son\022/\n\013create_time\030\003 \001(\0132\032.google.protob"
-          + "uf.Timestamp\022\020\n\010hostname\030\004 \001(\t\022\016\n\006action"
-          + "\030\005 \001(\t\"\250\001\n\rInvalidReason\022\036\n\032INVALID_REAS"
-          + "ON_UNSPECIFIED\020\000\022\032\n\026UNKNOWN_INVALID_REAS"
-          + "ON\020\001\022\r\n\tMALFORMED\020\002\022\013\n\007EXPIRED\020\003\022\010\n\004DUPE"
-          + "\020\004\022\025\n\rSITE_MISMATCH\020\005\032\002\010\001\022\013\n\007MISSING\020\006\022\021"
-          + "\n\rBROWSER_ERROR\020\007\"\273\002\n\031AccountDefenderAss"
-          + "essment\022h\n\006labels\030\001 \003(\0162X.google.cloud.r"
-          + "ecaptchaenterprise.v1beta1.AccountDefend"
-          + "erAssessment.AccountDefenderLabel\"\263\001\n\024Ac"
-          + "countDefenderLabel\022&\n\"ACCOUNT_DEFENDER_L"
-          + "ABEL_UNSPECIFIED\020\000\022\021\n\rPROFILE_MATCH\020\001\022\035\n"
-          + "\031SUSPICIOUS_LOGIN_ACTIVITY\020\002\022\037\n\033SUSPICIO"
-          + "US_ACCOUNT_CREATION\020\003\022 \n\034RELATED_ACCOUNT"
-          + "S_NUMBER_HIGH\020\0042\315\004\n!RecaptchaEnterpriseS"
-          + "erviceV1Beta1\022\335\001\n\020CreateAssessment\022A.goo"
-          + "gle.cloud.recaptchaenterprise.v1beta1.Cr"
-          + "eateAssessmentRequest\0324.google.cloud.rec"
-          + "aptchaenterprise.v1beta1.Assessment\"P\202\323\344"
-          + "\223\0026\"(/v1beta1/{parent=projects/*}/assess"
-          + "ments:\nassessment\332A\021parent,assessment\022\357\001"
-          + "\n\022AnnotateAssessment\022C.google.cloud.reca"
-          + "ptchaenterprise.v1beta1.AnnotateAssessme"
-          + "ntRequest\032D.google.cloud.recaptchaenterp"
-          + "rise.v1beta1.AnnotateAssessmentResponse\""
-          + "N\202\323\344\223\0026\"1/v1beta1/{name=projects/*/asses"
-          + "sments/*}:annotate:\001*\332A\017name,annotation\032"
-          + "V\312A\"recaptchaenterprise.googleapis.com\322A"
-          + ".https://www.googleapis.com/auth/cloud-p"
-          + "latformB\257\002\n&com.google.recaptchaenterpri"
-          + "se.v1beta1B\030RecaptchaEnterpriseProtoP\001Z^"
-          + "cloud.google.com/go/recaptchaenterprise/"
-          + "apiv1beta1/recaptchaenterprisepb;recaptc"
-          + "haenterprisepb\242\002\004GCRE\252\002(Google.Cloud.Rec"
-          + "aptchaEnterprise.V1Beta1\312\002(Google\\Cloud\\"
-          + "RecaptchaEnterprise\\V1beta1\352\002+Google::Cl"
-          + "oud::RecaptchaEnterprise::V1beta1b\006proto"
-          + "3"
+          + "RECT_PASSWORD\020\006\022\017\n\013SOCIAL_SPAM\020\016\"\034\n\032Anno"
+          + "tateAssessmentResponse\"\206\001\n\030PasswordLeakV"
+          + "erification\022$\n\027hashed_user_credentials\030\001"
+          + " \001(\014B\003\340A\001\022\037\n\022credentials_leaked\030\002 \001(\010B\003\340"
+          + "A\003\022#\n\026canonicalized_username\030\003 \001(\tB\003\340A\001\""
+          + "\267\007\n\nAssessment\022\021\n\004name\030\001 \001(\tB\003\340A\003\022>\n\005eve"
+          + "nt\030\002 \001(\0132/.google.cloud.recaptchaenterpr"
+          + "ise.v1beta1.Event\022\022\n\005score\030\003 \001(\002B\003\340A\003\022X\n"
+          + "\020token_properties\030\004 \001(\01329.google.cloud.r"
+          + "ecaptchaenterprise.v1beta1.TokenProperti"
+          + "esB\003\340A\003\022_\n\007reasons\030\005 \003(\0162I.google.cloud."
+          + "recaptchaenterprise.v1beta1.Assessment.C"
+          + "lassificationReasonB\003\340A\003\022f\n\032password_lea"
+          + "k_verification\030\007 \001(\0132B.google.cloud.reca"
+          + "ptchaenterprise.v1beta1.PasswordLeakVeri"
+          + "fication\022h\n\033account_defender_assessment\030"
+          + "\010 \001(\0132C.google.cloud.recaptchaenterprise"
+          + ".v1beta1.AccountDefenderAssessment\022h\n\033fr"
+          + "aud_prevention_assessment\030\013 \001(\0132C.google"
+          + ".cloud.recaptchaenterprise.v1beta1.Fraud"
+          + "PreventionAssessment\"\351\001\n\024ClassificationR"
+          + "eason\022%\n!CLASSIFICATION_REASON_UNSPECIFI"
+          + "ED\020\000\022\016\n\nAUTOMATION\020\001\022\032\n\026UNEXPECTED_ENVIR"
+          + "ONMENT\020\002\022\024\n\020TOO_MUCH_TRAFFIC\020\003\022\035\n\031UNEXPE"
+          + "CTED_USAGE_PATTERNS\020\004\022\030\n\024LOW_CONFIDENCE_"
+          + "SCORE\020\005\022\025\n\021SUSPECTED_CARDING\020\006\022\030\n\024SUSPEC"
+          + "TED_CHARGEBACK\020\007:_\352A\\\n-recaptchaenterpri"
+          + "se.googleapis.com/Assessment\022+projects/{"
+          + "project}/assessments/{assessment}\"\201\002\n\005Ev"
+          + "ent\022\022\n\005token\030\001 \001(\tB\003\340A\001\022\025\n\010site_key\030\002 \001("
+          + "\tB\003\340A\001\022\027\n\nuser_agent\030\003 \001(\tB\003\340A\001\022\034\n\017user_"
+          + "ip_address\030\004 \001(\tB\003\340A\001\022\034\n\017expected_action"
+          + "\030\005 \001(\tB\003\340A\001\022\036\n\021hashed_account_id\030\006 \001(\014B\003"
+          + "\340A\001\022X\n\020transaction_data\030\r \001(\01329.google.c"
+          + "loud.recaptchaenterprise.v1beta1.Transac"
+          + "tionDataB\003\340A\001\"\235\t\n\017TransactionData\022\033\n\016tra"
+          + "nsaction_id\030\013 \001(\tH\000\210\001\001\022\026\n\016payment_method"
+          + "\030\001 \001(\t\022\020\n\010card_bin\030\002 \001(\t\022\026\n\016card_last_fo"
+          + "ur\030\003 \001(\t\022\025\n\rcurrency_code\030\004 \001(\t\022\r\n\005value"
+          + "\030\005 \001(\001\022\026\n\016shipping_value\030\014 \001(\001\022[\n\020shippi"
+          + "ng_address\030\006 \001(\0132A.google.cloud.recaptch"
+          + "aenterprise.v1beta1.TransactionData.Addr"
+          + "ess\022Z\n\017billing_address\030\007 \001(\0132A.google.cl"
+          + "oud.recaptchaenterprise.v1beta1.Transact"
+          + "ionData.Address\022L\n\004user\030\010 \001(\0132>.google.c"
+          + "loud.recaptchaenterprise.v1beta1.Transac"
+          + "tionData.User\022Q\n\tmerchants\030\r \003(\0132>.googl"
+          + "e.cloud.recaptchaenterprise.v1beta1.Tran"
+          + "sactionData.User\022M\n\005items\030\016 \003(\0132>.google"
+          + ".cloud.recaptchaenterprise.v1beta1.Trans"
+          + "actionData.Item\022[\n\014gateway_info\030\n \001(\0132E."
+          + "google.cloud.recaptchaenterprise.v1beta1"
+          + ".TransactionData.GatewayInfo\032\206\001\n\007Address"
+          + "\022\021\n\trecipient\030\001 \001(\t\022\017\n\007address\030\002 \003(\t\022\020\n\010"
+          + "locality\030\003 \001(\t\022\033\n\023administrative_area\030\004 "
+          + "\001(\t\022\023\n\013region_code\030\005 \001(\t\022\023\n\013postal_code\030"
+          + "\006 \001(\t\032\204\001\n\004User\022\022\n\naccount_id\030\006 \001(\t\022\023\n\013cr"
+          + "eation_ms\030\001 \001(\003\022\r\n\005email\030\002 \001(\t\022\026\n\016email_"
+          + "verified\030\003 \001(\010\022\024\n\014phone_number\030\004 \001(\t\022\026\n\016"
+          + "phone_verified\030\005 \001(\010\032R\n\004Item\022\014\n\004name\030\001 \001"
+          + "(\t\022\r\n\005value\030\002 \001(\001\022\020\n\010quantity\030\003 \001(\003\022\033\n\023m"
+          + "erchant_account_id\030\004 \001(\t\032p\n\013GatewayInfo\022"
+          + "\014\n\004name\030\001 \001(\t\022\035\n\025gateway_response_code\030\002"
+          + " \001(\t\022\031\n\021avs_response_code\030\003 \001(\t\022\031\n\021cvv_r"
+          + "esponse_code\030\004 \001(\tB\021\n\017_transaction_id\"\377\002"
+          + "\n\017TokenProperties\022\r\n\005valid\030\001 \001(\010\022_\n\016inva"
+          + "lid_reason\030\002 \001(\0162G.google.cloud.recaptch"
+          + "aenterprise.v1beta1.TokenProperties.Inva"
+          + "lidReason\022/\n\013create_time\030\003 \001(\0132\032.google."
+          + "protobuf.Timestamp\022\020\n\010hostname\030\004 \001(\t\022\016\n\006"
+          + "action\030\005 \001(\t\"\250\001\n\rInvalidReason\022\036\n\032INVALI"
+          + "D_REASON_UNSPECIFIED\020\000\022\032\n\026UNKNOWN_INVALI"
+          + "D_REASON\020\001\022\r\n\tMALFORMED\020\002\022\013\n\007EXPIRED\020\003\022\010"
+          + "\n\004DUPE\020\004\022\025\n\rSITE_MISMATCH\020\005\032\002\010\001\022\013\n\007MISSI"
+          + "NG\020\006\022\021\n\rBROWSER_ERROR\020\007\"\370\002\n\031FraudPrevent"
+          + "ionAssessment\022\030\n\020transaction_risk\030\001 \001(\002\022"
+          + "~\n\031stolen_instrument_verdict\030\002 \001(\0132[.goo"
+          + "gle.cloud.recaptchaenterprise.v1beta1.Fr"
+          + "audPreventionAssessment.StolenInstrument"
+          + "Verdict\022t\n\024card_testing_verdict\030\003 \001(\0132V."
+          + "google.cloud.recaptchaenterprise.v1beta1"
+          + ".FraudPreventionAssessment.CardTestingVe"
+          + "rdict\032\'\n\027StolenInstrumentVerdict\022\014\n\004risk"
+          + "\030\001 \001(\002\032\"\n\022CardTestingVerdict\022\014\n\004risk\030\001 \001"
+          + "(\002\"\273\002\n\031AccountDefenderAssessment\022h\n\006labe"
+          + "ls\030\001 \003(\0162X.google.cloud.recaptchaenterpr"
+          + "ise.v1beta1.AccountDefenderAssessment.Ac"
+          + "countDefenderLabel\"\263\001\n\024AccountDefenderLa"
+          + "bel\022&\n\"ACCOUNT_DEFENDER_LABEL_UNSPECIFIE"
+          + "D\020\000\022\021\n\rPROFILE_MATCH\020\001\022\035\n\031SUSPICIOUS_LOG"
+          + "IN_ACTIVITY\020\002\022\037\n\033SUSPICIOUS_ACCOUNT_CREA"
+          + "TION\020\003\022 \n\034RELATED_ACCOUNTS_NUMBER_HIGH\020\004"
+          + "2\315\004\n!RecaptchaEnterpriseServiceV1Beta1\022\335"
+          + "\001\n\020CreateAssessment\022A.google.cloud.recap"
+          + "tchaenterprise.v1beta1.CreateAssessmentR"
+          + "equest\0324.google.cloud.recaptchaenterpris"
+          + "e.v1beta1.Assessment\"P\202\323\344\223\0026\"(/v1beta1/{"
+          + "parent=projects/*}/assessments:\nassessme"
+          + "nt\332A\021parent,assessment\022\357\001\n\022AnnotateAsses"
+          + "sment\022C.google.cloud.recaptchaenterprise"
+          + ".v1beta1.AnnotateAssessmentRequest\032D.goo"
+          + "gle.cloud.recaptchaenterprise.v1beta1.An"
+          + "notateAssessmentResponse\"N\202\323\344\223\0026\"1/v1bet"
+          + "a1/{name=projects/*/assessments/*}:annot"
+          + "ate:\001*\332A\017name,annotation\032V\312A\"recaptchaen"
+          + "terprise.googleapis.com\322A.https://www.go"
+          + "ogleapis.com/auth/cloud-platformB\257\002\n&com"
+          + ".google.recaptchaenterprise.v1beta1B\030Rec"
+          + "aptchaEnterpriseProtoP\001Z^cloud.google.co"
+          + "m/go/recaptchaenterprise/apiv1beta1/reca"
+          + "ptchaenterprisepb;recaptchaenterprisepb\242"
+          + "\002\004GCRE\252\002(Google.Cloud.RecaptchaEnterpris"
+          + "e.V1Beta1\312\002(Google\\Cloud\\RecaptchaEnterp"
+          + "rise\\V1beta1\352\002+Google::Cloud::RecaptchaE"
+          + "nterprise::V1beta1b\006proto3"
     };
     descriptor =
         com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(
@@ -185,22 +287,30 @@ public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() {
             new java.lang.String[] {
               "Parent", "Assessment",
             });
-    internal_static_google_cloud_recaptchaenterprise_v1beta1_AnnotateAssessmentRequest_descriptor =
+    internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionEvent_descriptor =
         getDescriptor().getMessageTypes().get(1);
+    internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionEvent_fieldAccessorTable =
+        new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+            internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionEvent_descriptor,
+            new java.lang.String[] {
+              "EventType", "Reason", "Value", "EventTime",
+            });
+    internal_static_google_cloud_recaptchaenterprise_v1beta1_AnnotateAssessmentRequest_descriptor =
+        getDescriptor().getMessageTypes().get(2);
     internal_static_google_cloud_recaptchaenterprise_v1beta1_AnnotateAssessmentRequest_fieldAccessorTable =
         new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
             internal_static_google_cloud_recaptchaenterprise_v1beta1_AnnotateAssessmentRequest_descriptor,
             new java.lang.String[] {
-              "Name", "Annotation", "Reasons", "HashedAccountId",
+              "Name", "Annotation", "Reasons", "HashedAccountId", "TransactionEvent",
             });
     internal_static_google_cloud_recaptchaenterprise_v1beta1_AnnotateAssessmentResponse_descriptor =
-        getDescriptor().getMessageTypes().get(2);
+        getDescriptor().getMessageTypes().get(3);
     internal_static_google_cloud_recaptchaenterprise_v1beta1_AnnotateAssessmentResponse_fieldAccessorTable =
         new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
             internal_static_google_cloud_recaptchaenterprise_v1beta1_AnnotateAssessmentResponse_descriptor,
             new java.lang.String[] {});
     internal_static_google_cloud_recaptchaenterprise_v1beta1_PasswordLeakVerification_descriptor =
-        getDescriptor().getMessageTypes().get(3);
+        getDescriptor().getMessageTypes().get(4);
     internal_static_google_cloud_recaptchaenterprise_v1beta1_PasswordLeakVerification_fieldAccessorTable =
         new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
             internal_static_google_cloud_recaptchaenterprise_v1beta1_PasswordLeakVerification_descriptor,
@@ -208,7 +318,7 @@ public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() {
               "HashedUserCredentials", "CredentialsLeaked", "CanonicalizedUsername",
             });
     internal_static_google_cloud_recaptchaenterprise_v1beta1_Assessment_descriptor =
-        getDescriptor().getMessageTypes().get(4);
+        getDescriptor().getMessageTypes().get(5);
     internal_static_google_cloud_recaptchaenterprise_v1beta1_Assessment_fieldAccessorTable =
         new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
             internal_static_google_cloud_recaptchaenterprise_v1beta1_Assessment_descriptor,
@@ -220,25 +330,121 @@ public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() {
               "Reasons",
               "PasswordLeakVerification",
               "AccountDefenderAssessment",
+              "FraudPreventionAssessment",
             });
     internal_static_google_cloud_recaptchaenterprise_v1beta1_Event_descriptor =
-        getDescriptor().getMessageTypes().get(5);
+        getDescriptor().getMessageTypes().get(6);
     internal_static_google_cloud_recaptchaenterprise_v1beta1_Event_fieldAccessorTable =
         new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
             internal_static_google_cloud_recaptchaenterprise_v1beta1_Event_descriptor,
             new java.lang.String[] {
-              "Token", "SiteKey", "UserAgent", "UserIpAddress", "ExpectedAction", "HashedAccountId",
+              "Token",
+              "SiteKey",
+              "UserAgent",
+              "UserIpAddress",
+              "ExpectedAction",
+              "HashedAccountId",
+              "TransactionData",
+            });
+    internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_descriptor =
+        getDescriptor().getMessageTypes().get(7);
+    internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_fieldAccessorTable =
+        new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+            internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_descriptor,
+            new java.lang.String[] {
+              "TransactionId",
+              "PaymentMethod",
+              "CardBin",
+              "CardLastFour",
+              "CurrencyCode",
+              "Value",
+              "ShippingValue",
+              "ShippingAddress",
+              "BillingAddress",
+              "User",
+              "Merchants",
+              "Items",
+              "GatewayInfo",
+              "TransactionId",
+            });
+    internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_Address_descriptor =
+        internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_descriptor
+            .getNestedTypes()
+            .get(0);
+    internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_Address_fieldAccessorTable =
+        new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+            internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_Address_descriptor,
+            new java.lang.String[] {
+              "Recipient", "Address", "Locality", "AdministrativeArea", "RegionCode", "PostalCode",
+            });
+    internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_User_descriptor =
+        internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_descriptor
+            .getNestedTypes()
+            .get(1);
+    internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_User_fieldAccessorTable =
+        new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+            internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_User_descriptor,
+            new java.lang.String[] {
+              "AccountId", "CreationMs", "Email", "EmailVerified", "PhoneNumber", "PhoneVerified",
+            });
+    internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_Item_descriptor =
+        internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_descriptor
+            .getNestedTypes()
+            .get(2);
+    internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_Item_fieldAccessorTable =
+        new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+            internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_Item_descriptor,
+            new java.lang.String[] {
+              "Name", "Value", "Quantity", "MerchantAccountId",
+            });
+    internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_GatewayInfo_descriptor =
+        internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_descriptor
+            .getNestedTypes()
+            .get(3);
+    internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_GatewayInfo_fieldAccessorTable =
+        new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+            internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_GatewayInfo_descriptor,
+            new java.lang.String[] {
+              "Name", "GatewayResponseCode", "AvsResponseCode", "CvvResponseCode",
             });
     internal_static_google_cloud_recaptchaenterprise_v1beta1_TokenProperties_descriptor =
-        getDescriptor().getMessageTypes().get(6);
+        getDescriptor().getMessageTypes().get(8);
     internal_static_google_cloud_recaptchaenterprise_v1beta1_TokenProperties_fieldAccessorTable =
         new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
             internal_static_google_cloud_recaptchaenterprise_v1beta1_TokenProperties_descriptor,
             new java.lang.String[] {
               "Valid", "InvalidReason", "CreateTime", "Hostname", "Action",
             });
+    internal_static_google_cloud_recaptchaenterprise_v1beta1_FraudPreventionAssessment_descriptor =
+        getDescriptor().getMessageTypes().get(9);
+    internal_static_google_cloud_recaptchaenterprise_v1beta1_FraudPreventionAssessment_fieldAccessorTable =
+        new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+            internal_static_google_cloud_recaptchaenterprise_v1beta1_FraudPreventionAssessment_descriptor,
+            new java.lang.String[] {
+              "TransactionRisk", "StolenInstrumentVerdict", "CardTestingVerdict",
+            });
+    internal_static_google_cloud_recaptchaenterprise_v1beta1_FraudPreventionAssessment_StolenInstrumentVerdict_descriptor =
+        internal_static_google_cloud_recaptchaenterprise_v1beta1_FraudPreventionAssessment_descriptor
+            .getNestedTypes()
+            .get(0);
+    internal_static_google_cloud_recaptchaenterprise_v1beta1_FraudPreventionAssessment_StolenInstrumentVerdict_fieldAccessorTable =
+        new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+            internal_static_google_cloud_recaptchaenterprise_v1beta1_FraudPreventionAssessment_StolenInstrumentVerdict_descriptor,
+            new java.lang.String[] {
+              "Risk",
+            });
+    internal_static_google_cloud_recaptchaenterprise_v1beta1_FraudPreventionAssessment_CardTestingVerdict_descriptor =
+        internal_static_google_cloud_recaptchaenterprise_v1beta1_FraudPreventionAssessment_descriptor
+            .getNestedTypes()
+            .get(1);
+    internal_static_google_cloud_recaptchaenterprise_v1beta1_FraudPreventionAssessment_CardTestingVerdict_fieldAccessorTable =
+        new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+            internal_static_google_cloud_recaptchaenterprise_v1beta1_FraudPreventionAssessment_CardTestingVerdict_descriptor,
+            new java.lang.String[] {
+              "Risk",
+            });
     internal_static_google_cloud_recaptchaenterprise_v1beta1_AccountDefenderAssessment_descriptor =
-        getDescriptor().getMessageTypes().get(7);
+        getDescriptor().getMessageTypes().get(10);
     internal_static_google_cloud_recaptchaenterprise_v1beta1_AccountDefenderAssessment_fieldAccessorTable =
         new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
             internal_static_google_cloud_recaptchaenterprise_v1beta1_AccountDefenderAssessment_descriptor,
diff --git a/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/TokenProperties.java b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/TokenProperties.java
index b37a99142c12..2e208ecf1736 100644
--- a/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/TokenProperties.java
+++ b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/TokenProperties.java
@@ -126,7 +126,7 @@ public enum InvalidReason implements com.google.protobuf.ProtocolMessageEnum {
      *
      * <pre>
      * The user verification token did not match the provided site key.
-     * This may be a configuration error (e.g. development keys used in
+     * This may be a configuration error (for example, development keys used in
      * production) or end users trying to use verification tokens from other
      * sites.
      * </pre>
@@ -214,7 +214,7 @@ public enum InvalidReason implements com.google.protobuf.ProtocolMessageEnum {
      *
      * <pre>
      * The user verification token did not match the provided site key.
-     * This may be a configuration error (e.g. development keys used in
+     * This may be a configuration error (for example, development keys used in
      * production) or end users trying to use verification tokens from other
      * sites.
      * </pre>
diff --git a/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/TransactionData.java b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/TransactionData.java
new file mode 100644
index 000000000000..1791f9c9b4b0
--- /dev/null
+++ b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/TransactionData.java
@@ -0,0 +1,9516 @@
+/*
+ * Copyright 2020 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: google/cloud/recaptchaenterprise/v1beta1/recaptchaenterprise.proto
+
+package com.google.recaptchaenterprise.v1beta1;
+
+/**
+ *
+ *
+ * <pre>
+ * Transaction data associated with a payment protected by reCAPTCHA Enterprise.
+ * All fields are optional.
+ * </pre>
+ *
+ * Protobuf type {@code google.cloud.recaptchaenterprise.v1beta1.TransactionData}
+ */
+public final class TransactionData extends com.google.protobuf.GeneratedMessageV3
+    implements
+    // @@protoc_insertion_point(message_implements:google.cloud.recaptchaenterprise.v1beta1.TransactionData)
+    TransactionDataOrBuilder {
+  private static final long serialVersionUID = 0L;
+  // Use TransactionData.newBuilder() to construct.
+  private TransactionData(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+
+  private TransactionData() {
+    transactionId_ = "";
+    paymentMethod_ = "";
+    cardBin_ = "";
+    cardLastFour_ = "";
+    currencyCode_ = "";
+    merchants_ = java.util.Collections.emptyList();
+    items_ = java.util.Collections.emptyList();
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(UnusedPrivateParameter unused) {
+    return new TransactionData();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+    return this.unknownFields;
+  }
+
+  public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+    return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+        .internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+        .internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.google.recaptchaenterprise.v1beta1.TransactionData.class,
+            com.google.recaptchaenterprise.v1beta1.TransactionData.Builder.class);
+  }
+
+  public interface AddressOrBuilder
+      extends
+      // @@protoc_insertion_point(interface_extends:google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     *
+     *
+     * <pre>
+     * The recipient name, potentially including information such as "care of".
+     * </pre>
+     *
+     * <code>string recipient = 1;</code>
+     *
+     * @return The recipient.
+     */
+    java.lang.String getRecipient();
+    /**
+     *
+     *
+     * <pre>
+     * The recipient name, potentially including information such as "care of".
+     * </pre>
+     *
+     * <code>string recipient = 1;</code>
+     *
+     * @return The bytes for recipient.
+     */
+    com.google.protobuf.ByteString getRecipientBytes();
+
+    /**
+     *
+     *
+     * <pre>
+     * The first lines of the address. The first line generally contains the
+     * street name and number, and further lines may include information such as
+     * an apartment number.
+     * </pre>
+     *
+     * <code>repeated string address = 2;</code>
+     *
+     * @return A list containing the address.
+     */
+    java.util.List<java.lang.String> getAddressList();
+    /**
+     *
+     *
+     * <pre>
+     * The first lines of the address. The first line generally contains the
+     * street name and number, and further lines may include information such as
+     * an apartment number.
+     * </pre>
+     *
+     * <code>repeated string address = 2;</code>
+     *
+     * @return The count of address.
+     */
+    int getAddressCount();
+    /**
+     *
+     *
+     * <pre>
+     * The first lines of the address. The first line generally contains the
+     * street name and number, and further lines may include information such as
+     * an apartment number.
+     * </pre>
+     *
+     * <code>repeated string address = 2;</code>
+     *
+     * @param index The index of the element to return.
+     * @return The address at the given index.
+     */
+    java.lang.String getAddress(int index);
+    /**
+     *
+     *
+     * <pre>
+     * The first lines of the address. The first line generally contains the
+     * street name and number, and further lines may include information such as
+     * an apartment number.
+     * </pre>
+     *
+     * <code>repeated string address = 2;</code>
+     *
+     * @param index The index of the value to return.
+     * @return The bytes of the address at the given index.
+     */
+    com.google.protobuf.ByteString getAddressBytes(int index);
+
+    /**
+     *
+     *
+     * <pre>
+     * The town/city of the address.
+     * </pre>
+     *
+     * <code>string locality = 3;</code>
+     *
+     * @return The locality.
+     */
+    java.lang.String getLocality();
+    /**
+     *
+     *
+     * <pre>
+     * The town/city of the address.
+     * </pre>
+     *
+     * <code>string locality = 3;</code>
+     *
+     * @return The bytes for locality.
+     */
+    com.google.protobuf.ByteString getLocalityBytes();
+
+    /**
+     *
+     *
+     * <pre>
+     * The state, province, or otherwise administrative area of the address.
+     * </pre>
+     *
+     * <code>string administrative_area = 4;</code>
+     *
+     * @return The administrativeArea.
+     */
+    java.lang.String getAdministrativeArea();
+    /**
+     *
+     *
+     * <pre>
+     * The state, province, or otherwise administrative area of the address.
+     * </pre>
+     *
+     * <code>string administrative_area = 4;</code>
+     *
+     * @return The bytes for administrativeArea.
+     */
+    com.google.protobuf.ByteString getAdministrativeAreaBytes();
+
+    /**
+     *
+     *
+     * <pre>
+     * The CLDR country/region of the address.
+     * </pre>
+     *
+     * <code>string region_code = 5;</code>
+     *
+     * @return The regionCode.
+     */
+    java.lang.String getRegionCode();
+    /**
+     *
+     *
+     * <pre>
+     * The CLDR country/region of the address.
+     * </pre>
+     *
+     * <code>string region_code = 5;</code>
+     *
+     * @return The bytes for regionCode.
+     */
+    com.google.protobuf.ByteString getRegionCodeBytes();
+
+    /**
+     *
+     *
+     * <pre>
+     * The postal or ZIP code of the address.
+     * </pre>
+     *
+     * <code>string postal_code = 6;</code>
+     *
+     * @return The postalCode.
+     */
+    java.lang.String getPostalCode();
+    /**
+     *
+     *
+     * <pre>
+     * The postal or ZIP code of the address.
+     * </pre>
+     *
+     * <code>string postal_code = 6;</code>
+     *
+     * @return The bytes for postalCode.
+     */
+    com.google.protobuf.ByteString getPostalCodeBytes();
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Structured address format for billing and shipping addresses.
+   * </pre>
+   *
+   * Protobuf type {@code google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address}
+   */
+  public static final class Address extends com.google.protobuf.GeneratedMessageV3
+      implements
+      // @@protoc_insertion_point(message_implements:google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address)
+      AddressOrBuilder {
+    private static final long serialVersionUID = 0L;
+    // Use Address.newBuilder() to construct.
+    private Address(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+
+    private Address() {
+      recipient_ = "";
+      address_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+      locality_ = "";
+      administrativeArea_ = "";
+      regionCode_ = "";
+      postalCode_ = "";
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(UnusedPrivateParameter unused) {
+      return new Address();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+      return this.unknownFields;
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+      return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+          .internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_Address_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+          .internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_Address_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.google.recaptchaenterprise.v1beta1.TransactionData.Address.class,
+              com.google.recaptchaenterprise.v1beta1.TransactionData.Address.Builder.class);
+    }
+
+    public static final int RECIPIENT_FIELD_NUMBER = 1;
+
+    @SuppressWarnings("serial")
+    private volatile java.lang.Object recipient_ = "";
+    /**
+     *
+     *
+     * <pre>
+     * The recipient name, potentially including information such as "care of".
+     * </pre>
+     *
+     * <code>string recipient = 1;</code>
+     *
+     * @return The recipient.
+     */
+    @java.lang.Override
+    public java.lang.String getRecipient() {
+      java.lang.Object ref = recipient_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        recipient_ = s;
+        return s;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * The recipient name, potentially including information such as "care of".
+     * </pre>
+     *
+     * <code>string recipient = 1;</code>
+     *
+     * @return The bytes for recipient.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString getRecipientBytes() {
+      java.lang.Object ref = recipient_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b =
+            com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+        recipient_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int ADDRESS_FIELD_NUMBER = 2;
+
+    @SuppressWarnings("serial")
+    private com.google.protobuf.LazyStringList address_;
+    /**
+     *
+     *
+     * <pre>
+     * The first lines of the address. The first line generally contains the
+     * street name and number, and further lines may include information such as
+     * an apartment number.
+     * </pre>
+     *
+     * <code>repeated string address = 2;</code>
+     *
+     * @return A list containing the address.
+     */
+    public com.google.protobuf.ProtocolStringList getAddressList() {
+      return address_;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * The first lines of the address. The first line generally contains the
+     * street name and number, and further lines may include information such as
+     * an apartment number.
+     * </pre>
+     *
+     * <code>repeated string address = 2;</code>
+     *
+     * @return The count of address.
+     */
+    public int getAddressCount() {
+      return address_.size();
+    }
+    /**
+     *
+     *
+     * <pre>
+     * The first lines of the address. The first line generally contains the
+     * street name and number, and further lines may include information such as
+     * an apartment number.
+     * </pre>
+     *
+     * <code>repeated string address = 2;</code>
+     *
+     * @param index The index of the element to return.
+     * @return The address at the given index.
+     */
+    public java.lang.String getAddress(int index) {
+      return address_.get(index);
+    }
+    /**
+     *
+     *
+     * <pre>
+     * The first lines of the address. The first line generally contains the
+     * street name and number, and further lines may include information such as
+     * an apartment number.
+     * </pre>
+     *
+     * <code>repeated string address = 2;</code>
+     *
+     * @param index The index of the value to return.
+     * @return The bytes of the address at the given index.
+     */
+    public com.google.protobuf.ByteString getAddressBytes(int index) {
+      return address_.getByteString(index);
+    }
+
+    public static final int LOCALITY_FIELD_NUMBER = 3;
+
+    @SuppressWarnings("serial")
+    private volatile java.lang.Object locality_ = "";
+    /**
+     *
+     *
+     * <pre>
+     * The town/city of the address.
+     * </pre>
+     *
+     * <code>string locality = 3;</code>
+     *
+     * @return The locality.
+     */
+    @java.lang.Override
+    public java.lang.String getLocality() {
+      java.lang.Object ref = locality_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        locality_ = s;
+        return s;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * The town/city of the address.
+     * </pre>
+     *
+     * <code>string locality = 3;</code>
+     *
+     * @return The bytes for locality.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString getLocalityBytes() {
+      java.lang.Object ref = locality_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b =
+            com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+        locality_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int ADMINISTRATIVE_AREA_FIELD_NUMBER = 4;
+
+    @SuppressWarnings("serial")
+    private volatile java.lang.Object administrativeArea_ = "";
+    /**
+     *
+     *
+     * <pre>
+     * The state, province, or otherwise administrative area of the address.
+     * </pre>
+     *
+     * <code>string administrative_area = 4;</code>
+     *
+     * @return The administrativeArea.
+     */
+    @java.lang.Override
+    public java.lang.String getAdministrativeArea() {
+      java.lang.Object ref = administrativeArea_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        administrativeArea_ = s;
+        return s;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * The state, province, or otherwise administrative area of the address.
+     * </pre>
+     *
+     * <code>string administrative_area = 4;</code>
+     *
+     * @return The bytes for administrativeArea.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString getAdministrativeAreaBytes() {
+      java.lang.Object ref = administrativeArea_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b =
+            com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+        administrativeArea_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int REGION_CODE_FIELD_NUMBER = 5;
+
+    @SuppressWarnings("serial")
+    private volatile java.lang.Object regionCode_ = "";
+    /**
+     *
+     *
+     * <pre>
+     * The CLDR country/region of the address.
+     * </pre>
+     *
+     * <code>string region_code = 5;</code>
+     *
+     * @return The regionCode.
+     */
+    @java.lang.Override
+    public java.lang.String getRegionCode() {
+      java.lang.Object ref = regionCode_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        regionCode_ = s;
+        return s;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * The CLDR country/region of the address.
+     * </pre>
+     *
+     * <code>string region_code = 5;</code>
+     *
+     * @return The bytes for regionCode.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString getRegionCodeBytes() {
+      java.lang.Object ref = regionCode_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b =
+            com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+        regionCode_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int POSTAL_CODE_FIELD_NUMBER = 6;
+
+    @SuppressWarnings("serial")
+    private volatile java.lang.Object postalCode_ = "";
+    /**
+     *
+     *
+     * <pre>
+     * The postal or ZIP code of the address.
+     * </pre>
+     *
+     * <code>string postal_code = 6;</code>
+     *
+     * @return The postalCode.
+     */
+    @java.lang.Override
+    public java.lang.String getPostalCode() {
+      java.lang.Object ref = postalCode_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        postalCode_ = s;
+        return s;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * The postal or ZIP code of the address.
+     * </pre>
+     *
+     * <code>string postal_code = 6;</code>
+     *
+     * @return The bytes for postalCode.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString getPostalCodeBytes() {
+      java.lang.Object ref = postalCode_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b =
+            com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+        postalCode_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    private byte memoizedIsInitialized = -1;
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(recipient_)) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, recipient_);
+      }
+      for (int i = 0; i < address_.size(); i++) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, address_.getRaw(i));
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(locality_)) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 3, locality_);
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(administrativeArea_)) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 4, administrativeArea_);
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(regionCode_)) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 5, regionCode_);
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(postalCode_)) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 6, postalCode_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(recipient_)) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, recipient_);
+      }
+      {
+        int dataSize = 0;
+        for (int i = 0; i < address_.size(); i++) {
+          dataSize += computeStringSizeNoTag(address_.getRaw(i));
+        }
+        size += dataSize;
+        size += 1 * getAddressList().size();
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(locality_)) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, locality_);
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(administrativeArea_)) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, administrativeArea_);
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(regionCode_)) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, regionCode_);
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(postalCode_)) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(6, postalCode_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+        return true;
+      }
+      if (!(obj instanceof com.google.recaptchaenterprise.v1beta1.TransactionData.Address)) {
+        return super.equals(obj);
+      }
+      com.google.recaptchaenterprise.v1beta1.TransactionData.Address other =
+          (com.google.recaptchaenterprise.v1beta1.TransactionData.Address) obj;
+
+      if (!getRecipient().equals(other.getRecipient())) return false;
+      if (!getAddressList().equals(other.getAddressList())) return false;
+      if (!getLocality().equals(other.getLocality())) return false;
+      if (!getAdministrativeArea().equals(other.getAdministrativeArea())) return false;
+      if (!getRegionCode().equals(other.getRegionCode())) return false;
+      if (!getPostalCode().equals(other.getPostalCode())) return false;
+      if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + RECIPIENT_FIELD_NUMBER;
+      hash = (53 * hash) + getRecipient().hashCode();
+      if (getAddressCount() > 0) {
+        hash = (37 * hash) + ADDRESS_FIELD_NUMBER;
+        hash = (53 * hash) + getAddressList().hashCode();
+      }
+      hash = (37 * hash) + LOCALITY_FIELD_NUMBER;
+      hash = (53 * hash) + getLocality().hashCode();
+      hash = (37 * hash) + ADMINISTRATIVE_AREA_FIELD_NUMBER;
+      hash = (53 * hash) + getAdministrativeArea().hashCode();
+      hash = (37 * hash) + REGION_CODE_FIELD_NUMBER;
+      hash = (53 * hash) + getRegionCode().hashCode();
+      hash = (37 * hash) + POSTAL_CODE_FIELD_NUMBER;
+      hash = (53 * hash) + getPostalCode().hashCode();
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.Address parseFrom(
+        java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.Address parseFrom(
+        java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.Address parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.Address parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.Address parseFrom(
+        byte[] data) throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.Address parseFrom(
+        byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.Address parseFrom(
+        java.io.InputStream input) throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.Address parseFrom(
+        java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseWithIOException(
+          PARSER, input, extensionRegistry);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.Address parseDelimitedFrom(
+        java.io.InputStream input) throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.Address parseDelimitedFrom(
+        java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(
+          PARSER, input, extensionRegistry);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.Address parseFrom(
+        com.google.protobuf.CodedInputStream input) throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.Address parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseWithIOException(
+          PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() {
+      return newBuilder();
+    }
+
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+
+    public static Builder newBuilder(
+        com.google.recaptchaenterprise.v1beta1.TransactionData.Address prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Structured address format for billing and shipping addresses.
+     * </pre>
+     *
+     * Protobuf type {@code google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address}
+     */
+    public static final class Builder
+        extends com.google.protobuf.GeneratedMessageV3.Builder<Builder>
+        implements
+        // @@protoc_insertion_point(builder_implements:google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address)
+        com.google.recaptchaenterprise.v1beta1.TransactionData.AddressOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+        return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+            .internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_Address_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+            .internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_Address_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                com.google.recaptchaenterprise.v1beta1.TransactionData.Address.class,
+                com.google.recaptchaenterprise.v1beta1.TransactionData.Address.Builder.class);
+      }
+
+      // Construct using com.google.recaptchaenterprise.v1beta1.TransactionData.Address.newBuilder()
+      private Builder() {}
+
+      private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+      }
+
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        bitField0_ = 0;
+        recipient_ = "";
+        address_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+        bitField0_ = (bitField0_ & ~0x00000002);
+        locality_ = "";
+        administrativeArea_ = "";
+        regionCode_ = "";
+        postalCode_ = "";
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+        return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+            .internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_Address_descriptor;
+      }
+
+      @java.lang.Override
+      public com.google.recaptchaenterprise.v1beta1.TransactionData.Address
+          getDefaultInstanceForType() {
+        return com.google.recaptchaenterprise.v1beta1.TransactionData.Address.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public com.google.recaptchaenterprise.v1beta1.TransactionData.Address build() {
+        com.google.recaptchaenterprise.v1beta1.TransactionData.Address result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public com.google.recaptchaenterprise.v1beta1.TransactionData.Address buildPartial() {
+        com.google.recaptchaenterprise.v1beta1.TransactionData.Address result =
+            new com.google.recaptchaenterprise.v1beta1.TransactionData.Address(this);
+        buildPartialRepeatedFields(result);
+        if (bitField0_ != 0) {
+          buildPartial0(result);
+        }
+        onBuilt();
+        return result;
+      }
+
+      private void buildPartialRepeatedFields(
+          com.google.recaptchaenterprise.v1beta1.TransactionData.Address result) {
+        if (((bitField0_ & 0x00000002) != 0)) {
+          address_ = address_.getUnmodifiableView();
+          bitField0_ = (bitField0_ & ~0x00000002);
+        }
+        result.address_ = address_;
+      }
+
+      private void buildPartial0(
+          com.google.recaptchaenterprise.v1beta1.TransactionData.Address result) {
+        int from_bitField0_ = bitField0_;
+        if (((from_bitField0_ & 0x00000001) != 0)) {
+          result.recipient_ = recipient_;
+        }
+        if (((from_bitField0_ & 0x00000004) != 0)) {
+          result.locality_ = locality_;
+        }
+        if (((from_bitField0_ & 0x00000008) != 0)) {
+          result.administrativeArea_ = administrativeArea_;
+        }
+        if (((from_bitField0_ & 0x00000010) != 0)) {
+          result.regionCode_ = regionCode_;
+        }
+        if (((from_bitField0_ & 0x00000020) != 0)) {
+          result.postalCode_ = postalCode_;
+        }
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+        return super.setField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+
+      @java.lang.Override
+      public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index,
+          java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof com.google.recaptchaenterprise.v1beta1.TransactionData.Address) {
+          return mergeFrom((com.google.recaptchaenterprise.v1beta1.TransactionData.Address) other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(
+          com.google.recaptchaenterprise.v1beta1.TransactionData.Address other) {
+        if (other
+            == com.google.recaptchaenterprise.v1beta1.TransactionData.Address.getDefaultInstance())
+          return this;
+        if (!other.getRecipient().isEmpty()) {
+          recipient_ = other.recipient_;
+          bitField0_ |= 0x00000001;
+          onChanged();
+        }
+        if (!other.address_.isEmpty()) {
+          if (address_.isEmpty()) {
+            address_ = other.address_;
+            bitField0_ = (bitField0_ & ~0x00000002);
+          } else {
+            ensureAddressIsMutable();
+            address_.addAll(other.address_);
+          }
+          onChanged();
+        }
+        if (!other.getLocality().isEmpty()) {
+          locality_ = other.locality_;
+          bitField0_ |= 0x00000004;
+          onChanged();
+        }
+        if (!other.getAdministrativeArea().isEmpty()) {
+          administrativeArea_ = other.administrativeArea_;
+          bitField0_ |= 0x00000008;
+          onChanged();
+        }
+        if (!other.getRegionCode().isEmpty()) {
+          regionCode_ = other.regionCode_;
+          bitField0_ |= 0x00000010;
+          onChanged();
+        }
+        if (!other.getPostalCode().isEmpty()) {
+          postalCode_ = other.postalCode_;
+          bitField0_ |= 0x00000020;
+          onChanged();
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 10:
+                {
+                  recipient_ = input.readStringRequireUtf8();
+                  bitField0_ |= 0x00000001;
+                  break;
+                } // case 10
+              case 18:
+                {
+                  java.lang.String s = input.readStringRequireUtf8();
+                  ensureAddressIsMutable();
+                  address_.add(s);
+                  break;
+                } // case 18
+              case 26:
+                {
+                  locality_ = input.readStringRequireUtf8();
+                  bitField0_ |= 0x00000004;
+                  break;
+                } // case 26
+              case 34:
+                {
+                  administrativeArea_ = input.readStringRequireUtf8();
+                  bitField0_ |= 0x00000008;
+                  break;
+                } // case 34
+              case 42:
+                {
+                  regionCode_ = input.readStringRequireUtf8();
+                  bitField0_ |= 0x00000010;
+                  break;
+                } // case 42
+              case 50:
+                {
+                  postalCode_ = input.readStringRequireUtf8();
+                  bitField0_ |= 0x00000020;
+                  break;
+                } // case 50
+              default:
+                {
+                  if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                    done = true; // was an endgroup tag
+                  }
+                  break;
+                } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+
+      private int bitField0_;
+
+      private java.lang.Object recipient_ = "";
+      /**
+       *
+       *
+       * <pre>
+       * The recipient name, potentially including information such as "care of".
+       * </pre>
+       *
+       * <code>string recipient = 1;</code>
+       *
+       * @return The recipient.
+       */
+      public java.lang.String getRecipient() {
+        java.lang.Object ref = recipient_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          recipient_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The recipient name, potentially including information such as "care of".
+       * </pre>
+       *
+       * <code>string recipient = 1;</code>
+       *
+       * @return The bytes for recipient.
+       */
+      public com.google.protobuf.ByteString getRecipientBytes() {
+        java.lang.Object ref = recipient_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b =
+              com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+          recipient_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The recipient name, potentially including information such as "care of".
+       * </pre>
+       *
+       * <code>string recipient = 1;</code>
+       *
+       * @param value The recipient to set.
+       * @return This builder for chaining.
+       */
+      public Builder setRecipient(java.lang.String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        recipient_ = value;
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The recipient name, potentially including information such as "care of".
+       * </pre>
+       *
+       * <code>string recipient = 1;</code>
+       *
+       * @return This builder for chaining.
+       */
+      public Builder clearRecipient() {
+        recipient_ = getDefaultInstance().getRecipient();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The recipient name, potentially including information such as "care of".
+       * </pre>
+       *
+       * <code>string recipient = 1;</code>
+       *
+       * @param value The bytes for recipient to set.
+       * @return This builder for chaining.
+       */
+      public Builder setRecipientBytes(com.google.protobuf.ByteString value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        checkByteStringIsUtf8(value);
+        recipient_ = value;
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+
+      private com.google.protobuf.LazyStringList address_ =
+          com.google.protobuf.LazyStringArrayList.EMPTY;
+
+      private void ensureAddressIsMutable() {
+        if (!((bitField0_ & 0x00000002) != 0)) {
+          address_ = new com.google.protobuf.LazyStringArrayList(address_);
+          bitField0_ |= 0x00000002;
+        }
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The first lines of the address. The first line generally contains the
+       * street name and number, and further lines may include information such as
+       * an apartment number.
+       * </pre>
+       *
+       * <code>repeated string address = 2;</code>
+       *
+       * @return A list containing the address.
+       */
+      public com.google.protobuf.ProtocolStringList getAddressList() {
+        return address_.getUnmodifiableView();
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The first lines of the address. The first line generally contains the
+       * street name and number, and further lines may include information such as
+       * an apartment number.
+       * </pre>
+       *
+       * <code>repeated string address = 2;</code>
+       *
+       * @return The count of address.
+       */
+      public int getAddressCount() {
+        return address_.size();
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The first lines of the address. The first line generally contains the
+       * street name and number, and further lines may include information such as
+       * an apartment number.
+       * </pre>
+       *
+       * <code>repeated string address = 2;</code>
+       *
+       * @param index The index of the element to return.
+       * @return The address at the given index.
+       */
+      public java.lang.String getAddress(int index) {
+        return address_.get(index);
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The first lines of the address. The first line generally contains the
+       * street name and number, and further lines may include information such as
+       * an apartment number.
+       * </pre>
+       *
+       * <code>repeated string address = 2;</code>
+       *
+       * @param index The index of the value to return.
+       * @return The bytes of the address at the given index.
+       */
+      public com.google.protobuf.ByteString getAddressBytes(int index) {
+        return address_.getByteString(index);
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The first lines of the address. The first line generally contains the
+       * street name and number, and further lines may include information such as
+       * an apartment number.
+       * </pre>
+       *
+       * <code>repeated string address = 2;</code>
+       *
+       * @param index The index to set the value at.
+       * @param value The address to set.
+       * @return This builder for chaining.
+       */
+      public Builder setAddress(int index, java.lang.String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureAddressIsMutable();
+        address_.set(index, value);
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The first lines of the address. The first line generally contains the
+       * street name and number, and further lines may include information such as
+       * an apartment number.
+       * </pre>
+       *
+       * <code>repeated string address = 2;</code>
+       *
+       * @param value The address to add.
+       * @return This builder for chaining.
+       */
+      public Builder addAddress(java.lang.String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureAddressIsMutable();
+        address_.add(value);
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The first lines of the address. The first line generally contains the
+       * street name and number, and further lines may include information such as
+       * an apartment number.
+       * </pre>
+       *
+       * <code>repeated string address = 2;</code>
+       *
+       * @param values The address to add.
+       * @return This builder for chaining.
+       */
+      public Builder addAllAddress(java.lang.Iterable<java.lang.String> values) {
+        ensureAddressIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(values, address_);
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The first lines of the address. The first line generally contains the
+       * street name and number, and further lines may include information such as
+       * an apartment number.
+       * </pre>
+       *
+       * <code>repeated string address = 2;</code>
+       *
+       * @return This builder for chaining.
+       */
+      public Builder clearAddress() {
+        address_ = com.google.protobuf.LazyStringArrayList.EMPTY;
+        bitField0_ = (bitField0_ & ~0x00000002);
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The first lines of the address. The first line generally contains the
+       * street name and number, and further lines may include information such as
+       * an apartment number.
+       * </pre>
+       *
+       * <code>repeated string address = 2;</code>
+       *
+       * @param value The bytes of the address to add.
+       * @return This builder for chaining.
+       */
+      public Builder addAddressBytes(com.google.protobuf.ByteString value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        checkByteStringIsUtf8(value);
+        ensureAddressIsMutable();
+        address_.add(value);
+        onChanged();
+        return this;
+      }
+
+      private java.lang.Object locality_ = "";
+      /**
+       *
+       *
+       * <pre>
+       * The town/city of the address.
+       * </pre>
+       *
+       * <code>string locality = 3;</code>
+       *
+       * @return The locality.
+       */
+      public java.lang.String getLocality() {
+        java.lang.Object ref = locality_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          locality_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The town/city of the address.
+       * </pre>
+       *
+       * <code>string locality = 3;</code>
+       *
+       * @return The bytes for locality.
+       */
+      public com.google.protobuf.ByteString getLocalityBytes() {
+        java.lang.Object ref = locality_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b =
+              com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+          locality_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The town/city of the address.
+       * </pre>
+       *
+       * <code>string locality = 3;</code>
+       *
+       * @param value The locality to set.
+       * @return This builder for chaining.
+       */
+      public Builder setLocality(java.lang.String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        locality_ = value;
+        bitField0_ |= 0x00000004;
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The town/city of the address.
+       * </pre>
+       *
+       * <code>string locality = 3;</code>
+       *
+       * @return This builder for chaining.
+       */
+      public Builder clearLocality() {
+        locality_ = getDefaultInstance().getLocality();
+        bitField0_ = (bitField0_ & ~0x00000004);
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The town/city of the address.
+       * </pre>
+       *
+       * <code>string locality = 3;</code>
+       *
+       * @param value The bytes for locality to set.
+       * @return This builder for chaining.
+       */
+      public Builder setLocalityBytes(com.google.protobuf.ByteString value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        checkByteStringIsUtf8(value);
+        locality_ = value;
+        bitField0_ |= 0x00000004;
+        onChanged();
+        return this;
+      }
+
+      private java.lang.Object administrativeArea_ = "";
+      /**
+       *
+       *
+       * <pre>
+       * The state, province, or otherwise administrative area of the address.
+       * </pre>
+       *
+       * <code>string administrative_area = 4;</code>
+       *
+       * @return The administrativeArea.
+       */
+      public java.lang.String getAdministrativeArea() {
+        java.lang.Object ref = administrativeArea_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          administrativeArea_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The state, province, or otherwise administrative area of the address.
+       * </pre>
+       *
+       * <code>string administrative_area = 4;</code>
+       *
+       * @return The bytes for administrativeArea.
+       */
+      public com.google.protobuf.ByteString getAdministrativeAreaBytes() {
+        java.lang.Object ref = administrativeArea_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b =
+              com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+          administrativeArea_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The state, province, or otherwise administrative area of the address.
+       * </pre>
+       *
+       * <code>string administrative_area = 4;</code>
+       *
+       * @param value The administrativeArea to set.
+       * @return This builder for chaining.
+       */
+      public Builder setAdministrativeArea(java.lang.String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        administrativeArea_ = value;
+        bitField0_ |= 0x00000008;
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The state, province, or otherwise administrative area of the address.
+       * </pre>
+       *
+       * <code>string administrative_area = 4;</code>
+       *
+       * @return This builder for chaining.
+       */
+      public Builder clearAdministrativeArea() {
+        administrativeArea_ = getDefaultInstance().getAdministrativeArea();
+        bitField0_ = (bitField0_ & ~0x00000008);
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The state, province, or otherwise administrative area of the address.
+       * </pre>
+       *
+       * <code>string administrative_area = 4;</code>
+       *
+       * @param value The bytes for administrativeArea to set.
+       * @return This builder for chaining.
+       */
+      public Builder setAdministrativeAreaBytes(com.google.protobuf.ByteString value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        checkByteStringIsUtf8(value);
+        administrativeArea_ = value;
+        bitField0_ |= 0x00000008;
+        onChanged();
+        return this;
+      }
+
+      private java.lang.Object regionCode_ = "";
+      /**
+       *
+       *
+       * <pre>
+       * The CLDR country/region of the address.
+       * </pre>
+       *
+       * <code>string region_code = 5;</code>
+       *
+       * @return The regionCode.
+       */
+      public java.lang.String getRegionCode() {
+        java.lang.Object ref = regionCode_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          regionCode_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The CLDR country/region of the address.
+       * </pre>
+       *
+       * <code>string region_code = 5;</code>
+       *
+       * @return The bytes for regionCode.
+       */
+      public com.google.protobuf.ByteString getRegionCodeBytes() {
+        java.lang.Object ref = regionCode_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b =
+              com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+          regionCode_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The CLDR country/region of the address.
+       * </pre>
+       *
+       * <code>string region_code = 5;</code>
+       *
+       * @param value The regionCode to set.
+       * @return This builder for chaining.
+       */
+      public Builder setRegionCode(java.lang.String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        regionCode_ = value;
+        bitField0_ |= 0x00000010;
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The CLDR country/region of the address.
+       * </pre>
+       *
+       * <code>string region_code = 5;</code>
+       *
+       * @return This builder for chaining.
+       */
+      public Builder clearRegionCode() {
+        regionCode_ = getDefaultInstance().getRegionCode();
+        bitField0_ = (bitField0_ & ~0x00000010);
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The CLDR country/region of the address.
+       * </pre>
+       *
+       * <code>string region_code = 5;</code>
+       *
+       * @param value The bytes for regionCode to set.
+       * @return This builder for chaining.
+       */
+      public Builder setRegionCodeBytes(com.google.protobuf.ByteString value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        checkByteStringIsUtf8(value);
+        regionCode_ = value;
+        bitField0_ |= 0x00000010;
+        onChanged();
+        return this;
+      }
+
+      private java.lang.Object postalCode_ = "";
+      /**
+       *
+       *
+       * <pre>
+       * The postal or ZIP code of the address.
+       * </pre>
+       *
+       * <code>string postal_code = 6;</code>
+       *
+       * @return The postalCode.
+       */
+      public java.lang.String getPostalCode() {
+        java.lang.Object ref = postalCode_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          postalCode_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The postal or ZIP code of the address.
+       * </pre>
+       *
+       * <code>string postal_code = 6;</code>
+       *
+       * @return The bytes for postalCode.
+       */
+      public com.google.protobuf.ByteString getPostalCodeBytes() {
+        java.lang.Object ref = postalCode_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b =
+              com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+          postalCode_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The postal or ZIP code of the address.
+       * </pre>
+       *
+       * <code>string postal_code = 6;</code>
+       *
+       * @param value The postalCode to set.
+       * @return This builder for chaining.
+       */
+      public Builder setPostalCode(java.lang.String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        postalCode_ = value;
+        bitField0_ |= 0x00000020;
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The postal or ZIP code of the address.
+       * </pre>
+       *
+       * <code>string postal_code = 6;</code>
+       *
+       * @return This builder for chaining.
+       */
+      public Builder clearPostalCode() {
+        postalCode_ = getDefaultInstance().getPostalCode();
+        bitField0_ = (bitField0_ & ~0x00000020);
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The postal or ZIP code of the address.
+       * </pre>
+       *
+       * <code>string postal_code = 6;</code>
+       *
+       * @param value The bytes for postalCode to set.
+       * @return This builder for chaining.
+       */
+      public Builder setPostalCodeBytes(com.google.protobuf.ByteString value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        checkByteStringIsUtf8(value);
+        postalCode_ = value;
+        bitField0_ |= 0x00000020;
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+      // @@protoc_insertion_point(builder_scope:google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address)
+    }
+
+    // @@protoc_insertion_point(class_scope:google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address)
+    private static final com.google.recaptchaenterprise.v1beta1.TransactionData.Address
+        DEFAULT_INSTANCE;
+
+    static {
+      DEFAULT_INSTANCE = new com.google.recaptchaenterprise.v1beta1.TransactionData.Address();
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.Address
+        getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<Address> PARSER =
+        new com.google.protobuf.AbstractParser<Address>() {
+          @java.lang.Override
+          public Address parsePartialFrom(
+              com.google.protobuf.CodedInputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            Builder builder = newBuilder();
+            try {
+              builder.mergeFrom(input, extensionRegistry);
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+              throw e.setUnfinishedMessage(builder.buildPartial());
+            } catch (com.google.protobuf.UninitializedMessageException e) {
+              throw e.asInvalidProtocolBufferException()
+                  .setUnfinishedMessage(builder.buildPartial());
+            } catch (java.io.IOException e) {
+              throw new com.google.protobuf.InvalidProtocolBufferException(e)
+                  .setUnfinishedMessage(builder.buildPartial());
+            }
+            return builder.buildPartial();
+          }
+        };
+
+    public static com.google.protobuf.Parser<Address> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<Address> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.recaptchaenterprise.v1beta1.TransactionData.Address
+        getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+  }
+
+  public interface UserOrBuilder
+      extends
+      // @@protoc_insertion_point(interface_extends:google.cloud.recaptchaenterprise.v1beta1.TransactionData.User)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     *
+     *
+     * <pre>
+     * Unique account identifier for this user. If using account defender,
+     * this should match the hashed_account_id field. Otherwise, a unique and
+     * persistent identifier for this account.
+     * </pre>
+     *
+     * <code>string account_id = 6;</code>
+     *
+     * @return The accountId.
+     */
+    java.lang.String getAccountId();
+    /**
+     *
+     *
+     * <pre>
+     * Unique account identifier for this user. If using account defender,
+     * this should match the hashed_account_id field. Otherwise, a unique and
+     * persistent identifier for this account.
+     * </pre>
+     *
+     * <code>string account_id = 6;</code>
+     *
+     * @return The bytes for accountId.
+     */
+    com.google.protobuf.ByteString getAccountIdBytes();
+
+    /**
+     *
+     *
+     * <pre>
+     * The epoch milliseconds of the user's account creation.
+     * </pre>
+     *
+     * <code>int64 creation_ms = 1;</code>
+     *
+     * @return The creationMs.
+     */
+    long getCreationMs();
+
+    /**
+     *
+     *
+     * <pre>
+     * The email address of the user.
+     * </pre>
+     *
+     * <code>string email = 2;</code>
+     *
+     * @return The email.
+     */
+    java.lang.String getEmail();
+    /**
+     *
+     *
+     * <pre>
+     * The email address of the user.
+     * </pre>
+     *
+     * <code>string email = 2;</code>
+     *
+     * @return The bytes for email.
+     */
+    com.google.protobuf.ByteString getEmailBytes();
+
+    /**
+     *
+     *
+     * <pre>
+     * Whether the email has been verified to be accessible by the user (OTP or
+     * similar).
+     * </pre>
+     *
+     * <code>bool email_verified = 3;</code>
+     *
+     * @return The emailVerified.
+     */
+    boolean getEmailVerified();
+
+    /**
+     *
+     *
+     * <pre>
+     * The phone number of the user, with country code.
+     * </pre>
+     *
+     * <code>string phone_number = 4;</code>
+     *
+     * @return The phoneNumber.
+     */
+    java.lang.String getPhoneNumber();
+    /**
+     *
+     *
+     * <pre>
+     * The phone number of the user, with country code.
+     * </pre>
+     *
+     * <code>string phone_number = 4;</code>
+     *
+     * @return The bytes for phoneNumber.
+     */
+    com.google.protobuf.ByteString getPhoneNumberBytes();
+
+    /**
+     *
+     *
+     * <pre>
+     * Whether the phone number has been verified to be accessible by the user
+     * (OTP or similar).
+     * </pre>
+     *
+     * <code>bool phone_verified = 5;</code>
+     *
+     * @return The phoneVerified.
+     */
+    boolean getPhoneVerified();
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Details about a user's account involved in the transaction.
+   * </pre>
+   *
+   * Protobuf type {@code google.cloud.recaptchaenterprise.v1beta1.TransactionData.User}
+   */
+  public static final class User extends com.google.protobuf.GeneratedMessageV3
+      implements
+      // @@protoc_insertion_point(message_implements:google.cloud.recaptchaenterprise.v1beta1.TransactionData.User)
+      UserOrBuilder {
+    private static final long serialVersionUID = 0L;
+    // Use User.newBuilder() to construct.
+    private User(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+
+    private User() {
+      accountId_ = "";
+      email_ = "";
+      phoneNumber_ = "";
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(UnusedPrivateParameter unused) {
+      return new User();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+      return this.unknownFields;
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+      return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+          .internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_User_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+          .internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_User_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.google.recaptchaenterprise.v1beta1.TransactionData.User.class,
+              com.google.recaptchaenterprise.v1beta1.TransactionData.User.Builder.class);
+    }
+
+    public static final int ACCOUNT_ID_FIELD_NUMBER = 6;
+
+    @SuppressWarnings("serial")
+    private volatile java.lang.Object accountId_ = "";
+    /**
+     *
+     *
+     * <pre>
+     * Unique account identifier for this user. If using account defender,
+     * this should match the hashed_account_id field. Otherwise, a unique and
+     * persistent identifier for this account.
+     * </pre>
+     *
+     * <code>string account_id = 6;</code>
+     *
+     * @return The accountId.
+     */
+    @java.lang.Override
+    public java.lang.String getAccountId() {
+      java.lang.Object ref = accountId_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        accountId_ = s;
+        return s;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Unique account identifier for this user. If using account defender,
+     * this should match the hashed_account_id field. Otherwise, a unique and
+     * persistent identifier for this account.
+     * </pre>
+     *
+     * <code>string account_id = 6;</code>
+     *
+     * @return The bytes for accountId.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString getAccountIdBytes() {
+      java.lang.Object ref = accountId_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b =
+            com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+        accountId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int CREATION_MS_FIELD_NUMBER = 1;
+    private long creationMs_ = 0L;
+    /**
+     *
+     *
+     * <pre>
+     * The epoch milliseconds of the user's account creation.
+     * </pre>
+     *
+     * <code>int64 creation_ms = 1;</code>
+     *
+     * @return The creationMs.
+     */
+    @java.lang.Override
+    public long getCreationMs() {
+      return creationMs_;
+    }
+
+    public static final int EMAIL_FIELD_NUMBER = 2;
+
+    @SuppressWarnings("serial")
+    private volatile java.lang.Object email_ = "";
+    /**
+     *
+     *
+     * <pre>
+     * The email address of the user.
+     * </pre>
+     *
+     * <code>string email = 2;</code>
+     *
+     * @return The email.
+     */
+    @java.lang.Override
+    public java.lang.String getEmail() {
+      java.lang.Object ref = email_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        email_ = s;
+        return s;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * The email address of the user.
+     * </pre>
+     *
+     * <code>string email = 2;</code>
+     *
+     * @return The bytes for email.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString getEmailBytes() {
+      java.lang.Object ref = email_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b =
+            com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+        email_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int EMAIL_VERIFIED_FIELD_NUMBER = 3;
+    private boolean emailVerified_ = false;
+    /**
+     *
+     *
+     * <pre>
+     * Whether the email has been verified to be accessible by the user (OTP or
+     * similar).
+     * </pre>
+     *
+     * <code>bool email_verified = 3;</code>
+     *
+     * @return The emailVerified.
+     */
+    @java.lang.Override
+    public boolean getEmailVerified() {
+      return emailVerified_;
+    }
+
+    public static final int PHONE_NUMBER_FIELD_NUMBER = 4;
+
+    @SuppressWarnings("serial")
+    private volatile java.lang.Object phoneNumber_ = "";
+    /**
+     *
+     *
+     * <pre>
+     * The phone number of the user, with country code.
+     * </pre>
+     *
+     * <code>string phone_number = 4;</code>
+     *
+     * @return The phoneNumber.
+     */
+    @java.lang.Override
+    public java.lang.String getPhoneNumber() {
+      java.lang.Object ref = phoneNumber_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        phoneNumber_ = s;
+        return s;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * The phone number of the user, with country code.
+     * </pre>
+     *
+     * <code>string phone_number = 4;</code>
+     *
+     * @return The bytes for phoneNumber.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString getPhoneNumberBytes() {
+      java.lang.Object ref = phoneNumber_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b =
+            com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+        phoneNumber_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int PHONE_VERIFIED_FIELD_NUMBER = 5;
+    private boolean phoneVerified_ = false;
+    /**
+     *
+     *
+     * <pre>
+     * Whether the phone number has been verified to be accessible by the user
+     * (OTP or similar).
+     * </pre>
+     *
+     * <code>bool phone_verified = 5;</code>
+     *
+     * @return The phoneVerified.
+     */
+    @java.lang.Override
+    public boolean getPhoneVerified() {
+      return phoneVerified_;
+    }
+
+    private byte memoizedIsInitialized = -1;
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
+      if (creationMs_ != 0L) {
+        output.writeInt64(1, creationMs_);
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(email_)) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, email_);
+      }
+      if (emailVerified_ != false) {
+        output.writeBool(3, emailVerified_);
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(phoneNumber_)) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 4, phoneNumber_);
+      }
+      if (phoneVerified_ != false) {
+        output.writeBool(5, phoneVerified_);
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(accountId_)) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 6, accountId_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (creationMs_ != 0L) {
+        size += com.google.protobuf.CodedOutputStream.computeInt64Size(1, creationMs_);
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(email_)) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, email_);
+      }
+      if (emailVerified_ != false) {
+        size += com.google.protobuf.CodedOutputStream.computeBoolSize(3, emailVerified_);
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(phoneNumber_)) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, phoneNumber_);
+      }
+      if (phoneVerified_ != false) {
+        size += com.google.protobuf.CodedOutputStream.computeBoolSize(5, phoneVerified_);
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(accountId_)) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(6, accountId_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+        return true;
+      }
+      if (!(obj instanceof com.google.recaptchaenterprise.v1beta1.TransactionData.User)) {
+        return super.equals(obj);
+      }
+      com.google.recaptchaenterprise.v1beta1.TransactionData.User other =
+          (com.google.recaptchaenterprise.v1beta1.TransactionData.User) obj;
+
+      if (!getAccountId().equals(other.getAccountId())) return false;
+      if (getCreationMs() != other.getCreationMs()) return false;
+      if (!getEmail().equals(other.getEmail())) return false;
+      if (getEmailVerified() != other.getEmailVerified()) return false;
+      if (!getPhoneNumber().equals(other.getPhoneNumber())) return false;
+      if (getPhoneVerified() != other.getPhoneVerified()) return false;
+      if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + ACCOUNT_ID_FIELD_NUMBER;
+      hash = (53 * hash) + getAccountId().hashCode();
+      hash = (37 * hash) + CREATION_MS_FIELD_NUMBER;
+      hash = (53 * hash) + com.google.protobuf.Internal.hashLong(getCreationMs());
+      hash = (37 * hash) + EMAIL_FIELD_NUMBER;
+      hash = (53 * hash) + getEmail().hashCode();
+      hash = (37 * hash) + EMAIL_VERIFIED_FIELD_NUMBER;
+      hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getEmailVerified());
+      hash = (37 * hash) + PHONE_NUMBER_FIELD_NUMBER;
+      hash = (53 * hash) + getPhoneNumber().hashCode();
+      hash = (37 * hash) + PHONE_VERIFIED_FIELD_NUMBER;
+      hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getPhoneVerified());
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.User parseFrom(
+        java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.User parseFrom(
+        java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.User parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.User parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.User parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.User parseFrom(
+        byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.User parseFrom(
+        java.io.InputStream input) throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.User parseFrom(
+        java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseWithIOException(
+          PARSER, input, extensionRegistry);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.User parseDelimitedFrom(
+        java.io.InputStream input) throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.User parseDelimitedFrom(
+        java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(
+          PARSER, input, extensionRegistry);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.User parseFrom(
+        com.google.protobuf.CodedInputStream input) throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.User parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseWithIOException(
+          PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() {
+      return newBuilder();
+    }
+
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+
+    public static Builder newBuilder(
+        com.google.recaptchaenterprise.v1beta1.TransactionData.User prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Details about a user's account involved in the transaction.
+     * </pre>
+     *
+     * Protobuf type {@code google.cloud.recaptchaenterprise.v1beta1.TransactionData.User}
+     */
+    public static final class Builder
+        extends com.google.protobuf.GeneratedMessageV3.Builder<Builder>
+        implements
+        // @@protoc_insertion_point(builder_implements:google.cloud.recaptchaenterprise.v1beta1.TransactionData.User)
+        com.google.recaptchaenterprise.v1beta1.TransactionData.UserOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+        return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+            .internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_User_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+            .internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_User_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                com.google.recaptchaenterprise.v1beta1.TransactionData.User.class,
+                com.google.recaptchaenterprise.v1beta1.TransactionData.User.Builder.class);
+      }
+
+      // Construct using com.google.recaptchaenterprise.v1beta1.TransactionData.User.newBuilder()
+      private Builder() {}
+
+      private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+      }
+
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        bitField0_ = 0;
+        accountId_ = "";
+        creationMs_ = 0L;
+        email_ = "";
+        emailVerified_ = false;
+        phoneNumber_ = "";
+        phoneVerified_ = false;
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+        return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+            .internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_User_descriptor;
+      }
+
+      @java.lang.Override
+      public com.google.recaptchaenterprise.v1beta1.TransactionData.User
+          getDefaultInstanceForType() {
+        return com.google.recaptchaenterprise.v1beta1.TransactionData.User.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public com.google.recaptchaenterprise.v1beta1.TransactionData.User build() {
+        com.google.recaptchaenterprise.v1beta1.TransactionData.User result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public com.google.recaptchaenterprise.v1beta1.TransactionData.User buildPartial() {
+        com.google.recaptchaenterprise.v1beta1.TransactionData.User result =
+            new com.google.recaptchaenterprise.v1beta1.TransactionData.User(this);
+        if (bitField0_ != 0) {
+          buildPartial0(result);
+        }
+        onBuilt();
+        return result;
+      }
+
+      private void buildPartial0(
+          com.google.recaptchaenterprise.v1beta1.TransactionData.User result) {
+        int from_bitField0_ = bitField0_;
+        if (((from_bitField0_ & 0x00000001) != 0)) {
+          result.accountId_ = accountId_;
+        }
+        if (((from_bitField0_ & 0x00000002) != 0)) {
+          result.creationMs_ = creationMs_;
+        }
+        if (((from_bitField0_ & 0x00000004) != 0)) {
+          result.email_ = email_;
+        }
+        if (((from_bitField0_ & 0x00000008) != 0)) {
+          result.emailVerified_ = emailVerified_;
+        }
+        if (((from_bitField0_ & 0x00000010) != 0)) {
+          result.phoneNumber_ = phoneNumber_;
+        }
+        if (((from_bitField0_ & 0x00000020) != 0)) {
+          result.phoneVerified_ = phoneVerified_;
+        }
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+        return super.setField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+
+      @java.lang.Override
+      public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index,
+          java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof com.google.recaptchaenterprise.v1beta1.TransactionData.User) {
+          return mergeFrom((com.google.recaptchaenterprise.v1beta1.TransactionData.User) other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(com.google.recaptchaenterprise.v1beta1.TransactionData.User other) {
+        if (other
+            == com.google.recaptchaenterprise.v1beta1.TransactionData.User.getDefaultInstance())
+          return this;
+        if (!other.getAccountId().isEmpty()) {
+          accountId_ = other.accountId_;
+          bitField0_ |= 0x00000001;
+          onChanged();
+        }
+        if (other.getCreationMs() != 0L) {
+          setCreationMs(other.getCreationMs());
+        }
+        if (!other.getEmail().isEmpty()) {
+          email_ = other.email_;
+          bitField0_ |= 0x00000004;
+          onChanged();
+        }
+        if (other.getEmailVerified() != false) {
+          setEmailVerified(other.getEmailVerified());
+        }
+        if (!other.getPhoneNumber().isEmpty()) {
+          phoneNumber_ = other.phoneNumber_;
+          bitField0_ |= 0x00000010;
+          onChanged();
+        }
+        if (other.getPhoneVerified() != false) {
+          setPhoneVerified(other.getPhoneVerified());
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 8:
+                {
+                  creationMs_ = input.readInt64();
+                  bitField0_ |= 0x00000002;
+                  break;
+                } // case 8
+              case 18:
+                {
+                  email_ = input.readStringRequireUtf8();
+                  bitField0_ |= 0x00000004;
+                  break;
+                } // case 18
+              case 24:
+                {
+                  emailVerified_ = input.readBool();
+                  bitField0_ |= 0x00000008;
+                  break;
+                } // case 24
+              case 34:
+                {
+                  phoneNumber_ = input.readStringRequireUtf8();
+                  bitField0_ |= 0x00000010;
+                  break;
+                } // case 34
+              case 40:
+                {
+                  phoneVerified_ = input.readBool();
+                  bitField0_ |= 0x00000020;
+                  break;
+                } // case 40
+              case 50:
+                {
+                  accountId_ = input.readStringRequireUtf8();
+                  bitField0_ |= 0x00000001;
+                  break;
+                } // case 50
+              default:
+                {
+                  if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                    done = true; // was an endgroup tag
+                  }
+                  break;
+                } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+
+      private int bitField0_;
+
+      private java.lang.Object accountId_ = "";
+      /**
+       *
+       *
+       * <pre>
+       * Unique account identifier for this user. If using account defender,
+       * this should match the hashed_account_id field. Otherwise, a unique and
+       * persistent identifier for this account.
+       * </pre>
+       *
+       * <code>string account_id = 6;</code>
+       *
+       * @return The accountId.
+       */
+      public java.lang.String getAccountId() {
+        java.lang.Object ref = accountId_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          accountId_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       *
+       *
+       * <pre>
+       * Unique account identifier for this user. If using account defender,
+       * this should match the hashed_account_id field. Otherwise, a unique and
+       * persistent identifier for this account.
+       * </pre>
+       *
+       * <code>string account_id = 6;</code>
+       *
+       * @return The bytes for accountId.
+       */
+      public com.google.protobuf.ByteString getAccountIdBytes() {
+        java.lang.Object ref = accountId_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b =
+              com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+          accountId_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       *
+       *
+       * <pre>
+       * Unique account identifier for this user. If using account defender,
+       * this should match the hashed_account_id field. Otherwise, a unique and
+       * persistent identifier for this account.
+       * </pre>
+       *
+       * <code>string account_id = 6;</code>
+       *
+       * @param value The accountId to set.
+       * @return This builder for chaining.
+       */
+      public Builder setAccountId(java.lang.String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        accountId_ = value;
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * Unique account identifier for this user. If using account defender,
+       * this should match the hashed_account_id field. Otherwise, a unique and
+       * persistent identifier for this account.
+       * </pre>
+       *
+       * <code>string account_id = 6;</code>
+       *
+       * @return This builder for chaining.
+       */
+      public Builder clearAccountId() {
+        accountId_ = getDefaultInstance().getAccountId();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * Unique account identifier for this user. If using account defender,
+       * this should match the hashed_account_id field. Otherwise, a unique and
+       * persistent identifier for this account.
+       * </pre>
+       *
+       * <code>string account_id = 6;</code>
+       *
+       * @param value The bytes for accountId to set.
+       * @return This builder for chaining.
+       */
+      public Builder setAccountIdBytes(com.google.protobuf.ByteString value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        checkByteStringIsUtf8(value);
+        accountId_ = value;
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+
+      private long creationMs_;
+      /**
+       *
+       *
+       * <pre>
+       * The epoch milliseconds of the user's account creation.
+       * </pre>
+       *
+       * <code>int64 creation_ms = 1;</code>
+       *
+       * @return The creationMs.
+       */
+      @java.lang.Override
+      public long getCreationMs() {
+        return creationMs_;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The epoch milliseconds of the user's account creation.
+       * </pre>
+       *
+       * <code>int64 creation_ms = 1;</code>
+       *
+       * @param value The creationMs to set.
+       * @return This builder for chaining.
+       */
+      public Builder setCreationMs(long value) {
+
+        creationMs_ = value;
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The epoch milliseconds of the user's account creation.
+       * </pre>
+       *
+       * <code>int64 creation_ms = 1;</code>
+       *
+       * @return This builder for chaining.
+       */
+      public Builder clearCreationMs() {
+        bitField0_ = (bitField0_ & ~0x00000002);
+        creationMs_ = 0L;
+        onChanged();
+        return this;
+      }
+
+      private java.lang.Object email_ = "";
+      /**
+       *
+       *
+       * <pre>
+       * The email address of the user.
+       * </pre>
+       *
+       * <code>string email = 2;</code>
+       *
+       * @return The email.
+       */
+      public java.lang.String getEmail() {
+        java.lang.Object ref = email_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          email_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The email address of the user.
+       * </pre>
+       *
+       * <code>string email = 2;</code>
+       *
+       * @return The bytes for email.
+       */
+      public com.google.protobuf.ByteString getEmailBytes() {
+        java.lang.Object ref = email_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b =
+              com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+          email_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The email address of the user.
+       * </pre>
+       *
+       * <code>string email = 2;</code>
+       *
+       * @param value The email to set.
+       * @return This builder for chaining.
+       */
+      public Builder setEmail(java.lang.String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        email_ = value;
+        bitField0_ |= 0x00000004;
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The email address of the user.
+       * </pre>
+       *
+       * <code>string email = 2;</code>
+       *
+       * @return This builder for chaining.
+       */
+      public Builder clearEmail() {
+        email_ = getDefaultInstance().getEmail();
+        bitField0_ = (bitField0_ & ~0x00000004);
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The email address of the user.
+       * </pre>
+       *
+       * <code>string email = 2;</code>
+       *
+       * @param value The bytes for email to set.
+       * @return This builder for chaining.
+       */
+      public Builder setEmailBytes(com.google.protobuf.ByteString value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        checkByteStringIsUtf8(value);
+        email_ = value;
+        bitField0_ |= 0x00000004;
+        onChanged();
+        return this;
+      }
+
+      private boolean emailVerified_;
+      /**
+       *
+       *
+       * <pre>
+       * Whether the email has been verified to be accessible by the user (OTP or
+       * similar).
+       * </pre>
+       *
+       * <code>bool email_verified = 3;</code>
+       *
+       * @return The emailVerified.
+       */
+      @java.lang.Override
+      public boolean getEmailVerified() {
+        return emailVerified_;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * Whether the email has been verified to be accessible by the user (OTP or
+       * similar).
+       * </pre>
+       *
+       * <code>bool email_verified = 3;</code>
+       *
+       * @param value The emailVerified to set.
+       * @return This builder for chaining.
+       */
+      public Builder setEmailVerified(boolean value) {
+
+        emailVerified_ = value;
+        bitField0_ |= 0x00000008;
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * Whether the email has been verified to be accessible by the user (OTP or
+       * similar).
+       * </pre>
+       *
+       * <code>bool email_verified = 3;</code>
+       *
+       * @return This builder for chaining.
+       */
+      public Builder clearEmailVerified() {
+        bitField0_ = (bitField0_ & ~0x00000008);
+        emailVerified_ = false;
+        onChanged();
+        return this;
+      }
+
+      private java.lang.Object phoneNumber_ = "";
+      /**
+       *
+       *
+       * <pre>
+       * The phone number of the user, with country code.
+       * </pre>
+       *
+       * <code>string phone_number = 4;</code>
+       *
+       * @return The phoneNumber.
+       */
+      public java.lang.String getPhoneNumber() {
+        java.lang.Object ref = phoneNumber_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          phoneNumber_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The phone number of the user, with country code.
+       * </pre>
+       *
+       * <code>string phone_number = 4;</code>
+       *
+       * @return The bytes for phoneNumber.
+       */
+      public com.google.protobuf.ByteString getPhoneNumberBytes() {
+        java.lang.Object ref = phoneNumber_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b =
+              com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+          phoneNumber_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The phone number of the user, with country code.
+       * </pre>
+       *
+       * <code>string phone_number = 4;</code>
+       *
+       * @param value The phoneNumber to set.
+       * @return This builder for chaining.
+       */
+      public Builder setPhoneNumber(java.lang.String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        phoneNumber_ = value;
+        bitField0_ |= 0x00000010;
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The phone number of the user, with country code.
+       * </pre>
+       *
+       * <code>string phone_number = 4;</code>
+       *
+       * @return This builder for chaining.
+       */
+      public Builder clearPhoneNumber() {
+        phoneNumber_ = getDefaultInstance().getPhoneNumber();
+        bitField0_ = (bitField0_ & ~0x00000010);
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The phone number of the user, with country code.
+       * </pre>
+       *
+       * <code>string phone_number = 4;</code>
+       *
+       * @param value The bytes for phoneNumber to set.
+       * @return This builder for chaining.
+       */
+      public Builder setPhoneNumberBytes(com.google.protobuf.ByteString value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        checkByteStringIsUtf8(value);
+        phoneNumber_ = value;
+        bitField0_ |= 0x00000010;
+        onChanged();
+        return this;
+      }
+
+      private boolean phoneVerified_;
+      /**
+       *
+       *
+       * <pre>
+       * Whether the phone number has been verified to be accessible by the user
+       * (OTP or similar).
+       * </pre>
+       *
+       * <code>bool phone_verified = 5;</code>
+       *
+       * @return The phoneVerified.
+       */
+      @java.lang.Override
+      public boolean getPhoneVerified() {
+        return phoneVerified_;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * Whether the phone number has been verified to be accessible by the user
+       * (OTP or similar).
+       * </pre>
+       *
+       * <code>bool phone_verified = 5;</code>
+       *
+       * @param value The phoneVerified to set.
+       * @return This builder for chaining.
+       */
+      public Builder setPhoneVerified(boolean value) {
+
+        phoneVerified_ = value;
+        bitField0_ |= 0x00000020;
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * Whether the phone number has been verified to be accessible by the user
+       * (OTP or similar).
+       * </pre>
+       *
+       * <code>bool phone_verified = 5;</code>
+       *
+       * @return This builder for chaining.
+       */
+      public Builder clearPhoneVerified() {
+        bitField0_ = (bitField0_ & ~0x00000020);
+        phoneVerified_ = false;
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+      // @@protoc_insertion_point(builder_scope:google.cloud.recaptchaenterprise.v1beta1.TransactionData.User)
+    }
+
+    // @@protoc_insertion_point(class_scope:google.cloud.recaptchaenterprise.v1beta1.TransactionData.User)
+    private static final com.google.recaptchaenterprise.v1beta1.TransactionData.User
+        DEFAULT_INSTANCE;
+
+    static {
+      DEFAULT_INSTANCE = new com.google.recaptchaenterprise.v1beta1.TransactionData.User();
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.User getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<User> PARSER =
+        new com.google.protobuf.AbstractParser<User>() {
+          @java.lang.Override
+          public User parsePartialFrom(
+              com.google.protobuf.CodedInputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            Builder builder = newBuilder();
+            try {
+              builder.mergeFrom(input, extensionRegistry);
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+              throw e.setUnfinishedMessage(builder.buildPartial());
+            } catch (com.google.protobuf.UninitializedMessageException e) {
+              throw e.asInvalidProtocolBufferException()
+                  .setUnfinishedMessage(builder.buildPartial());
+            } catch (java.io.IOException e) {
+              throw new com.google.protobuf.InvalidProtocolBufferException(e)
+                  .setUnfinishedMessage(builder.buildPartial());
+            }
+            return builder.buildPartial();
+          }
+        };
+
+    public static com.google.protobuf.Parser<User> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<User> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.recaptchaenterprise.v1beta1.TransactionData.User getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+  }
+
+  public interface ItemOrBuilder
+      extends
+      // @@protoc_insertion_point(interface_extends:google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     *
+     *
+     * <pre>
+     * The full name of the item.
+     * </pre>
+     *
+     * <code>string name = 1;</code>
+     *
+     * @return The name.
+     */
+    java.lang.String getName();
+    /**
+     *
+     *
+     * <pre>
+     * The full name of the item.
+     * </pre>
+     *
+     * <code>string name = 1;</code>
+     *
+     * @return The bytes for name.
+     */
+    com.google.protobuf.ByteString getNameBytes();
+
+    /**
+     *
+     *
+     * <pre>
+     * The value per item that the user is paying, in the transaction currency,
+     * after discounts.
+     * </pre>
+     *
+     * <code>double value = 2;</code>
+     *
+     * @return The value.
+     */
+    double getValue();
+
+    /**
+     *
+     *
+     * <pre>
+     * The quantity of this item that is being purchased.
+     * </pre>
+     *
+     * <code>int64 quantity = 3;</code>
+     *
+     * @return The quantity.
+     */
+    long getQuantity();
+
+    /**
+     *
+     *
+     * <pre>
+     * When a merchant is specified, its corresponding account_id. Necessary to
+     * populate marketplace-style transactions.
+     * </pre>
+     *
+     * <code>string merchant_account_id = 4;</code>
+     *
+     * @return The merchantAccountId.
+     */
+    java.lang.String getMerchantAccountId();
+    /**
+     *
+     *
+     * <pre>
+     * When a merchant is specified, its corresponding account_id. Necessary to
+     * populate marketplace-style transactions.
+     * </pre>
+     *
+     * <code>string merchant_account_id = 4;</code>
+     *
+     * @return The bytes for merchantAccountId.
+     */
+    com.google.protobuf.ByteString getMerchantAccountIdBytes();
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Line items being purchased in this transaction.
+   * </pre>
+   *
+   * Protobuf type {@code google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item}
+   */
+  public static final class Item extends com.google.protobuf.GeneratedMessageV3
+      implements
+      // @@protoc_insertion_point(message_implements:google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item)
+      ItemOrBuilder {
+    private static final long serialVersionUID = 0L;
+    // Use Item.newBuilder() to construct.
+    private Item(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+
+    private Item() {
+      name_ = "";
+      merchantAccountId_ = "";
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(UnusedPrivateParameter unused) {
+      return new Item();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+      return this.unknownFields;
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+      return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+          .internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_Item_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+          .internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_Item_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.google.recaptchaenterprise.v1beta1.TransactionData.Item.class,
+              com.google.recaptchaenterprise.v1beta1.TransactionData.Item.Builder.class);
+    }
+
+    public static final int NAME_FIELD_NUMBER = 1;
+
+    @SuppressWarnings("serial")
+    private volatile java.lang.Object name_ = "";
+    /**
+     *
+     *
+     * <pre>
+     * The full name of the item.
+     * </pre>
+     *
+     * <code>string name = 1;</code>
+     *
+     * @return The name.
+     */
+    @java.lang.Override
+    public java.lang.String getName() {
+      java.lang.Object ref = name_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        name_ = s;
+        return s;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * The full name of the item.
+     * </pre>
+     *
+     * <code>string name = 1;</code>
+     *
+     * @return The bytes for name.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString getNameBytes() {
+      java.lang.Object ref = name_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b =
+            com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+        name_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int VALUE_FIELD_NUMBER = 2;
+    private double value_ = 0D;
+    /**
+     *
+     *
+     * <pre>
+     * The value per item that the user is paying, in the transaction currency,
+     * after discounts.
+     * </pre>
+     *
+     * <code>double value = 2;</code>
+     *
+     * @return The value.
+     */
+    @java.lang.Override
+    public double getValue() {
+      return value_;
+    }
+
+    public static final int QUANTITY_FIELD_NUMBER = 3;
+    private long quantity_ = 0L;
+    /**
+     *
+     *
+     * <pre>
+     * The quantity of this item that is being purchased.
+     * </pre>
+     *
+     * <code>int64 quantity = 3;</code>
+     *
+     * @return The quantity.
+     */
+    @java.lang.Override
+    public long getQuantity() {
+      return quantity_;
+    }
+
+    public static final int MERCHANT_ACCOUNT_ID_FIELD_NUMBER = 4;
+
+    @SuppressWarnings("serial")
+    private volatile java.lang.Object merchantAccountId_ = "";
+    /**
+     *
+     *
+     * <pre>
+     * When a merchant is specified, its corresponding account_id. Necessary to
+     * populate marketplace-style transactions.
+     * </pre>
+     *
+     * <code>string merchant_account_id = 4;</code>
+     *
+     * @return The merchantAccountId.
+     */
+    @java.lang.Override
+    public java.lang.String getMerchantAccountId() {
+      java.lang.Object ref = merchantAccountId_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        merchantAccountId_ = s;
+        return s;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * When a merchant is specified, its corresponding account_id. Necessary to
+     * populate marketplace-style transactions.
+     * </pre>
+     *
+     * <code>string merchant_account_id = 4;</code>
+     *
+     * @return The bytes for merchantAccountId.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString getMerchantAccountIdBytes() {
+      java.lang.Object ref = merchantAccountId_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b =
+            com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+        merchantAccountId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    private byte memoizedIsInitialized = -1;
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_);
+      }
+      if (java.lang.Double.doubleToRawLongBits(value_) != 0) {
+        output.writeDouble(2, value_);
+      }
+      if (quantity_ != 0L) {
+        output.writeInt64(3, quantity_);
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(merchantAccountId_)) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 4, merchantAccountId_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_);
+      }
+      if (java.lang.Double.doubleToRawLongBits(value_) != 0) {
+        size += com.google.protobuf.CodedOutputStream.computeDoubleSize(2, value_);
+      }
+      if (quantity_ != 0L) {
+        size += com.google.protobuf.CodedOutputStream.computeInt64Size(3, quantity_);
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(merchantAccountId_)) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, merchantAccountId_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+        return true;
+      }
+      if (!(obj instanceof com.google.recaptchaenterprise.v1beta1.TransactionData.Item)) {
+        return super.equals(obj);
+      }
+      com.google.recaptchaenterprise.v1beta1.TransactionData.Item other =
+          (com.google.recaptchaenterprise.v1beta1.TransactionData.Item) obj;
+
+      if (!getName().equals(other.getName())) return false;
+      if (java.lang.Double.doubleToLongBits(getValue())
+          != java.lang.Double.doubleToLongBits(other.getValue())) return false;
+      if (getQuantity() != other.getQuantity()) return false;
+      if (!getMerchantAccountId().equals(other.getMerchantAccountId())) return false;
+      if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + NAME_FIELD_NUMBER;
+      hash = (53 * hash) + getName().hashCode();
+      hash = (37 * hash) + VALUE_FIELD_NUMBER;
+      hash =
+          (53 * hash)
+              + com.google.protobuf.Internal.hashLong(
+                  java.lang.Double.doubleToLongBits(getValue()));
+      hash = (37 * hash) + QUANTITY_FIELD_NUMBER;
+      hash = (53 * hash) + com.google.protobuf.Internal.hashLong(getQuantity());
+      hash = (37 * hash) + MERCHANT_ACCOUNT_ID_FIELD_NUMBER;
+      hash = (53 * hash) + getMerchantAccountId().hashCode();
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.Item parseFrom(
+        java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.Item parseFrom(
+        java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.Item parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.Item parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.Item parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.Item parseFrom(
+        byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.Item parseFrom(
+        java.io.InputStream input) throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.Item parseFrom(
+        java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseWithIOException(
+          PARSER, input, extensionRegistry);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.Item parseDelimitedFrom(
+        java.io.InputStream input) throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.Item parseDelimitedFrom(
+        java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(
+          PARSER, input, extensionRegistry);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.Item parseFrom(
+        com.google.protobuf.CodedInputStream input) throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.Item parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseWithIOException(
+          PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() {
+      return newBuilder();
+    }
+
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+
+    public static Builder newBuilder(
+        com.google.recaptchaenterprise.v1beta1.TransactionData.Item prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Line items being purchased in this transaction.
+     * </pre>
+     *
+     * Protobuf type {@code google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item}
+     */
+    public static final class Builder
+        extends com.google.protobuf.GeneratedMessageV3.Builder<Builder>
+        implements
+        // @@protoc_insertion_point(builder_implements:google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item)
+        com.google.recaptchaenterprise.v1beta1.TransactionData.ItemOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+        return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+            .internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_Item_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+            .internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_Item_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                com.google.recaptchaenterprise.v1beta1.TransactionData.Item.class,
+                com.google.recaptchaenterprise.v1beta1.TransactionData.Item.Builder.class);
+      }
+
+      // Construct using com.google.recaptchaenterprise.v1beta1.TransactionData.Item.newBuilder()
+      private Builder() {}
+
+      private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+      }
+
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        bitField0_ = 0;
+        name_ = "";
+        value_ = 0D;
+        quantity_ = 0L;
+        merchantAccountId_ = "";
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+        return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+            .internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_Item_descriptor;
+      }
+
+      @java.lang.Override
+      public com.google.recaptchaenterprise.v1beta1.TransactionData.Item
+          getDefaultInstanceForType() {
+        return com.google.recaptchaenterprise.v1beta1.TransactionData.Item.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public com.google.recaptchaenterprise.v1beta1.TransactionData.Item build() {
+        com.google.recaptchaenterprise.v1beta1.TransactionData.Item result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public com.google.recaptchaenterprise.v1beta1.TransactionData.Item buildPartial() {
+        com.google.recaptchaenterprise.v1beta1.TransactionData.Item result =
+            new com.google.recaptchaenterprise.v1beta1.TransactionData.Item(this);
+        if (bitField0_ != 0) {
+          buildPartial0(result);
+        }
+        onBuilt();
+        return result;
+      }
+
+      private void buildPartial0(
+          com.google.recaptchaenterprise.v1beta1.TransactionData.Item result) {
+        int from_bitField0_ = bitField0_;
+        if (((from_bitField0_ & 0x00000001) != 0)) {
+          result.name_ = name_;
+        }
+        if (((from_bitField0_ & 0x00000002) != 0)) {
+          result.value_ = value_;
+        }
+        if (((from_bitField0_ & 0x00000004) != 0)) {
+          result.quantity_ = quantity_;
+        }
+        if (((from_bitField0_ & 0x00000008) != 0)) {
+          result.merchantAccountId_ = merchantAccountId_;
+        }
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+        return super.setField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+
+      @java.lang.Override
+      public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index,
+          java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof com.google.recaptchaenterprise.v1beta1.TransactionData.Item) {
+          return mergeFrom((com.google.recaptchaenterprise.v1beta1.TransactionData.Item) other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(com.google.recaptchaenterprise.v1beta1.TransactionData.Item other) {
+        if (other
+            == com.google.recaptchaenterprise.v1beta1.TransactionData.Item.getDefaultInstance())
+          return this;
+        if (!other.getName().isEmpty()) {
+          name_ = other.name_;
+          bitField0_ |= 0x00000001;
+          onChanged();
+        }
+        if (other.getValue() != 0D) {
+          setValue(other.getValue());
+        }
+        if (other.getQuantity() != 0L) {
+          setQuantity(other.getQuantity());
+        }
+        if (!other.getMerchantAccountId().isEmpty()) {
+          merchantAccountId_ = other.merchantAccountId_;
+          bitField0_ |= 0x00000008;
+          onChanged();
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 10:
+                {
+                  name_ = input.readStringRequireUtf8();
+                  bitField0_ |= 0x00000001;
+                  break;
+                } // case 10
+              case 17:
+                {
+                  value_ = input.readDouble();
+                  bitField0_ |= 0x00000002;
+                  break;
+                } // case 17
+              case 24:
+                {
+                  quantity_ = input.readInt64();
+                  bitField0_ |= 0x00000004;
+                  break;
+                } // case 24
+              case 34:
+                {
+                  merchantAccountId_ = input.readStringRequireUtf8();
+                  bitField0_ |= 0x00000008;
+                  break;
+                } // case 34
+              default:
+                {
+                  if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                    done = true; // was an endgroup tag
+                  }
+                  break;
+                } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+
+      private int bitField0_;
+
+      private java.lang.Object name_ = "";
+      /**
+       *
+       *
+       * <pre>
+       * The full name of the item.
+       * </pre>
+       *
+       * <code>string name = 1;</code>
+       *
+       * @return The name.
+       */
+      public java.lang.String getName() {
+        java.lang.Object ref = name_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          name_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The full name of the item.
+       * </pre>
+       *
+       * <code>string name = 1;</code>
+       *
+       * @return The bytes for name.
+       */
+      public com.google.protobuf.ByteString getNameBytes() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b =
+              com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+          name_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The full name of the item.
+       * </pre>
+       *
+       * <code>string name = 1;</code>
+       *
+       * @param value The name to set.
+       * @return This builder for chaining.
+       */
+      public Builder setName(java.lang.String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        name_ = value;
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The full name of the item.
+       * </pre>
+       *
+       * <code>string name = 1;</code>
+       *
+       * @return This builder for chaining.
+       */
+      public Builder clearName() {
+        name_ = getDefaultInstance().getName();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The full name of the item.
+       * </pre>
+       *
+       * <code>string name = 1;</code>
+       *
+       * @param value The bytes for name to set.
+       * @return This builder for chaining.
+       */
+      public Builder setNameBytes(com.google.protobuf.ByteString value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        checkByteStringIsUtf8(value);
+        name_ = value;
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+
+      private double value_;
+      /**
+       *
+       *
+       * <pre>
+       * The value per item that the user is paying, in the transaction currency,
+       * after discounts.
+       * </pre>
+       *
+       * <code>double value = 2;</code>
+       *
+       * @return The value.
+       */
+      @java.lang.Override
+      public double getValue() {
+        return value_;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The value per item that the user is paying, in the transaction currency,
+       * after discounts.
+       * </pre>
+       *
+       * <code>double value = 2;</code>
+       *
+       * @param value The value to set.
+       * @return This builder for chaining.
+       */
+      public Builder setValue(double value) {
+
+        value_ = value;
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The value per item that the user is paying, in the transaction currency,
+       * after discounts.
+       * </pre>
+       *
+       * <code>double value = 2;</code>
+       *
+       * @return This builder for chaining.
+       */
+      public Builder clearValue() {
+        bitField0_ = (bitField0_ & ~0x00000002);
+        value_ = 0D;
+        onChanged();
+        return this;
+      }
+
+      private long quantity_;
+      /**
+       *
+       *
+       * <pre>
+       * The quantity of this item that is being purchased.
+       * </pre>
+       *
+       * <code>int64 quantity = 3;</code>
+       *
+       * @return The quantity.
+       */
+      @java.lang.Override
+      public long getQuantity() {
+        return quantity_;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The quantity of this item that is being purchased.
+       * </pre>
+       *
+       * <code>int64 quantity = 3;</code>
+       *
+       * @param value The quantity to set.
+       * @return This builder for chaining.
+       */
+      public Builder setQuantity(long value) {
+
+        quantity_ = value;
+        bitField0_ |= 0x00000004;
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * The quantity of this item that is being purchased.
+       * </pre>
+       *
+       * <code>int64 quantity = 3;</code>
+       *
+       * @return This builder for chaining.
+       */
+      public Builder clearQuantity() {
+        bitField0_ = (bitField0_ & ~0x00000004);
+        quantity_ = 0L;
+        onChanged();
+        return this;
+      }
+
+      private java.lang.Object merchantAccountId_ = "";
+      /**
+       *
+       *
+       * <pre>
+       * When a merchant is specified, its corresponding account_id. Necessary to
+       * populate marketplace-style transactions.
+       * </pre>
+       *
+       * <code>string merchant_account_id = 4;</code>
+       *
+       * @return The merchantAccountId.
+       */
+      public java.lang.String getMerchantAccountId() {
+        java.lang.Object ref = merchantAccountId_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          merchantAccountId_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       *
+       *
+       * <pre>
+       * When a merchant is specified, its corresponding account_id. Necessary to
+       * populate marketplace-style transactions.
+       * </pre>
+       *
+       * <code>string merchant_account_id = 4;</code>
+       *
+       * @return The bytes for merchantAccountId.
+       */
+      public com.google.protobuf.ByteString getMerchantAccountIdBytes() {
+        java.lang.Object ref = merchantAccountId_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b =
+              com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+          merchantAccountId_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       *
+       *
+       * <pre>
+       * When a merchant is specified, its corresponding account_id. Necessary to
+       * populate marketplace-style transactions.
+       * </pre>
+       *
+       * <code>string merchant_account_id = 4;</code>
+       *
+       * @param value The merchantAccountId to set.
+       * @return This builder for chaining.
+       */
+      public Builder setMerchantAccountId(java.lang.String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        merchantAccountId_ = value;
+        bitField0_ |= 0x00000008;
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * When a merchant is specified, its corresponding account_id. Necessary to
+       * populate marketplace-style transactions.
+       * </pre>
+       *
+       * <code>string merchant_account_id = 4;</code>
+       *
+       * @return This builder for chaining.
+       */
+      public Builder clearMerchantAccountId() {
+        merchantAccountId_ = getDefaultInstance().getMerchantAccountId();
+        bitField0_ = (bitField0_ & ~0x00000008);
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * When a merchant is specified, its corresponding account_id. Necessary to
+       * populate marketplace-style transactions.
+       * </pre>
+       *
+       * <code>string merchant_account_id = 4;</code>
+       *
+       * @param value The bytes for merchantAccountId to set.
+       * @return This builder for chaining.
+       */
+      public Builder setMerchantAccountIdBytes(com.google.protobuf.ByteString value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        checkByteStringIsUtf8(value);
+        merchantAccountId_ = value;
+        bitField0_ |= 0x00000008;
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+      // @@protoc_insertion_point(builder_scope:google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item)
+    }
+
+    // @@protoc_insertion_point(class_scope:google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item)
+    private static final com.google.recaptchaenterprise.v1beta1.TransactionData.Item
+        DEFAULT_INSTANCE;
+
+    static {
+      DEFAULT_INSTANCE = new com.google.recaptchaenterprise.v1beta1.TransactionData.Item();
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.Item getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<Item> PARSER =
+        new com.google.protobuf.AbstractParser<Item>() {
+          @java.lang.Override
+          public Item parsePartialFrom(
+              com.google.protobuf.CodedInputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            Builder builder = newBuilder();
+            try {
+              builder.mergeFrom(input, extensionRegistry);
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+              throw e.setUnfinishedMessage(builder.buildPartial());
+            } catch (com.google.protobuf.UninitializedMessageException e) {
+              throw e.asInvalidProtocolBufferException()
+                  .setUnfinishedMessage(builder.buildPartial());
+            } catch (java.io.IOException e) {
+              throw new com.google.protobuf.InvalidProtocolBufferException(e)
+                  .setUnfinishedMessage(builder.buildPartial());
+            }
+            return builder.buildPartial();
+          }
+        };
+
+    public static com.google.protobuf.Parser<Item> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<Item> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.recaptchaenterprise.v1beta1.TransactionData.Item getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+  }
+
+  public interface GatewayInfoOrBuilder
+      extends
+      // @@protoc_insertion_point(interface_extends:google.cloud.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     *
+     *
+     * <pre>
+     * Name of the gateway service (for example, stripe, square, paypal).
+     * </pre>
+     *
+     * <code>string name = 1;</code>
+     *
+     * @return The name.
+     */
+    java.lang.String getName();
+    /**
+     *
+     *
+     * <pre>
+     * Name of the gateway service (for example, stripe, square, paypal).
+     * </pre>
+     *
+     * <code>string name = 1;</code>
+     *
+     * @return The bytes for name.
+     */
+    com.google.protobuf.ByteString getNameBytes();
+
+    /**
+     *
+     *
+     * <pre>
+     * Gateway response code describing the state of the transaction.
+     * </pre>
+     *
+     * <code>string gateway_response_code = 2;</code>
+     *
+     * @return The gatewayResponseCode.
+     */
+    java.lang.String getGatewayResponseCode();
+    /**
+     *
+     *
+     * <pre>
+     * Gateway response code describing the state of the transaction.
+     * </pre>
+     *
+     * <code>string gateway_response_code = 2;</code>
+     *
+     * @return The bytes for gatewayResponseCode.
+     */
+    com.google.protobuf.ByteString getGatewayResponseCodeBytes();
+
+    /**
+     *
+     *
+     * <pre>
+     * AVS response code from the gateway
+     * (available only when reCAPTCHA Enterprise is called after authorization).
+     * </pre>
+     *
+     * <code>string avs_response_code = 3;</code>
+     *
+     * @return The avsResponseCode.
+     */
+    java.lang.String getAvsResponseCode();
+    /**
+     *
+     *
+     * <pre>
+     * AVS response code from the gateway
+     * (available only when reCAPTCHA Enterprise is called after authorization).
+     * </pre>
+     *
+     * <code>string avs_response_code = 3;</code>
+     *
+     * @return The bytes for avsResponseCode.
+     */
+    com.google.protobuf.ByteString getAvsResponseCodeBytes();
+
+    /**
+     *
+     *
+     * <pre>
+     * CVV response code from the gateway
+     * (available only when reCAPTCHA Enterprise is called after authorization).
+     * </pre>
+     *
+     * <code>string cvv_response_code = 4;</code>
+     *
+     * @return The cvvResponseCode.
+     */
+    java.lang.String getCvvResponseCode();
+    /**
+     *
+     *
+     * <pre>
+     * CVV response code from the gateway
+     * (available only when reCAPTCHA Enterprise is called after authorization).
+     * </pre>
+     *
+     * <code>string cvv_response_code = 4;</code>
+     *
+     * @return The bytes for cvvResponseCode.
+     */
+    com.google.protobuf.ByteString getCvvResponseCodeBytes();
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Details about the transaction from the gateway.
+   * </pre>
+   *
+   * Protobuf type {@code google.cloud.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo}
+   */
+  public static final class GatewayInfo extends com.google.protobuf.GeneratedMessageV3
+      implements
+      // @@protoc_insertion_point(message_implements:google.cloud.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo)
+      GatewayInfoOrBuilder {
+    private static final long serialVersionUID = 0L;
+    // Use GatewayInfo.newBuilder() to construct.
+    private GatewayInfo(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+
+    private GatewayInfo() {
+      name_ = "";
+      gatewayResponseCode_ = "";
+      avsResponseCode_ = "";
+      cvvResponseCode_ = "";
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(UnusedPrivateParameter unused) {
+      return new GatewayInfo();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+      return this.unknownFields;
+    }
+
+    public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+      return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+          .internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_GatewayInfo_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+          .internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_GatewayInfo_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo.class,
+              com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo.Builder.class);
+    }
+
+    public static final int NAME_FIELD_NUMBER = 1;
+
+    @SuppressWarnings("serial")
+    private volatile java.lang.Object name_ = "";
+    /**
+     *
+     *
+     * <pre>
+     * Name of the gateway service (for example, stripe, square, paypal).
+     * </pre>
+     *
+     * <code>string name = 1;</code>
+     *
+     * @return The name.
+     */
+    @java.lang.Override
+    public java.lang.String getName() {
+      java.lang.Object ref = name_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        name_ = s;
+        return s;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Name of the gateway service (for example, stripe, square, paypal).
+     * </pre>
+     *
+     * <code>string name = 1;</code>
+     *
+     * @return The bytes for name.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString getNameBytes() {
+      java.lang.Object ref = name_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b =
+            com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+        name_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int GATEWAY_RESPONSE_CODE_FIELD_NUMBER = 2;
+
+    @SuppressWarnings("serial")
+    private volatile java.lang.Object gatewayResponseCode_ = "";
+    /**
+     *
+     *
+     * <pre>
+     * Gateway response code describing the state of the transaction.
+     * </pre>
+     *
+     * <code>string gateway_response_code = 2;</code>
+     *
+     * @return The gatewayResponseCode.
+     */
+    @java.lang.Override
+    public java.lang.String getGatewayResponseCode() {
+      java.lang.Object ref = gatewayResponseCode_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        gatewayResponseCode_ = s;
+        return s;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Gateway response code describing the state of the transaction.
+     * </pre>
+     *
+     * <code>string gateway_response_code = 2;</code>
+     *
+     * @return The bytes for gatewayResponseCode.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString getGatewayResponseCodeBytes() {
+      java.lang.Object ref = gatewayResponseCode_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b =
+            com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+        gatewayResponseCode_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int AVS_RESPONSE_CODE_FIELD_NUMBER = 3;
+
+    @SuppressWarnings("serial")
+    private volatile java.lang.Object avsResponseCode_ = "";
+    /**
+     *
+     *
+     * <pre>
+     * AVS response code from the gateway
+     * (available only when reCAPTCHA Enterprise is called after authorization).
+     * </pre>
+     *
+     * <code>string avs_response_code = 3;</code>
+     *
+     * @return The avsResponseCode.
+     */
+    @java.lang.Override
+    public java.lang.String getAvsResponseCode() {
+      java.lang.Object ref = avsResponseCode_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        avsResponseCode_ = s;
+        return s;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * AVS response code from the gateway
+     * (available only when reCAPTCHA Enterprise is called after authorization).
+     * </pre>
+     *
+     * <code>string avs_response_code = 3;</code>
+     *
+     * @return The bytes for avsResponseCode.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString getAvsResponseCodeBytes() {
+      java.lang.Object ref = avsResponseCode_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b =
+            com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+        avsResponseCode_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int CVV_RESPONSE_CODE_FIELD_NUMBER = 4;
+
+    @SuppressWarnings("serial")
+    private volatile java.lang.Object cvvResponseCode_ = "";
+    /**
+     *
+     *
+     * <pre>
+     * CVV response code from the gateway
+     * (available only when reCAPTCHA Enterprise is called after authorization).
+     * </pre>
+     *
+     * <code>string cvv_response_code = 4;</code>
+     *
+     * @return The cvvResponseCode.
+     */
+    @java.lang.Override
+    public java.lang.String getCvvResponseCode() {
+      java.lang.Object ref = cvvResponseCode_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        cvvResponseCode_ = s;
+        return s;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * CVV response code from the gateway
+     * (available only when reCAPTCHA Enterprise is called after authorization).
+     * </pre>
+     *
+     * <code>string cvv_response_code = 4;</code>
+     *
+     * @return The bytes for cvvResponseCode.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString getCvvResponseCodeBytes() {
+      java.lang.Object ref = cvvResponseCode_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b =
+            com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+        cvvResponseCode_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    private byte memoizedIsInitialized = -1;
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_);
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(gatewayResponseCode_)) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, gatewayResponseCode_);
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(avsResponseCode_)) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 3, avsResponseCode_);
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(cvvResponseCode_)) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 4, cvvResponseCode_);
+      }
+      getUnknownFields().writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_);
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(gatewayResponseCode_)) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, gatewayResponseCode_);
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(avsResponseCode_)) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, avsResponseCode_);
+      }
+      if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(cvvResponseCode_)) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, cvvResponseCode_);
+      }
+      size += getUnknownFields().getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+        return true;
+      }
+      if (!(obj instanceof com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo)) {
+        return super.equals(obj);
+      }
+      com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo other =
+          (com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo) obj;
+
+      if (!getName().equals(other.getName())) return false;
+      if (!getGatewayResponseCode().equals(other.getGatewayResponseCode())) return false;
+      if (!getAvsResponseCode().equals(other.getAvsResponseCode())) return false;
+      if (!getCvvResponseCode().equals(other.getCvvResponseCode())) return false;
+      if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + NAME_FIELD_NUMBER;
+      hash = (53 * hash) + getName().hashCode();
+      hash = (37 * hash) + GATEWAY_RESPONSE_CODE_FIELD_NUMBER;
+      hash = (53 * hash) + getGatewayResponseCode().hashCode();
+      hash = (37 * hash) + AVS_RESPONSE_CODE_FIELD_NUMBER;
+      hash = (53 * hash) + getAvsResponseCode().hashCode();
+      hash = (37 * hash) + CVV_RESPONSE_CODE_FIELD_NUMBER;
+      hash = (53 * hash) + getCvvResponseCode().hashCode();
+      hash = (29 * hash) + getUnknownFields().hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo parseFrom(
+        java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo parseFrom(
+        java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo parseFrom(
+        byte[] data) throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo parseFrom(
+        byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo parseFrom(
+        java.io.InputStream input) throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo parseFrom(
+        java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseWithIOException(
+          PARSER, input, extensionRegistry);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo
+        parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo
+        parseDelimitedFrom(
+            java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(
+          PARSER, input, extensionRegistry);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo parseFrom(
+        com.google.protobuf.CodedInputStream input) throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3.parseWithIOException(
+          PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() {
+      return newBuilder();
+    }
+
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+
+    public static Builder newBuilder(
+        com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Details about the transaction from the gateway.
+     * </pre>
+     *
+     * Protobuf type {@code google.cloud.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo}
+     */
+    public static final class Builder
+        extends com.google.protobuf.GeneratedMessageV3.Builder<Builder>
+        implements
+        // @@protoc_insertion_point(builder_implements:google.cloud.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo)
+        com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfoOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+        return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+            .internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_GatewayInfo_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+            .internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_GatewayInfo_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo.class,
+                com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo.Builder.class);
+      }
+
+      // Construct using
+      // com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo.newBuilder()
+      private Builder() {}
+
+      private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+      }
+
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        bitField0_ = 0;
+        name_ = "";
+        gatewayResponseCode_ = "";
+        avsResponseCode_ = "";
+        cvvResponseCode_ = "";
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+        return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+            .internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_GatewayInfo_descriptor;
+      }
+
+      @java.lang.Override
+      public com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo
+          getDefaultInstanceForType() {
+        return com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo
+            .getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo build() {
+        com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo buildPartial() {
+        com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo result =
+            new com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo(this);
+        if (bitField0_ != 0) {
+          buildPartial0(result);
+        }
+        onBuilt();
+        return result;
+      }
+
+      private void buildPartial0(
+          com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo result) {
+        int from_bitField0_ = bitField0_;
+        if (((from_bitField0_ & 0x00000001) != 0)) {
+          result.name_ = name_;
+        }
+        if (((from_bitField0_ & 0x00000002) != 0)) {
+          result.gatewayResponseCode_ = gatewayResponseCode_;
+        }
+        if (((from_bitField0_ & 0x00000004) != 0)) {
+          result.avsResponseCode_ = avsResponseCode_;
+        }
+        if (((from_bitField0_ & 0x00000008) != 0)) {
+          result.cvvResponseCode_ = cvvResponseCode_;
+        }
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+        return super.setField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+
+      @java.lang.Override
+      public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index,
+          java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo) {
+          return mergeFrom(
+              (com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo) other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(
+          com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo other) {
+        if (other
+            == com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo
+                .getDefaultInstance()) return this;
+        if (!other.getName().isEmpty()) {
+          name_ = other.name_;
+          bitField0_ |= 0x00000001;
+          onChanged();
+        }
+        if (!other.getGatewayResponseCode().isEmpty()) {
+          gatewayResponseCode_ = other.gatewayResponseCode_;
+          bitField0_ |= 0x00000002;
+          onChanged();
+        }
+        if (!other.getAvsResponseCode().isEmpty()) {
+          avsResponseCode_ = other.avsResponseCode_;
+          bitField0_ |= 0x00000004;
+          onChanged();
+        }
+        if (!other.getCvvResponseCode().isEmpty()) {
+          cvvResponseCode_ = other.cvvResponseCode_;
+          bitField0_ |= 0x00000008;
+          onChanged();
+        }
+        this.mergeUnknownFields(other.getUnknownFields());
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        if (extensionRegistry == null) {
+          throw new java.lang.NullPointerException();
+        }
+        try {
+          boolean done = false;
+          while (!done) {
+            int tag = input.readTag();
+            switch (tag) {
+              case 0:
+                done = true;
+                break;
+              case 10:
+                {
+                  name_ = input.readStringRequireUtf8();
+                  bitField0_ |= 0x00000001;
+                  break;
+                } // case 10
+              case 18:
+                {
+                  gatewayResponseCode_ = input.readStringRequireUtf8();
+                  bitField0_ |= 0x00000002;
+                  break;
+                } // case 18
+              case 26:
+                {
+                  avsResponseCode_ = input.readStringRequireUtf8();
+                  bitField0_ |= 0x00000004;
+                  break;
+                } // case 26
+              case 34:
+                {
+                  cvvResponseCode_ = input.readStringRequireUtf8();
+                  bitField0_ |= 0x00000008;
+                  break;
+                } // case 34
+              default:
+                {
+                  if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                    done = true; // was an endgroup tag
+                  }
+                  break;
+                } // default:
+            } // switch (tag)
+          } // while (!done)
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          throw e.unwrapIOException();
+        } finally {
+          onChanged();
+        } // finally
+        return this;
+      }
+
+      private int bitField0_;
+
+      private java.lang.Object name_ = "";
+      /**
+       *
+       *
+       * <pre>
+       * Name of the gateway service (for example, stripe, square, paypal).
+       * </pre>
+       *
+       * <code>string name = 1;</code>
+       *
+       * @return The name.
+       */
+      public java.lang.String getName() {
+        java.lang.Object ref = name_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          name_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       *
+       *
+       * <pre>
+       * Name of the gateway service (for example, stripe, square, paypal).
+       * </pre>
+       *
+       * <code>string name = 1;</code>
+       *
+       * @return The bytes for name.
+       */
+      public com.google.protobuf.ByteString getNameBytes() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b =
+              com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+          name_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       *
+       *
+       * <pre>
+       * Name of the gateway service (for example, stripe, square, paypal).
+       * </pre>
+       *
+       * <code>string name = 1;</code>
+       *
+       * @param value The name to set.
+       * @return This builder for chaining.
+       */
+      public Builder setName(java.lang.String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        name_ = value;
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * Name of the gateway service (for example, stripe, square, paypal).
+       * </pre>
+       *
+       * <code>string name = 1;</code>
+       *
+       * @return This builder for chaining.
+       */
+      public Builder clearName() {
+        name_ = getDefaultInstance().getName();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * Name of the gateway service (for example, stripe, square, paypal).
+       * </pre>
+       *
+       * <code>string name = 1;</code>
+       *
+       * @param value The bytes for name to set.
+       * @return This builder for chaining.
+       */
+      public Builder setNameBytes(com.google.protobuf.ByteString value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        checkByteStringIsUtf8(value);
+        name_ = value;
+        bitField0_ |= 0x00000001;
+        onChanged();
+        return this;
+      }
+
+      private java.lang.Object gatewayResponseCode_ = "";
+      /**
+       *
+       *
+       * <pre>
+       * Gateway response code describing the state of the transaction.
+       * </pre>
+       *
+       * <code>string gateway_response_code = 2;</code>
+       *
+       * @return The gatewayResponseCode.
+       */
+      public java.lang.String getGatewayResponseCode() {
+        java.lang.Object ref = gatewayResponseCode_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          gatewayResponseCode_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       *
+       *
+       * <pre>
+       * Gateway response code describing the state of the transaction.
+       * </pre>
+       *
+       * <code>string gateway_response_code = 2;</code>
+       *
+       * @return The bytes for gatewayResponseCode.
+       */
+      public com.google.protobuf.ByteString getGatewayResponseCodeBytes() {
+        java.lang.Object ref = gatewayResponseCode_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b =
+              com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+          gatewayResponseCode_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       *
+       *
+       * <pre>
+       * Gateway response code describing the state of the transaction.
+       * </pre>
+       *
+       * <code>string gateway_response_code = 2;</code>
+       *
+       * @param value The gatewayResponseCode to set.
+       * @return This builder for chaining.
+       */
+      public Builder setGatewayResponseCode(java.lang.String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        gatewayResponseCode_ = value;
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * Gateway response code describing the state of the transaction.
+       * </pre>
+       *
+       * <code>string gateway_response_code = 2;</code>
+       *
+       * @return This builder for chaining.
+       */
+      public Builder clearGatewayResponseCode() {
+        gatewayResponseCode_ = getDefaultInstance().getGatewayResponseCode();
+        bitField0_ = (bitField0_ & ~0x00000002);
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * Gateway response code describing the state of the transaction.
+       * </pre>
+       *
+       * <code>string gateway_response_code = 2;</code>
+       *
+       * @param value The bytes for gatewayResponseCode to set.
+       * @return This builder for chaining.
+       */
+      public Builder setGatewayResponseCodeBytes(com.google.protobuf.ByteString value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        checkByteStringIsUtf8(value);
+        gatewayResponseCode_ = value;
+        bitField0_ |= 0x00000002;
+        onChanged();
+        return this;
+      }
+
+      private java.lang.Object avsResponseCode_ = "";
+      /**
+       *
+       *
+       * <pre>
+       * AVS response code from the gateway
+       * (available only when reCAPTCHA Enterprise is called after authorization).
+       * </pre>
+       *
+       * <code>string avs_response_code = 3;</code>
+       *
+       * @return The avsResponseCode.
+       */
+      public java.lang.String getAvsResponseCode() {
+        java.lang.Object ref = avsResponseCode_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          avsResponseCode_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       *
+       *
+       * <pre>
+       * AVS response code from the gateway
+       * (available only when reCAPTCHA Enterprise is called after authorization).
+       * </pre>
+       *
+       * <code>string avs_response_code = 3;</code>
+       *
+       * @return The bytes for avsResponseCode.
+       */
+      public com.google.protobuf.ByteString getAvsResponseCodeBytes() {
+        java.lang.Object ref = avsResponseCode_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b =
+              com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+          avsResponseCode_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       *
+       *
+       * <pre>
+       * AVS response code from the gateway
+       * (available only when reCAPTCHA Enterprise is called after authorization).
+       * </pre>
+       *
+       * <code>string avs_response_code = 3;</code>
+       *
+       * @param value The avsResponseCode to set.
+       * @return This builder for chaining.
+       */
+      public Builder setAvsResponseCode(java.lang.String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        avsResponseCode_ = value;
+        bitField0_ |= 0x00000004;
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * AVS response code from the gateway
+       * (available only when reCAPTCHA Enterprise is called after authorization).
+       * </pre>
+       *
+       * <code>string avs_response_code = 3;</code>
+       *
+       * @return This builder for chaining.
+       */
+      public Builder clearAvsResponseCode() {
+        avsResponseCode_ = getDefaultInstance().getAvsResponseCode();
+        bitField0_ = (bitField0_ & ~0x00000004);
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * AVS response code from the gateway
+       * (available only when reCAPTCHA Enterprise is called after authorization).
+       * </pre>
+       *
+       * <code>string avs_response_code = 3;</code>
+       *
+       * @param value The bytes for avsResponseCode to set.
+       * @return This builder for chaining.
+       */
+      public Builder setAvsResponseCodeBytes(com.google.protobuf.ByteString value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        checkByteStringIsUtf8(value);
+        avsResponseCode_ = value;
+        bitField0_ |= 0x00000004;
+        onChanged();
+        return this;
+      }
+
+      private java.lang.Object cvvResponseCode_ = "";
+      /**
+       *
+       *
+       * <pre>
+       * CVV response code from the gateway
+       * (available only when reCAPTCHA Enterprise is called after authorization).
+       * </pre>
+       *
+       * <code>string cvv_response_code = 4;</code>
+       *
+       * @return The cvvResponseCode.
+       */
+      public java.lang.String getCvvResponseCode() {
+        java.lang.Object ref = cvvResponseCode_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          cvvResponseCode_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       *
+       *
+       * <pre>
+       * CVV response code from the gateway
+       * (available only when reCAPTCHA Enterprise is called after authorization).
+       * </pre>
+       *
+       * <code>string cvv_response_code = 4;</code>
+       *
+       * @return The bytes for cvvResponseCode.
+       */
+      public com.google.protobuf.ByteString getCvvResponseCodeBytes() {
+        java.lang.Object ref = cvvResponseCode_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b =
+              com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+          cvvResponseCode_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       *
+       *
+       * <pre>
+       * CVV response code from the gateway
+       * (available only when reCAPTCHA Enterprise is called after authorization).
+       * </pre>
+       *
+       * <code>string cvv_response_code = 4;</code>
+       *
+       * @param value The cvvResponseCode to set.
+       * @return This builder for chaining.
+       */
+      public Builder setCvvResponseCode(java.lang.String value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        cvvResponseCode_ = value;
+        bitField0_ |= 0x00000008;
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * CVV response code from the gateway
+       * (available only when reCAPTCHA Enterprise is called after authorization).
+       * </pre>
+       *
+       * <code>string cvv_response_code = 4;</code>
+       *
+       * @return This builder for chaining.
+       */
+      public Builder clearCvvResponseCode() {
+        cvvResponseCode_ = getDefaultInstance().getCvvResponseCode();
+        bitField0_ = (bitField0_ & ~0x00000008);
+        onChanged();
+        return this;
+      }
+      /**
+       *
+       *
+       * <pre>
+       * CVV response code from the gateway
+       * (available only when reCAPTCHA Enterprise is called after authorization).
+       * </pre>
+       *
+       * <code>string cvv_response_code = 4;</code>
+       *
+       * @param value The bytes for cvvResponseCode to set.
+       * @return This builder for chaining.
+       */
+      public Builder setCvvResponseCodeBytes(com.google.protobuf.ByteString value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        checkByteStringIsUtf8(value);
+        cvvResponseCode_ = value;
+        bitField0_ |= 0x00000008;
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+      // @@protoc_insertion_point(builder_scope:google.cloud.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo)
+    }
+
+    // @@protoc_insertion_point(class_scope:google.cloud.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo)
+    private static final com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo
+        DEFAULT_INSTANCE;
+
+    static {
+      DEFAULT_INSTANCE = new com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo();
+    }
+
+    public static com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo
+        getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<GatewayInfo> PARSER =
+        new com.google.protobuf.AbstractParser<GatewayInfo>() {
+          @java.lang.Override
+          public GatewayInfo parsePartialFrom(
+              com.google.protobuf.CodedInputStream input,
+              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+              throws com.google.protobuf.InvalidProtocolBufferException {
+            Builder builder = newBuilder();
+            try {
+              builder.mergeFrom(input, extensionRegistry);
+            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+              throw e.setUnfinishedMessage(builder.buildPartial());
+            } catch (com.google.protobuf.UninitializedMessageException e) {
+              throw e.asInvalidProtocolBufferException()
+                  .setUnfinishedMessage(builder.buildPartial());
+            } catch (java.io.IOException e) {
+              throw new com.google.protobuf.InvalidProtocolBufferException(e)
+                  .setUnfinishedMessage(builder.buildPartial());
+            }
+            return builder.buildPartial();
+          }
+        };
+
+    public static com.google.protobuf.Parser<GatewayInfo> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<GatewayInfo> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo
+        getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+  }
+
+  private int bitField0_;
+  public static final int TRANSACTION_ID_FIELD_NUMBER = 11;
+
+  @SuppressWarnings("serial")
+  private volatile java.lang.Object transactionId_ = "";
+  /**
+   *
+   *
+   * <pre>
+   * Unique identifier for the transaction. This custom identifier can be used
+   * to reference this transaction in the future, for example, labeling a refund
+   * or chargeback event. Two attempts at the same transaction should use the
+   * same transaction id.
+   * </pre>
+   *
+   * <code>optional string transaction_id = 11;</code>
+   *
+   * @return Whether the transactionId field is set.
+   */
+  @java.lang.Override
+  public boolean hasTransactionId() {
+    return ((bitField0_ & 0x00000001) != 0);
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Unique identifier for the transaction. This custom identifier can be used
+   * to reference this transaction in the future, for example, labeling a refund
+   * or chargeback event. Two attempts at the same transaction should use the
+   * same transaction id.
+   * </pre>
+   *
+   * <code>optional string transaction_id = 11;</code>
+   *
+   * @return The transactionId.
+   */
+  @java.lang.Override
+  public java.lang.String getTransactionId() {
+    java.lang.Object ref = transactionId_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      transactionId_ = s;
+      return s;
+    }
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Unique identifier for the transaction. This custom identifier can be used
+   * to reference this transaction in the future, for example, labeling a refund
+   * or chargeback event. Two attempts at the same transaction should use the
+   * same transaction id.
+   * </pre>
+   *
+   * <code>optional string transaction_id = 11;</code>
+   *
+   * @return The bytes for transactionId.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString getTransactionIdBytes() {
+    java.lang.Object ref = transactionId_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b =
+          com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+      transactionId_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int PAYMENT_METHOD_FIELD_NUMBER = 1;
+
+  @SuppressWarnings("serial")
+  private volatile java.lang.Object paymentMethod_ = "";
+  /**
+   *
+   *
+   * <pre>
+   * The payment method for the transaction. The allowed values are:
+   * * credit-card
+   * * debit-card
+   * * gift-card
+   * * processor-{name} (If a third-party is used, for example,
+   * processor-paypal)
+   * * custom-{name} (If an alternative method is used, for example,
+   * custom-crypto)
+   * </pre>
+   *
+   * <code>string payment_method = 1;</code>
+   *
+   * @return The paymentMethod.
+   */
+  @java.lang.Override
+  public java.lang.String getPaymentMethod() {
+    java.lang.Object ref = paymentMethod_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      paymentMethod_ = s;
+      return s;
+    }
+  }
+  /**
+   *
+   *
+   * <pre>
+   * The payment method for the transaction. The allowed values are:
+   * * credit-card
+   * * debit-card
+   * * gift-card
+   * * processor-{name} (If a third-party is used, for example,
+   * processor-paypal)
+   * * custom-{name} (If an alternative method is used, for example,
+   * custom-crypto)
+   * </pre>
+   *
+   * <code>string payment_method = 1;</code>
+   *
+   * @return The bytes for paymentMethod.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString getPaymentMethodBytes() {
+    java.lang.Object ref = paymentMethod_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b =
+          com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+      paymentMethod_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int CARD_BIN_FIELD_NUMBER = 2;
+
+  @SuppressWarnings("serial")
+  private volatile java.lang.Object cardBin_ = "";
+  /**
+   *
+   *
+   * <pre>
+   * The Bank Identification Number - generally the first 6 or 8 digits of the
+   * card.
+   * </pre>
+   *
+   * <code>string card_bin = 2;</code>
+   *
+   * @return The cardBin.
+   */
+  @java.lang.Override
+  public java.lang.String getCardBin() {
+    java.lang.Object ref = cardBin_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      cardBin_ = s;
+      return s;
+    }
+  }
+  /**
+   *
+   *
+   * <pre>
+   * The Bank Identification Number - generally the first 6 or 8 digits of the
+   * card.
+   * </pre>
+   *
+   * <code>string card_bin = 2;</code>
+   *
+   * @return The bytes for cardBin.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString getCardBinBytes() {
+    java.lang.Object ref = cardBin_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b =
+          com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+      cardBin_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int CARD_LAST_FOUR_FIELD_NUMBER = 3;
+
+  @SuppressWarnings("serial")
+  private volatile java.lang.Object cardLastFour_ = "";
+  /**
+   *
+   *
+   * <pre>
+   * The last four digits of the card.
+   * </pre>
+   *
+   * <code>string card_last_four = 3;</code>
+   *
+   * @return The cardLastFour.
+   */
+  @java.lang.Override
+  public java.lang.String getCardLastFour() {
+    java.lang.Object ref = cardLastFour_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      cardLastFour_ = s;
+      return s;
+    }
+  }
+  /**
+   *
+   *
+   * <pre>
+   * The last four digits of the card.
+   * </pre>
+   *
+   * <code>string card_last_four = 3;</code>
+   *
+   * @return The bytes for cardLastFour.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString getCardLastFourBytes() {
+    java.lang.Object ref = cardLastFour_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b =
+          com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+      cardLastFour_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int CURRENCY_CODE_FIELD_NUMBER = 4;
+
+  @SuppressWarnings("serial")
+  private volatile java.lang.Object currencyCode_ = "";
+  /**
+   *
+   *
+   * <pre>
+   * The currency code in ISO-4217 format.
+   * </pre>
+   *
+   * <code>string currency_code = 4;</code>
+   *
+   * @return The currencyCode.
+   */
+  @java.lang.Override
+  public java.lang.String getCurrencyCode() {
+    java.lang.Object ref = currencyCode_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      currencyCode_ = s;
+      return s;
+    }
+  }
+  /**
+   *
+   *
+   * <pre>
+   * The currency code in ISO-4217 format.
+   * </pre>
+   *
+   * <code>string currency_code = 4;</code>
+   *
+   * @return The bytes for currencyCode.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString getCurrencyCodeBytes() {
+    java.lang.Object ref = currencyCode_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b =
+          com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+      currencyCode_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int VALUE_FIELD_NUMBER = 5;
+  private double value_ = 0D;
+  /**
+   *
+   *
+   * <pre>
+   * The decimal value of the transaction in the specified currency.
+   * </pre>
+   *
+   * <code>double value = 5;</code>
+   *
+   * @return The value.
+   */
+  @java.lang.Override
+  public double getValue() {
+    return value_;
+  }
+
+  public static final int SHIPPING_VALUE_FIELD_NUMBER = 12;
+  private double shippingValue_ = 0D;
+  /**
+   *
+   *
+   * <pre>
+   * The value of shipping in the specified currency. 0 for free or no shipping.
+   * </pre>
+   *
+   * <code>double shipping_value = 12;</code>
+   *
+   * @return The shippingValue.
+   */
+  @java.lang.Override
+  public double getShippingValue() {
+    return shippingValue_;
+  }
+
+  public static final int SHIPPING_ADDRESS_FIELD_NUMBER = 6;
+  private com.google.recaptchaenterprise.v1beta1.TransactionData.Address shippingAddress_;
+  /**
+   *
+   *
+   * <pre>
+   * Destination address if this transaction involves shipping a physical item.
+   * </pre>
+   *
+   * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address shipping_address = 6;
+   * </code>
+   *
+   * @return Whether the shippingAddress field is set.
+   */
+  @java.lang.Override
+  public boolean hasShippingAddress() {
+    return shippingAddress_ != null;
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Destination address if this transaction involves shipping a physical item.
+   * </pre>
+   *
+   * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address shipping_address = 6;
+   * </code>
+   *
+   * @return The shippingAddress.
+   */
+  @java.lang.Override
+  public com.google.recaptchaenterprise.v1beta1.TransactionData.Address getShippingAddress() {
+    return shippingAddress_ == null
+        ? com.google.recaptchaenterprise.v1beta1.TransactionData.Address.getDefaultInstance()
+        : shippingAddress_;
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Destination address if this transaction involves shipping a physical item.
+   * </pre>
+   *
+   * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address shipping_address = 6;
+   * </code>
+   */
+  @java.lang.Override
+  public com.google.recaptchaenterprise.v1beta1.TransactionData.AddressOrBuilder
+      getShippingAddressOrBuilder() {
+    return shippingAddress_ == null
+        ? com.google.recaptchaenterprise.v1beta1.TransactionData.Address.getDefaultInstance()
+        : shippingAddress_;
+  }
+
+  public static final int BILLING_ADDRESS_FIELD_NUMBER = 7;
+  private com.google.recaptchaenterprise.v1beta1.TransactionData.Address billingAddress_;
+  /**
+   *
+   *
+   * <pre>
+   * Address associated with the payment method when applicable.
+   * </pre>
+   *
+   * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address billing_address = 7;
+   * </code>
+   *
+   * @return Whether the billingAddress field is set.
+   */
+  @java.lang.Override
+  public boolean hasBillingAddress() {
+    return billingAddress_ != null;
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Address associated with the payment method when applicable.
+   * </pre>
+   *
+   * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address billing_address = 7;
+   * </code>
+   *
+   * @return The billingAddress.
+   */
+  @java.lang.Override
+  public com.google.recaptchaenterprise.v1beta1.TransactionData.Address getBillingAddress() {
+    return billingAddress_ == null
+        ? com.google.recaptchaenterprise.v1beta1.TransactionData.Address.getDefaultInstance()
+        : billingAddress_;
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Address associated with the payment method when applicable.
+   * </pre>
+   *
+   * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address billing_address = 7;
+   * </code>
+   */
+  @java.lang.Override
+  public com.google.recaptchaenterprise.v1beta1.TransactionData.AddressOrBuilder
+      getBillingAddressOrBuilder() {
+    return billingAddress_ == null
+        ? com.google.recaptchaenterprise.v1beta1.TransactionData.Address.getDefaultInstance()
+        : billingAddress_;
+  }
+
+  public static final int USER_FIELD_NUMBER = 8;
+  private com.google.recaptchaenterprise.v1beta1.TransactionData.User user_;
+  /**
+   *
+   *
+   * <pre>
+   * Information about the user paying/initiating the transaction.
+   * </pre>
+   *
+   * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.User user = 8;</code>
+   *
+   * @return Whether the user field is set.
+   */
+  @java.lang.Override
+  public boolean hasUser() {
+    return user_ != null;
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Information about the user paying/initiating the transaction.
+   * </pre>
+   *
+   * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.User user = 8;</code>
+   *
+   * @return The user.
+   */
+  @java.lang.Override
+  public com.google.recaptchaenterprise.v1beta1.TransactionData.User getUser() {
+    return user_ == null
+        ? com.google.recaptchaenterprise.v1beta1.TransactionData.User.getDefaultInstance()
+        : user_;
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Information about the user paying/initiating the transaction.
+   * </pre>
+   *
+   * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.User user = 8;</code>
+   */
+  @java.lang.Override
+  public com.google.recaptchaenterprise.v1beta1.TransactionData.UserOrBuilder getUserOrBuilder() {
+    return user_ == null
+        ? com.google.recaptchaenterprise.v1beta1.TransactionData.User.getDefaultInstance()
+        : user_;
+  }
+
+  public static final int MERCHANTS_FIELD_NUMBER = 13;
+
+  @SuppressWarnings("serial")
+  private java.util.List<com.google.recaptchaenterprise.v1beta1.TransactionData.User> merchants_;
+  /**
+   *
+   *
+   * <pre>
+   * Information about the user or users fulfilling the transaction.
+   * </pre>
+   *
+   * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.User merchants = 13;
+   * </code>
+   */
+  @java.lang.Override
+  public java.util.List<com.google.recaptchaenterprise.v1beta1.TransactionData.User>
+      getMerchantsList() {
+    return merchants_;
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Information about the user or users fulfilling the transaction.
+   * </pre>
+   *
+   * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.User merchants = 13;
+   * </code>
+   */
+  @java.lang.Override
+  public java.util.List<
+          ? extends com.google.recaptchaenterprise.v1beta1.TransactionData.UserOrBuilder>
+      getMerchantsOrBuilderList() {
+    return merchants_;
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Information about the user or users fulfilling the transaction.
+   * </pre>
+   *
+   * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.User merchants = 13;
+   * </code>
+   */
+  @java.lang.Override
+  public int getMerchantsCount() {
+    return merchants_.size();
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Information about the user or users fulfilling the transaction.
+   * </pre>
+   *
+   * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.User merchants = 13;
+   * </code>
+   */
+  @java.lang.Override
+  public com.google.recaptchaenterprise.v1beta1.TransactionData.User getMerchants(int index) {
+    return merchants_.get(index);
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Information about the user or users fulfilling the transaction.
+   * </pre>
+   *
+   * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.User merchants = 13;
+   * </code>
+   */
+  @java.lang.Override
+  public com.google.recaptchaenterprise.v1beta1.TransactionData.UserOrBuilder getMerchantsOrBuilder(
+      int index) {
+    return merchants_.get(index);
+  }
+
+  public static final int ITEMS_FIELD_NUMBER = 14;
+
+  @SuppressWarnings("serial")
+  private java.util.List<com.google.recaptchaenterprise.v1beta1.TransactionData.Item> items_;
+  /**
+   *
+   *
+   * <pre>
+   * Items purchased in this transaction.
+   * </pre>
+   *
+   * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item items = 14;
+   * </code>
+   */
+  @java.lang.Override
+  public java.util.List<com.google.recaptchaenterprise.v1beta1.TransactionData.Item>
+      getItemsList() {
+    return items_;
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Items purchased in this transaction.
+   * </pre>
+   *
+   * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item items = 14;
+   * </code>
+   */
+  @java.lang.Override
+  public java.util.List<
+          ? extends com.google.recaptchaenterprise.v1beta1.TransactionData.ItemOrBuilder>
+      getItemsOrBuilderList() {
+    return items_;
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Items purchased in this transaction.
+   * </pre>
+   *
+   * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item items = 14;
+   * </code>
+   */
+  @java.lang.Override
+  public int getItemsCount() {
+    return items_.size();
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Items purchased in this transaction.
+   * </pre>
+   *
+   * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item items = 14;
+   * </code>
+   */
+  @java.lang.Override
+  public com.google.recaptchaenterprise.v1beta1.TransactionData.Item getItems(int index) {
+    return items_.get(index);
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Items purchased in this transaction.
+   * </pre>
+   *
+   * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item items = 14;
+   * </code>
+   */
+  @java.lang.Override
+  public com.google.recaptchaenterprise.v1beta1.TransactionData.ItemOrBuilder getItemsOrBuilder(
+      int index) {
+    return items_.get(index);
+  }
+
+  public static final int GATEWAY_INFO_FIELD_NUMBER = 10;
+  private com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo gatewayInfo_;
+  /**
+   *
+   *
+   * <pre>
+   * Information about the payment gateway's response to the transaction.
+   * </pre>
+   *
+   * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo gateway_info = 10;
+   * </code>
+   *
+   * @return Whether the gatewayInfo field is set.
+   */
+  @java.lang.Override
+  public boolean hasGatewayInfo() {
+    return gatewayInfo_ != null;
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Information about the payment gateway's response to the transaction.
+   * </pre>
+   *
+   * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo gateway_info = 10;
+   * </code>
+   *
+   * @return The gatewayInfo.
+   */
+  @java.lang.Override
+  public com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo getGatewayInfo() {
+    return gatewayInfo_ == null
+        ? com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo.getDefaultInstance()
+        : gatewayInfo_;
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Information about the payment gateway's response to the transaction.
+   * </pre>
+   *
+   * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo gateway_info = 10;
+   * </code>
+   */
+  @java.lang.Override
+  public com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfoOrBuilder
+      getGatewayInfoOrBuilder() {
+    return gatewayInfo_ == null
+        ? com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo.getDefaultInstance()
+        : gatewayInfo_;
+  }
+
+  private byte memoizedIsInitialized = -1;
+
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(paymentMethod_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 1, paymentMethod_);
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(cardBin_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, cardBin_);
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(cardLastFour_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 3, cardLastFour_);
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(currencyCode_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 4, currencyCode_);
+    }
+    if (java.lang.Double.doubleToRawLongBits(value_) != 0) {
+      output.writeDouble(5, value_);
+    }
+    if (shippingAddress_ != null) {
+      output.writeMessage(6, getShippingAddress());
+    }
+    if (billingAddress_ != null) {
+      output.writeMessage(7, getBillingAddress());
+    }
+    if (user_ != null) {
+      output.writeMessage(8, getUser());
+    }
+    if (gatewayInfo_ != null) {
+      output.writeMessage(10, getGatewayInfo());
+    }
+    if (((bitField0_ & 0x00000001) != 0)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 11, transactionId_);
+    }
+    if (java.lang.Double.doubleToRawLongBits(shippingValue_) != 0) {
+      output.writeDouble(12, shippingValue_);
+    }
+    for (int i = 0; i < merchants_.size(); i++) {
+      output.writeMessage(13, merchants_.get(i));
+    }
+    for (int i = 0; i < items_.size(); i++) {
+      output.writeMessage(14, items_.get(i));
+    }
+    getUnknownFields().writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(paymentMethod_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, paymentMethod_);
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(cardBin_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, cardBin_);
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(cardLastFour_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, cardLastFour_);
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(currencyCode_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, currencyCode_);
+    }
+    if (java.lang.Double.doubleToRawLongBits(value_) != 0) {
+      size += com.google.protobuf.CodedOutputStream.computeDoubleSize(5, value_);
+    }
+    if (shippingAddress_ != null) {
+      size += com.google.protobuf.CodedOutputStream.computeMessageSize(6, getShippingAddress());
+    }
+    if (billingAddress_ != null) {
+      size += com.google.protobuf.CodedOutputStream.computeMessageSize(7, getBillingAddress());
+    }
+    if (user_ != null) {
+      size += com.google.protobuf.CodedOutputStream.computeMessageSize(8, getUser());
+    }
+    if (gatewayInfo_ != null) {
+      size += com.google.protobuf.CodedOutputStream.computeMessageSize(10, getGatewayInfo());
+    }
+    if (((bitField0_ & 0x00000001) != 0)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(11, transactionId_);
+    }
+    if (java.lang.Double.doubleToRawLongBits(shippingValue_) != 0) {
+      size += com.google.protobuf.CodedOutputStream.computeDoubleSize(12, shippingValue_);
+    }
+    for (int i = 0; i < merchants_.size(); i++) {
+      size += com.google.protobuf.CodedOutputStream.computeMessageSize(13, merchants_.get(i));
+    }
+    for (int i = 0; i < items_.size(); i++) {
+      size += com.google.protobuf.CodedOutputStream.computeMessageSize(14, items_.get(i));
+    }
+    size += getUnknownFields().getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+      return true;
+    }
+    if (!(obj instanceof com.google.recaptchaenterprise.v1beta1.TransactionData)) {
+      return super.equals(obj);
+    }
+    com.google.recaptchaenterprise.v1beta1.TransactionData other =
+        (com.google.recaptchaenterprise.v1beta1.TransactionData) obj;
+
+    if (hasTransactionId() != other.hasTransactionId()) return false;
+    if (hasTransactionId()) {
+      if (!getTransactionId().equals(other.getTransactionId())) return false;
+    }
+    if (!getPaymentMethod().equals(other.getPaymentMethod())) return false;
+    if (!getCardBin().equals(other.getCardBin())) return false;
+    if (!getCardLastFour().equals(other.getCardLastFour())) return false;
+    if (!getCurrencyCode().equals(other.getCurrencyCode())) return false;
+    if (java.lang.Double.doubleToLongBits(getValue())
+        != java.lang.Double.doubleToLongBits(other.getValue())) return false;
+    if (java.lang.Double.doubleToLongBits(getShippingValue())
+        != java.lang.Double.doubleToLongBits(other.getShippingValue())) return false;
+    if (hasShippingAddress() != other.hasShippingAddress()) return false;
+    if (hasShippingAddress()) {
+      if (!getShippingAddress().equals(other.getShippingAddress())) return false;
+    }
+    if (hasBillingAddress() != other.hasBillingAddress()) return false;
+    if (hasBillingAddress()) {
+      if (!getBillingAddress().equals(other.getBillingAddress())) return false;
+    }
+    if (hasUser() != other.hasUser()) return false;
+    if (hasUser()) {
+      if (!getUser().equals(other.getUser())) return false;
+    }
+    if (!getMerchantsList().equals(other.getMerchantsList())) return false;
+    if (!getItemsList().equals(other.getItemsList())) return false;
+    if (hasGatewayInfo() != other.hasGatewayInfo()) return false;
+    if (hasGatewayInfo()) {
+      if (!getGatewayInfo().equals(other.getGatewayInfo())) return false;
+    }
+    if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    if (hasTransactionId()) {
+      hash = (37 * hash) + TRANSACTION_ID_FIELD_NUMBER;
+      hash = (53 * hash) + getTransactionId().hashCode();
+    }
+    hash = (37 * hash) + PAYMENT_METHOD_FIELD_NUMBER;
+    hash = (53 * hash) + getPaymentMethod().hashCode();
+    hash = (37 * hash) + CARD_BIN_FIELD_NUMBER;
+    hash = (53 * hash) + getCardBin().hashCode();
+    hash = (37 * hash) + CARD_LAST_FOUR_FIELD_NUMBER;
+    hash = (53 * hash) + getCardLastFour().hashCode();
+    hash = (37 * hash) + CURRENCY_CODE_FIELD_NUMBER;
+    hash = (53 * hash) + getCurrencyCode().hashCode();
+    hash = (37 * hash) + VALUE_FIELD_NUMBER;
+    hash =
+        (53 * hash)
+            + com.google.protobuf.Internal.hashLong(java.lang.Double.doubleToLongBits(getValue()));
+    hash = (37 * hash) + SHIPPING_VALUE_FIELD_NUMBER;
+    hash =
+        (53 * hash)
+            + com.google.protobuf.Internal.hashLong(
+                java.lang.Double.doubleToLongBits(getShippingValue()));
+    if (hasShippingAddress()) {
+      hash = (37 * hash) + SHIPPING_ADDRESS_FIELD_NUMBER;
+      hash = (53 * hash) + getShippingAddress().hashCode();
+    }
+    if (hasBillingAddress()) {
+      hash = (37 * hash) + BILLING_ADDRESS_FIELD_NUMBER;
+      hash = (53 * hash) + getBillingAddress().hashCode();
+    }
+    if (hasUser()) {
+      hash = (37 * hash) + USER_FIELD_NUMBER;
+      hash = (53 * hash) + getUser().hashCode();
+    }
+    if (getMerchantsCount() > 0) {
+      hash = (37 * hash) + MERCHANTS_FIELD_NUMBER;
+      hash = (53 * hash) + getMerchantsList().hashCode();
+    }
+    if (getItemsCount() > 0) {
+      hash = (37 * hash) + ITEMS_FIELD_NUMBER;
+      hash = (53 * hash) + getItemsList().hashCode();
+    }
+    if (hasGatewayInfo()) {
+      hash = (37 * hash) + GATEWAY_INFO_FIELD_NUMBER;
+      hash = (53 * hash) + getGatewayInfo().hashCode();
+    }
+    hash = (29 * hash) + getUnknownFields().hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.TransactionData parseFrom(
+      java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.TransactionData parseFrom(
+      java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.TransactionData parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.TransactionData parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.TransactionData parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.TransactionData parseFrom(
+      byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.TransactionData parseFrom(
+      java.io.InputStream input) throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.TransactionData parseFrom(
+      java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3.parseWithIOException(
+        PARSER, input, extensionRegistry);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.TransactionData parseDelimitedFrom(
+      java.io.InputStream input) throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.TransactionData parseDelimitedFrom(
+      java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(
+        PARSER, input, extensionRegistry);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.TransactionData parseFrom(
+      com.google.protobuf.CodedInputStream input) throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.TransactionData parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3.parseWithIOException(
+        PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() {
+    return newBuilder();
+  }
+
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+
+  public static Builder newBuilder(
+      com.google.recaptchaenterprise.v1beta1.TransactionData prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Transaction data associated with a payment protected by reCAPTCHA Enterprise.
+   * All fields are optional.
+   * </pre>
+   *
+   * Protobuf type {@code google.cloud.recaptchaenterprise.v1beta1.TransactionData}
+   */
+  public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder<Builder>
+      implements
+      // @@protoc_insertion_point(builder_implements:google.cloud.recaptchaenterprise.v1beta1.TransactionData)
+      com.google.recaptchaenterprise.v1beta1.TransactionDataOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+      return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+          .internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+          .internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.google.recaptchaenterprise.v1beta1.TransactionData.class,
+              com.google.recaptchaenterprise.v1beta1.TransactionData.Builder.class);
+    }
+
+    // Construct using com.google.recaptchaenterprise.v1beta1.TransactionData.newBuilder()
+    private Builder() {}
+
+    private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+    }
+
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      bitField0_ = 0;
+      transactionId_ = "";
+      paymentMethod_ = "";
+      cardBin_ = "";
+      cardLastFour_ = "";
+      currencyCode_ = "";
+      value_ = 0D;
+      shippingValue_ = 0D;
+      shippingAddress_ = null;
+      if (shippingAddressBuilder_ != null) {
+        shippingAddressBuilder_.dispose();
+        shippingAddressBuilder_ = null;
+      }
+      billingAddress_ = null;
+      if (billingAddressBuilder_ != null) {
+        billingAddressBuilder_.dispose();
+        billingAddressBuilder_ = null;
+      }
+      user_ = null;
+      if (userBuilder_ != null) {
+        userBuilder_.dispose();
+        userBuilder_ = null;
+      }
+      if (merchantsBuilder_ == null) {
+        merchants_ = java.util.Collections.emptyList();
+      } else {
+        merchants_ = null;
+        merchantsBuilder_.clear();
+      }
+      bitField0_ = (bitField0_ & ~0x00000400);
+      if (itemsBuilder_ == null) {
+        items_ = java.util.Collections.emptyList();
+      } else {
+        items_ = null;
+        itemsBuilder_.clear();
+      }
+      bitField0_ = (bitField0_ & ~0x00000800);
+      gatewayInfo_ = null;
+      if (gatewayInfoBuilder_ != null) {
+        gatewayInfoBuilder_.dispose();
+        gatewayInfoBuilder_ = null;
+      }
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+      return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+          .internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionData_descriptor;
+    }
+
+    @java.lang.Override
+    public com.google.recaptchaenterprise.v1beta1.TransactionData getDefaultInstanceForType() {
+      return com.google.recaptchaenterprise.v1beta1.TransactionData.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.google.recaptchaenterprise.v1beta1.TransactionData build() {
+      com.google.recaptchaenterprise.v1beta1.TransactionData result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.google.recaptchaenterprise.v1beta1.TransactionData buildPartial() {
+      com.google.recaptchaenterprise.v1beta1.TransactionData result =
+          new com.google.recaptchaenterprise.v1beta1.TransactionData(this);
+      buildPartialRepeatedFields(result);
+      if (bitField0_ != 0) {
+        buildPartial0(result);
+      }
+      onBuilt();
+      return result;
+    }
+
+    private void buildPartialRepeatedFields(
+        com.google.recaptchaenterprise.v1beta1.TransactionData result) {
+      if (merchantsBuilder_ == null) {
+        if (((bitField0_ & 0x00000400) != 0)) {
+          merchants_ = java.util.Collections.unmodifiableList(merchants_);
+          bitField0_ = (bitField0_ & ~0x00000400);
+        }
+        result.merchants_ = merchants_;
+      } else {
+        result.merchants_ = merchantsBuilder_.build();
+      }
+      if (itemsBuilder_ == null) {
+        if (((bitField0_ & 0x00000800) != 0)) {
+          items_ = java.util.Collections.unmodifiableList(items_);
+          bitField0_ = (bitField0_ & ~0x00000800);
+        }
+        result.items_ = items_;
+      } else {
+        result.items_ = itemsBuilder_.build();
+      }
+    }
+
+    private void buildPartial0(com.google.recaptchaenterprise.v1beta1.TransactionData result) {
+      int from_bitField0_ = bitField0_;
+      int to_bitField0_ = 0;
+      if (((from_bitField0_ & 0x00000001) != 0)) {
+        result.transactionId_ = transactionId_;
+        to_bitField0_ |= 0x00000001;
+      }
+      if (((from_bitField0_ & 0x00000002) != 0)) {
+        result.paymentMethod_ = paymentMethod_;
+      }
+      if (((from_bitField0_ & 0x00000004) != 0)) {
+        result.cardBin_ = cardBin_;
+      }
+      if (((from_bitField0_ & 0x00000008) != 0)) {
+        result.cardLastFour_ = cardLastFour_;
+      }
+      if (((from_bitField0_ & 0x00000010) != 0)) {
+        result.currencyCode_ = currencyCode_;
+      }
+      if (((from_bitField0_ & 0x00000020) != 0)) {
+        result.value_ = value_;
+      }
+      if (((from_bitField0_ & 0x00000040) != 0)) {
+        result.shippingValue_ = shippingValue_;
+      }
+      if (((from_bitField0_ & 0x00000080) != 0)) {
+        result.shippingAddress_ =
+            shippingAddressBuilder_ == null ? shippingAddress_ : shippingAddressBuilder_.build();
+      }
+      if (((from_bitField0_ & 0x00000100) != 0)) {
+        result.billingAddress_ =
+            billingAddressBuilder_ == null ? billingAddress_ : billingAddressBuilder_.build();
+      }
+      if (((from_bitField0_ & 0x00000200) != 0)) {
+        result.user_ = userBuilder_ == null ? user_ : userBuilder_.build();
+      }
+      if (((from_bitField0_ & 0x00001000) != 0)) {
+        result.gatewayInfo_ =
+            gatewayInfoBuilder_ == null ? gatewayInfo_ : gatewayInfoBuilder_.build();
+      }
+      result.bitField0_ |= to_bitField0_;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+      return super.setField(field, value);
+    }
+
+    @java.lang.Override
+    public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+
+    @java.lang.Override
+    public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.google.recaptchaenterprise.v1beta1.TransactionData) {
+        return mergeFrom((com.google.recaptchaenterprise.v1beta1.TransactionData) other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.google.recaptchaenterprise.v1beta1.TransactionData other) {
+      if (other == com.google.recaptchaenterprise.v1beta1.TransactionData.getDefaultInstance())
+        return this;
+      if (other.hasTransactionId()) {
+        transactionId_ = other.transactionId_;
+        bitField0_ |= 0x00000001;
+        onChanged();
+      }
+      if (!other.getPaymentMethod().isEmpty()) {
+        paymentMethod_ = other.paymentMethod_;
+        bitField0_ |= 0x00000002;
+        onChanged();
+      }
+      if (!other.getCardBin().isEmpty()) {
+        cardBin_ = other.cardBin_;
+        bitField0_ |= 0x00000004;
+        onChanged();
+      }
+      if (!other.getCardLastFour().isEmpty()) {
+        cardLastFour_ = other.cardLastFour_;
+        bitField0_ |= 0x00000008;
+        onChanged();
+      }
+      if (!other.getCurrencyCode().isEmpty()) {
+        currencyCode_ = other.currencyCode_;
+        bitField0_ |= 0x00000010;
+        onChanged();
+      }
+      if (other.getValue() != 0D) {
+        setValue(other.getValue());
+      }
+      if (other.getShippingValue() != 0D) {
+        setShippingValue(other.getShippingValue());
+      }
+      if (other.hasShippingAddress()) {
+        mergeShippingAddress(other.getShippingAddress());
+      }
+      if (other.hasBillingAddress()) {
+        mergeBillingAddress(other.getBillingAddress());
+      }
+      if (other.hasUser()) {
+        mergeUser(other.getUser());
+      }
+      if (merchantsBuilder_ == null) {
+        if (!other.merchants_.isEmpty()) {
+          if (merchants_.isEmpty()) {
+            merchants_ = other.merchants_;
+            bitField0_ = (bitField0_ & ~0x00000400);
+          } else {
+            ensureMerchantsIsMutable();
+            merchants_.addAll(other.merchants_);
+          }
+          onChanged();
+        }
+      } else {
+        if (!other.merchants_.isEmpty()) {
+          if (merchantsBuilder_.isEmpty()) {
+            merchantsBuilder_.dispose();
+            merchantsBuilder_ = null;
+            merchants_ = other.merchants_;
+            bitField0_ = (bitField0_ & ~0x00000400);
+            merchantsBuilder_ =
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders
+                    ? getMerchantsFieldBuilder()
+                    : null;
+          } else {
+            merchantsBuilder_.addAllMessages(other.merchants_);
+          }
+        }
+      }
+      if (itemsBuilder_ == null) {
+        if (!other.items_.isEmpty()) {
+          if (items_.isEmpty()) {
+            items_ = other.items_;
+            bitField0_ = (bitField0_ & ~0x00000800);
+          } else {
+            ensureItemsIsMutable();
+            items_.addAll(other.items_);
+          }
+          onChanged();
+        }
+      } else {
+        if (!other.items_.isEmpty()) {
+          if (itemsBuilder_.isEmpty()) {
+            itemsBuilder_.dispose();
+            itemsBuilder_ = null;
+            items_ = other.items_;
+            bitField0_ = (bitField0_ & ~0x00000800);
+            itemsBuilder_ =
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders
+                    ? getItemsFieldBuilder()
+                    : null;
+          } else {
+            itemsBuilder_.addAllMessages(other.items_);
+          }
+        }
+      }
+      if (other.hasGatewayInfo()) {
+        mergeGatewayInfo(other.getGatewayInfo());
+      }
+      this.mergeUnknownFields(other.getUnknownFields());
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
+      }
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 10:
+              {
+                paymentMethod_ = input.readStringRequireUtf8();
+                bitField0_ |= 0x00000002;
+                break;
+              } // case 10
+            case 18:
+              {
+                cardBin_ = input.readStringRequireUtf8();
+                bitField0_ |= 0x00000004;
+                break;
+              } // case 18
+            case 26:
+              {
+                cardLastFour_ = input.readStringRequireUtf8();
+                bitField0_ |= 0x00000008;
+                break;
+              } // case 26
+            case 34:
+              {
+                currencyCode_ = input.readStringRequireUtf8();
+                bitField0_ |= 0x00000010;
+                break;
+              } // case 34
+            case 41:
+              {
+                value_ = input.readDouble();
+                bitField0_ |= 0x00000020;
+                break;
+              } // case 41
+            case 50:
+              {
+                input.readMessage(getShippingAddressFieldBuilder().getBuilder(), extensionRegistry);
+                bitField0_ |= 0x00000080;
+                break;
+              } // case 50
+            case 58:
+              {
+                input.readMessage(getBillingAddressFieldBuilder().getBuilder(), extensionRegistry);
+                bitField0_ |= 0x00000100;
+                break;
+              } // case 58
+            case 66:
+              {
+                input.readMessage(getUserFieldBuilder().getBuilder(), extensionRegistry);
+                bitField0_ |= 0x00000200;
+                break;
+              } // case 66
+            case 82:
+              {
+                input.readMessage(getGatewayInfoFieldBuilder().getBuilder(), extensionRegistry);
+                bitField0_ |= 0x00001000;
+                break;
+              } // case 82
+            case 90:
+              {
+                transactionId_ = input.readStringRequireUtf8();
+                bitField0_ |= 0x00000001;
+                break;
+              } // case 90
+            case 97:
+              {
+                shippingValue_ = input.readDouble();
+                bitField0_ |= 0x00000040;
+                break;
+              } // case 97
+            case 106:
+              {
+                com.google.recaptchaenterprise.v1beta1.TransactionData.User m =
+                    input.readMessage(
+                        com.google.recaptchaenterprise.v1beta1.TransactionData.User.parser(),
+                        extensionRegistry);
+                if (merchantsBuilder_ == null) {
+                  ensureMerchantsIsMutable();
+                  merchants_.add(m);
+                } else {
+                  merchantsBuilder_.addMessage(m);
+                }
+                break;
+              } // case 106
+            case 114:
+              {
+                com.google.recaptchaenterprise.v1beta1.TransactionData.Item m =
+                    input.readMessage(
+                        com.google.recaptchaenterprise.v1beta1.TransactionData.Item.parser(),
+                        extensionRegistry);
+                if (itemsBuilder_ == null) {
+                  ensureItemsIsMutable();
+                  items_.add(m);
+                } else {
+                  itemsBuilder_.addMessage(m);
+                }
+                break;
+              } // case 114
+            default:
+              {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+          } // switch (tag)
+        } // while (!done)
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.unwrapIOException();
+      } finally {
+        onChanged();
+      } // finally
+      return this;
+    }
+
+    private int bitField0_;
+
+    private java.lang.Object transactionId_ = "";
+    /**
+     *
+     *
+     * <pre>
+     * Unique identifier for the transaction. This custom identifier can be used
+     * to reference this transaction in the future, for example, labeling a refund
+     * or chargeback event. Two attempts at the same transaction should use the
+     * same transaction id.
+     * </pre>
+     *
+     * <code>optional string transaction_id = 11;</code>
+     *
+     * @return Whether the transactionId field is set.
+     */
+    public boolean hasTransactionId() {
+      return ((bitField0_ & 0x00000001) != 0);
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Unique identifier for the transaction. This custom identifier can be used
+     * to reference this transaction in the future, for example, labeling a refund
+     * or chargeback event. Two attempts at the same transaction should use the
+     * same transaction id.
+     * </pre>
+     *
+     * <code>optional string transaction_id = 11;</code>
+     *
+     * @return The transactionId.
+     */
+    public java.lang.String getTransactionId() {
+      java.lang.Object ref = transactionId_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        transactionId_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Unique identifier for the transaction. This custom identifier can be used
+     * to reference this transaction in the future, for example, labeling a refund
+     * or chargeback event. Two attempts at the same transaction should use the
+     * same transaction id.
+     * </pre>
+     *
+     * <code>optional string transaction_id = 11;</code>
+     *
+     * @return The bytes for transactionId.
+     */
+    public com.google.protobuf.ByteString getTransactionIdBytes() {
+      java.lang.Object ref = transactionId_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b =
+            com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+        transactionId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Unique identifier for the transaction. This custom identifier can be used
+     * to reference this transaction in the future, for example, labeling a refund
+     * or chargeback event. Two attempts at the same transaction should use the
+     * same transaction id.
+     * </pre>
+     *
+     * <code>optional string transaction_id = 11;</code>
+     *
+     * @param value The transactionId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setTransactionId(java.lang.String value) {
+      if (value == null) {
+        throw new NullPointerException();
+      }
+      transactionId_ = value;
+      bitField0_ |= 0x00000001;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Unique identifier for the transaction. This custom identifier can be used
+     * to reference this transaction in the future, for example, labeling a refund
+     * or chargeback event. Two attempts at the same transaction should use the
+     * same transaction id.
+     * </pre>
+     *
+     * <code>optional string transaction_id = 11;</code>
+     *
+     * @return This builder for chaining.
+     */
+    public Builder clearTransactionId() {
+      transactionId_ = getDefaultInstance().getTransactionId();
+      bitField0_ = (bitField0_ & ~0x00000001);
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Unique identifier for the transaction. This custom identifier can be used
+     * to reference this transaction in the future, for example, labeling a refund
+     * or chargeback event. Two attempts at the same transaction should use the
+     * same transaction id.
+     * </pre>
+     *
+     * <code>optional string transaction_id = 11;</code>
+     *
+     * @param value The bytes for transactionId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setTransactionIdBytes(com.google.protobuf.ByteString value) {
+      if (value == null) {
+        throw new NullPointerException();
+      }
+      checkByteStringIsUtf8(value);
+      transactionId_ = value;
+      bitField0_ |= 0x00000001;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object paymentMethod_ = "";
+    /**
+     *
+     *
+     * <pre>
+     * The payment method for the transaction. The allowed values are:
+     * * credit-card
+     * * debit-card
+     * * gift-card
+     * * processor-{name} (If a third-party is used, for example,
+     * processor-paypal)
+     * * custom-{name} (If an alternative method is used, for example,
+     * custom-crypto)
+     * </pre>
+     *
+     * <code>string payment_method = 1;</code>
+     *
+     * @return The paymentMethod.
+     */
+    public java.lang.String getPaymentMethod() {
+      java.lang.Object ref = paymentMethod_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        paymentMethod_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * The payment method for the transaction. The allowed values are:
+     * * credit-card
+     * * debit-card
+     * * gift-card
+     * * processor-{name} (If a third-party is used, for example,
+     * processor-paypal)
+     * * custom-{name} (If an alternative method is used, for example,
+     * custom-crypto)
+     * </pre>
+     *
+     * <code>string payment_method = 1;</code>
+     *
+     * @return The bytes for paymentMethod.
+     */
+    public com.google.protobuf.ByteString getPaymentMethodBytes() {
+      java.lang.Object ref = paymentMethod_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b =
+            com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+        paymentMethod_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * The payment method for the transaction. The allowed values are:
+     * * credit-card
+     * * debit-card
+     * * gift-card
+     * * processor-{name} (If a third-party is used, for example,
+     * processor-paypal)
+     * * custom-{name} (If an alternative method is used, for example,
+     * custom-crypto)
+     * </pre>
+     *
+     * <code>string payment_method = 1;</code>
+     *
+     * @param value The paymentMethod to set.
+     * @return This builder for chaining.
+     */
+    public Builder setPaymentMethod(java.lang.String value) {
+      if (value == null) {
+        throw new NullPointerException();
+      }
+      paymentMethod_ = value;
+      bitField0_ |= 0x00000002;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * The payment method for the transaction. The allowed values are:
+     * * credit-card
+     * * debit-card
+     * * gift-card
+     * * processor-{name} (If a third-party is used, for example,
+     * processor-paypal)
+     * * custom-{name} (If an alternative method is used, for example,
+     * custom-crypto)
+     * </pre>
+     *
+     * <code>string payment_method = 1;</code>
+     *
+     * @return This builder for chaining.
+     */
+    public Builder clearPaymentMethod() {
+      paymentMethod_ = getDefaultInstance().getPaymentMethod();
+      bitField0_ = (bitField0_ & ~0x00000002);
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * The payment method for the transaction. The allowed values are:
+     * * credit-card
+     * * debit-card
+     * * gift-card
+     * * processor-{name} (If a third-party is used, for example,
+     * processor-paypal)
+     * * custom-{name} (If an alternative method is used, for example,
+     * custom-crypto)
+     * </pre>
+     *
+     * <code>string payment_method = 1;</code>
+     *
+     * @param value The bytes for paymentMethod to set.
+     * @return This builder for chaining.
+     */
+    public Builder setPaymentMethodBytes(com.google.protobuf.ByteString value) {
+      if (value == null) {
+        throw new NullPointerException();
+      }
+      checkByteStringIsUtf8(value);
+      paymentMethod_ = value;
+      bitField0_ |= 0x00000002;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object cardBin_ = "";
+    /**
+     *
+     *
+     * <pre>
+     * The Bank Identification Number - generally the first 6 or 8 digits of the
+     * card.
+     * </pre>
+     *
+     * <code>string card_bin = 2;</code>
+     *
+     * @return The cardBin.
+     */
+    public java.lang.String getCardBin() {
+      java.lang.Object ref = cardBin_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        cardBin_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * The Bank Identification Number - generally the first 6 or 8 digits of the
+     * card.
+     * </pre>
+     *
+     * <code>string card_bin = 2;</code>
+     *
+     * @return The bytes for cardBin.
+     */
+    public com.google.protobuf.ByteString getCardBinBytes() {
+      java.lang.Object ref = cardBin_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b =
+            com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+        cardBin_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * The Bank Identification Number - generally the first 6 or 8 digits of the
+     * card.
+     * </pre>
+     *
+     * <code>string card_bin = 2;</code>
+     *
+     * @param value The cardBin to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCardBin(java.lang.String value) {
+      if (value == null) {
+        throw new NullPointerException();
+      }
+      cardBin_ = value;
+      bitField0_ |= 0x00000004;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * The Bank Identification Number - generally the first 6 or 8 digits of the
+     * card.
+     * </pre>
+     *
+     * <code>string card_bin = 2;</code>
+     *
+     * @return This builder for chaining.
+     */
+    public Builder clearCardBin() {
+      cardBin_ = getDefaultInstance().getCardBin();
+      bitField0_ = (bitField0_ & ~0x00000004);
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * The Bank Identification Number - generally the first 6 or 8 digits of the
+     * card.
+     * </pre>
+     *
+     * <code>string card_bin = 2;</code>
+     *
+     * @param value The bytes for cardBin to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCardBinBytes(com.google.protobuf.ByteString value) {
+      if (value == null) {
+        throw new NullPointerException();
+      }
+      checkByteStringIsUtf8(value);
+      cardBin_ = value;
+      bitField0_ |= 0x00000004;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object cardLastFour_ = "";
+    /**
+     *
+     *
+     * <pre>
+     * The last four digits of the card.
+     * </pre>
+     *
+     * <code>string card_last_four = 3;</code>
+     *
+     * @return The cardLastFour.
+     */
+    public java.lang.String getCardLastFour() {
+      java.lang.Object ref = cardLastFour_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        cardLastFour_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * The last four digits of the card.
+     * </pre>
+     *
+     * <code>string card_last_four = 3;</code>
+     *
+     * @return The bytes for cardLastFour.
+     */
+    public com.google.protobuf.ByteString getCardLastFourBytes() {
+      java.lang.Object ref = cardLastFour_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b =
+            com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+        cardLastFour_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * The last four digits of the card.
+     * </pre>
+     *
+     * <code>string card_last_four = 3;</code>
+     *
+     * @param value The cardLastFour to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCardLastFour(java.lang.String value) {
+      if (value == null) {
+        throw new NullPointerException();
+      }
+      cardLastFour_ = value;
+      bitField0_ |= 0x00000008;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * The last four digits of the card.
+     * </pre>
+     *
+     * <code>string card_last_four = 3;</code>
+     *
+     * @return This builder for chaining.
+     */
+    public Builder clearCardLastFour() {
+      cardLastFour_ = getDefaultInstance().getCardLastFour();
+      bitField0_ = (bitField0_ & ~0x00000008);
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * The last four digits of the card.
+     * </pre>
+     *
+     * <code>string card_last_four = 3;</code>
+     *
+     * @param value The bytes for cardLastFour to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCardLastFourBytes(com.google.protobuf.ByteString value) {
+      if (value == null) {
+        throw new NullPointerException();
+      }
+      checkByteStringIsUtf8(value);
+      cardLastFour_ = value;
+      bitField0_ |= 0x00000008;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object currencyCode_ = "";
+    /**
+     *
+     *
+     * <pre>
+     * The currency code in ISO-4217 format.
+     * </pre>
+     *
+     * <code>string currency_code = 4;</code>
+     *
+     * @return The currencyCode.
+     */
+    public java.lang.String getCurrencyCode() {
+      java.lang.Object ref = currencyCode_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        currencyCode_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * The currency code in ISO-4217 format.
+     * </pre>
+     *
+     * <code>string currency_code = 4;</code>
+     *
+     * @return The bytes for currencyCode.
+     */
+    public com.google.protobuf.ByteString getCurrencyCodeBytes() {
+      java.lang.Object ref = currencyCode_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b =
+            com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+        currencyCode_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * The currency code in ISO-4217 format.
+     * </pre>
+     *
+     * <code>string currency_code = 4;</code>
+     *
+     * @param value The currencyCode to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCurrencyCode(java.lang.String value) {
+      if (value == null) {
+        throw new NullPointerException();
+      }
+      currencyCode_ = value;
+      bitField0_ |= 0x00000010;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * The currency code in ISO-4217 format.
+     * </pre>
+     *
+     * <code>string currency_code = 4;</code>
+     *
+     * @return This builder for chaining.
+     */
+    public Builder clearCurrencyCode() {
+      currencyCode_ = getDefaultInstance().getCurrencyCode();
+      bitField0_ = (bitField0_ & ~0x00000010);
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * The currency code in ISO-4217 format.
+     * </pre>
+     *
+     * <code>string currency_code = 4;</code>
+     *
+     * @param value The bytes for currencyCode to set.
+     * @return This builder for chaining.
+     */
+    public Builder setCurrencyCodeBytes(com.google.protobuf.ByteString value) {
+      if (value == null) {
+        throw new NullPointerException();
+      }
+      checkByteStringIsUtf8(value);
+      currencyCode_ = value;
+      bitField0_ |= 0x00000010;
+      onChanged();
+      return this;
+    }
+
+    private double value_;
+    /**
+     *
+     *
+     * <pre>
+     * The decimal value of the transaction in the specified currency.
+     * </pre>
+     *
+     * <code>double value = 5;</code>
+     *
+     * @return The value.
+     */
+    @java.lang.Override
+    public double getValue() {
+      return value_;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * The decimal value of the transaction in the specified currency.
+     * </pre>
+     *
+     * <code>double value = 5;</code>
+     *
+     * @param value The value to set.
+     * @return This builder for chaining.
+     */
+    public Builder setValue(double value) {
+
+      value_ = value;
+      bitField0_ |= 0x00000020;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * The decimal value of the transaction in the specified currency.
+     * </pre>
+     *
+     * <code>double value = 5;</code>
+     *
+     * @return This builder for chaining.
+     */
+    public Builder clearValue() {
+      bitField0_ = (bitField0_ & ~0x00000020);
+      value_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private double shippingValue_;
+    /**
+     *
+     *
+     * <pre>
+     * The value of shipping in the specified currency. 0 for free or no shipping.
+     * </pre>
+     *
+     * <code>double shipping_value = 12;</code>
+     *
+     * @return The shippingValue.
+     */
+    @java.lang.Override
+    public double getShippingValue() {
+      return shippingValue_;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * The value of shipping in the specified currency. 0 for free or no shipping.
+     * </pre>
+     *
+     * <code>double shipping_value = 12;</code>
+     *
+     * @param value The shippingValue to set.
+     * @return This builder for chaining.
+     */
+    public Builder setShippingValue(double value) {
+
+      shippingValue_ = value;
+      bitField0_ |= 0x00000040;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * The value of shipping in the specified currency. 0 for free or no shipping.
+     * </pre>
+     *
+     * <code>double shipping_value = 12;</code>
+     *
+     * @return This builder for chaining.
+     */
+    public Builder clearShippingValue() {
+      bitField0_ = (bitField0_ & ~0x00000040);
+      shippingValue_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private com.google.recaptchaenterprise.v1beta1.TransactionData.Address shippingAddress_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+            com.google.recaptchaenterprise.v1beta1.TransactionData.Address,
+            com.google.recaptchaenterprise.v1beta1.TransactionData.Address.Builder,
+            com.google.recaptchaenterprise.v1beta1.TransactionData.AddressOrBuilder>
+        shippingAddressBuilder_;
+    /**
+     *
+     *
+     * <pre>
+     * Destination address if this transaction involves shipping a physical item.
+     * </pre>
+     *
+     * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address shipping_address = 6;
+     * </code>
+     *
+     * @return Whether the shippingAddress field is set.
+     */
+    public boolean hasShippingAddress() {
+      return ((bitField0_ & 0x00000080) != 0);
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Destination address if this transaction involves shipping a physical item.
+     * </pre>
+     *
+     * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address shipping_address = 6;
+     * </code>
+     *
+     * @return The shippingAddress.
+     */
+    public com.google.recaptchaenterprise.v1beta1.TransactionData.Address getShippingAddress() {
+      if (shippingAddressBuilder_ == null) {
+        return shippingAddress_ == null
+            ? com.google.recaptchaenterprise.v1beta1.TransactionData.Address.getDefaultInstance()
+            : shippingAddress_;
+      } else {
+        return shippingAddressBuilder_.getMessage();
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Destination address if this transaction involves shipping a physical item.
+     * </pre>
+     *
+     * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address shipping_address = 6;
+     * </code>
+     */
+    public Builder setShippingAddress(
+        com.google.recaptchaenterprise.v1beta1.TransactionData.Address value) {
+      if (shippingAddressBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        shippingAddress_ = value;
+      } else {
+        shippingAddressBuilder_.setMessage(value);
+      }
+      bitField0_ |= 0x00000080;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Destination address if this transaction involves shipping a physical item.
+     * </pre>
+     *
+     * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address shipping_address = 6;
+     * </code>
+     */
+    public Builder setShippingAddress(
+        com.google.recaptchaenterprise.v1beta1.TransactionData.Address.Builder builderForValue) {
+      if (shippingAddressBuilder_ == null) {
+        shippingAddress_ = builderForValue.build();
+      } else {
+        shippingAddressBuilder_.setMessage(builderForValue.build());
+      }
+      bitField0_ |= 0x00000080;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Destination address if this transaction involves shipping a physical item.
+     * </pre>
+     *
+     * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address shipping_address = 6;
+     * </code>
+     */
+    public Builder mergeShippingAddress(
+        com.google.recaptchaenterprise.v1beta1.TransactionData.Address value) {
+      if (shippingAddressBuilder_ == null) {
+        if (((bitField0_ & 0x00000080) != 0)
+            && shippingAddress_ != null
+            && shippingAddress_
+                != com.google.recaptchaenterprise.v1beta1.TransactionData.Address
+                    .getDefaultInstance()) {
+          getShippingAddressBuilder().mergeFrom(value);
+        } else {
+          shippingAddress_ = value;
+        }
+      } else {
+        shippingAddressBuilder_.mergeFrom(value);
+      }
+      bitField0_ |= 0x00000080;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Destination address if this transaction involves shipping a physical item.
+     * </pre>
+     *
+     * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address shipping_address = 6;
+     * </code>
+     */
+    public Builder clearShippingAddress() {
+      bitField0_ = (bitField0_ & ~0x00000080);
+      shippingAddress_ = null;
+      if (shippingAddressBuilder_ != null) {
+        shippingAddressBuilder_.dispose();
+        shippingAddressBuilder_ = null;
+      }
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Destination address if this transaction involves shipping a physical item.
+     * </pre>
+     *
+     * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address shipping_address = 6;
+     * </code>
+     */
+    public com.google.recaptchaenterprise.v1beta1.TransactionData.Address.Builder
+        getShippingAddressBuilder() {
+      bitField0_ |= 0x00000080;
+      onChanged();
+      return getShippingAddressFieldBuilder().getBuilder();
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Destination address if this transaction involves shipping a physical item.
+     * </pre>
+     *
+     * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address shipping_address = 6;
+     * </code>
+     */
+    public com.google.recaptchaenterprise.v1beta1.TransactionData.AddressOrBuilder
+        getShippingAddressOrBuilder() {
+      if (shippingAddressBuilder_ != null) {
+        return shippingAddressBuilder_.getMessageOrBuilder();
+      } else {
+        return shippingAddress_ == null
+            ? com.google.recaptchaenterprise.v1beta1.TransactionData.Address.getDefaultInstance()
+            : shippingAddress_;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Destination address if this transaction involves shipping a physical item.
+     * </pre>
+     *
+     * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address shipping_address = 6;
+     * </code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+            com.google.recaptchaenterprise.v1beta1.TransactionData.Address,
+            com.google.recaptchaenterprise.v1beta1.TransactionData.Address.Builder,
+            com.google.recaptchaenterprise.v1beta1.TransactionData.AddressOrBuilder>
+        getShippingAddressFieldBuilder() {
+      if (shippingAddressBuilder_ == null) {
+        shippingAddressBuilder_ =
+            new com.google.protobuf.SingleFieldBuilderV3<
+                com.google.recaptchaenterprise.v1beta1.TransactionData.Address,
+                com.google.recaptchaenterprise.v1beta1.TransactionData.Address.Builder,
+                com.google.recaptchaenterprise.v1beta1.TransactionData.AddressOrBuilder>(
+                getShippingAddress(), getParentForChildren(), isClean());
+        shippingAddress_ = null;
+      }
+      return shippingAddressBuilder_;
+    }
+
+    private com.google.recaptchaenterprise.v1beta1.TransactionData.Address billingAddress_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+            com.google.recaptchaenterprise.v1beta1.TransactionData.Address,
+            com.google.recaptchaenterprise.v1beta1.TransactionData.Address.Builder,
+            com.google.recaptchaenterprise.v1beta1.TransactionData.AddressOrBuilder>
+        billingAddressBuilder_;
+    /**
+     *
+     *
+     * <pre>
+     * Address associated with the payment method when applicable.
+     * </pre>
+     *
+     * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address billing_address = 7;
+     * </code>
+     *
+     * @return Whether the billingAddress field is set.
+     */
+    public boolean hasBillingAddress() {
+      return ((bitField0_ & 0x00000100) != 0);
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Address associated with the payment method when applicable.
+     * </pre>
+     *
+     * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address billing_address = 7;
+     * </code>
+     *
+     * @return The billingAddress.
+     */
+    public com.google.recaptchaenterprise.v1beta1.TransactionData.Address getBillingAddress() {
+      if (billingAddressBuilder_ == null) {
+        return billingAddress_ == null
+            ? com.google.recaptchaenterprise.v1beta1.TransactionData.Address.getDefaultInstance()
+            : billingAddress_;
+      } else {
+        return billingAddressBuilder_.getMessage();
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Address associated with the payment method when applicable.
+     * </pre>
+     *
+     * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address billing_address = 7;
+     * </code>
+     */
+    public Builder setBillingAddress(
+        com.google.recaptchaenterprise.v1beta1.TransactionData.Address value) {
+      if (billingAddressBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        billingAddress_ = value;
+      } else {
+        billingAddressBuilder_.setMessage(value);
+      }
+      bitField0_ |= 0x00000100;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Address associated with the payment method when applicable.
+     * </pre>
+     *
+     * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address billing_address = 7;
+     * </code>
+     */
+    public Builder setBillingAddress(
+        com.google.recaptchaenterprise.v1beta1.TransactionData.Address.Builder builderForValue) {
+      if (billingAddressBuilder_ == null) {
+        billingAddress_ = builderForValue.build();
+      } else {
+        billingAddressBuilder_.setMessage(builderForValue.build());
+      }
+      bitField0_ |= 0x00000100;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Address associated with the payment method when applicable.
+     * </pre>
+     *
+     * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address billing_address = 7;
+     * </code>
+     */
+    public Builder mergeBillingAddress(
+        com.google.recaptchaenterprise.v1beta1.TransactionData.Address value) {
+      if (billingAddressBuilder_ == null) {
+        if (((bitField0_ & 0x00000100) != 0)
+            && billingAddress_ != null
+            && billingAddress_
+                != com.google.recaptchaenterprise.v1beta1.TransactionData.Address
+                    .getDefaultInstance()) {
+          getBillingAddressBuilder().mergeFrom(value);
+        } else {
+          billingAddress_ = value;
+        }
+      } else {
+        billingAddressBuilder_.mergeFrom(value);
+      }
+      bitField0_ |= 0x00000100;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Address associated with the payment method when applicable.
+     * </pre>
+     *
+     * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address billing_address = 7;
+     * </code>
+     */
+    public Builder clearBillingAddress() {
+      bitField0_ = (bitField0_ & ~0x00000100);
+      billingAddress_ = null;
+      if (billingAddressBuilder_ != null) {
+        billingAddressBuilder_.dispose();
+        billingAddressBuilder_ = null;
+      }
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Address associated with the payment method when applicable.
+     * </pre>
+     *
+     * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address billing_address = 7;
+     * </code>
+     */
+    public com.google.recaptchaenterprise.v1beta1.TransactionData.Address.Builder
+        getBillingAddressBuilder() {
+      bitField0_ |= 0x00000100;
+      onChanged();
+      return getBillingAddressFieldBuilder().getBuilder();
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Address associated with the payment method when applicable.
+     * </pre>
+     *
+     * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address billing_address = 7;
+     * </code>
+     */
+    public com.google.recaptchaenterprise.v1beta1.TransactionData.AddressOrBuilder
+        getBillingAddressOrBuilder() {
+      if (billingAddressBuilder_ != null) {
+        return billingAddressBuilder_.getMessageOrBuilder();
+      } else {
+        return billingAddress_ == null
+            ? com.google.recaptchaenterprise.v1beta1.TransactionData.Address.getDefaultInstance()
+            : billingAddress_;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Address associated with the payment method when applicable.
+     * </pre>
+     *
+     * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address billing_address = 7;
+     * </code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+            com.google.recaptchaenterprise.v1beta1.TransactionData.Address,
+            com.google.recaptchaenterprise.v1beta1.TransactionData.Address.Builder,
+            com.google.recaptchaenterprise.v1beta1.TransactionData.AddressOrBuilder>
+        getBillingAddressFieldBuilder() {
+      if (billingAddressBuilder_ == null) {
+        billingAddressBuilder_ =
+            new com.google.protobuf.SingleFieldBuilderV3<
+                com.google.recaptchaenterprise.v1beta1.TransactionData.Address,
+                com.google.recaptchaenterprise.v1beta1.TransactionData.Address.Builder,
+                com.google.recaptchaenterprise.v1beta1.TransactionData.AddressOrBuilder>(
+                getBillingAddress(), getParentForChildren(), isClean());
+        billingAddress_ = null;
+      }
+      return billingAddressBuilder_;
+    }
+
+    private com.google.recaptchaenterprise.v1beta1.TransactionData.User user_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+            com.google.recaptchaenterprise.v1beta1.TransactionData.User,
+            com.google.recaptchaenterprise.v1beta1.TransactionData.User.Builder,
+            com.google.recaptchaenterprise.v1beta1.TransactionData.UserOrBuilder>
+        userBuilder_;
+    /**
+     *
+     *
+     * <pre>
+     * Information about the user paying/initiating the transaction.
+     * </pre>
+     *
+     * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.User user = 8;</code>
+     *
+     * @return Whether the user field is set.
+     */
+    public boolean hasUser() {
+      return ((bitField0_ & 0x00000200) != 0);
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the user paying/initiating the transaction.
+     * </pre>
+     *
+     * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.User user = 8;</code>
+     *
+     * @return The user.
+     */
+    public com.google.recaptchaenterprise.v1beta1.TransactionData.User getUser() {
+      if (userBuilder_ == null) {
+        return user_ == null
+            ? com.google.recaptchaenterprise.v1beta1.TransactionData.User.getDefaultInstance()
+            : user_;
+      } else {
+        return userBuilder_.getMessage();
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the user paying/initiating the transaction.
+     * </pre>
+     *
+     * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.User user = 8;</code>
+     */
+    public Builder setUser(com.google.recaptchaenterprise.v1beta1.TransactionData.User value) {
+      if (userBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        user_ = value;
+      } else {
+        userBuilder_.setMessage(value);
+      }
+      bitField0_ |= 0x00000200;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the user paying/initiating the transaction.
+     * </pre>
+     *
+     * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.User user = 8;</code>
+     */
+    public Builder setUser(
+        com.google.recaptchaenterprise.v1beta1.TransactionData.User.Builder builderForValue) {
+      if (userBuilder_ == null) {
+        user_ = builderForValue.build();
+      } else {
+        userBuilder_.setMessage(builderForValue.build());
+      }
+      bitField0_ |= 0x00000200;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the user paying/initiating the transaction.
+     * </pre>
+     *
+     * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.User user = 8;</code>
+     */
+    public Builder mergeUser(com.google.recaptchaenterprise.v1beta1.TransactionData.User value) {
+      if (userBuilder_ == null) {
+        if (((bitField0_ & 0x00000200) != 0)
+            && user_ != null
+            && user_
+                != com.google.recaptchaenterprise.v1beta1.TransactionData.User
+                    .getDefaultInstance()) {
+          getUserBuilder().mergeFrom(value);
+        } else {
+          user_ = value;
+        }
+      } else {
+        userBuilder_.mergeFrom(value);
+      }
+      bitField0_ |= 0x00000200;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the user paying/initiating the transaction.
+     * </pre>
+     *
+     * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.User user = 8;</code>
+     */
+    public Builder clearUser() {
+      bitField0_ = (bitField0_ & ~0x00000200);
+      user_ = null;
+      if (userBuilder_ != null) {
+        userBuilder_.dispose();
+        userBuilder_ = null;
+      }
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the user paying/initiating the transaction.
+     * </pre>
+     *
+     * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.User user = 8;</code>
+     */
+    public com.google.recaptchaenterprise.v1beta1.TransactionData.User.Builder getUserBuilder() {
+      bitField0_ |= 0x00000200;
+      onChanged();
+      return getUserFieldBuilder().getBuilder();
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the user paying/initiating the transaction.
+     * </pre>
+     *
+     * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.User user = 8;</code>
+     */
+    public com.google.recaptchaenterprise.v1beta1.TransactionData.UserOrBuilder getUserOrBuilder() {
+      if (userBuilder_ != null) {
+        return userBuilder_.getMessageOrBuilder();
+      } else {
+        return user_ == null
+            ? com.google.recaptchaenterprise.v1beta1.TransactionData.User.getDefaultInstance()
+            : user_;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the user paying/initiating the transaction.
+     * </pre>
+     *
+     * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.User user = 8;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+            com.google.recaptchaenterprise.v1beta1.TransactionData.User,
+            com.google.recaptchaenterprise.v1beta1.TransactionData.User.Builder,
+            com.google.recaptchaenterprise.v1beta1.TransactionData.UserOrBuilder>
+        getUserFieldBuilder() {
+      if (userBuilder_ == null) {
+        userBuilder_ =
+            new com.google.protobuf.SingleFieldBuilderV3<
+                com.google.recaptchaenterprise.v1beta1.TransactionData.User,
+                com.google.recaptchaenterprise.v1beta1.TransactionData.User.Builder,
+                com.google.recaptchaenterprise.v1beta1.TransactionData.UserOrBuilder>(
+                getUser(), getParentForChildren(), isClean());
+        user_ = null;
+      }
+      return userBuilder_;
+    }
+
+    private java.util.List<com.google.recaptchaenterprise.v1beta1.TransactionData.User> merchants_ =
+        java.util.Collections.emptyList();
+
+    private void ensureMerchantsIsMutable() {
+      if (!((bitField0_ & 0x00000400) != 0)) {
+        merchants_ =
+            new java.util.ArrayList<com.google.recaptchaenterprise.v1beta1.TransactionData.User>(
+                merchants_);
+        bitField0_ |= 0x00000400;
+      }
+    }
+
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+            com.google.recaptchaenterprise.v1beta1.TransactionData.User,
+            com.google.recaptchaenterprise.v1beta1.TransactionData.User.Builder,
+            com.google.recaptchaenterprise.v1beta1.TransactionData.UserOrBuilder>
+        merchantsBuilder_;
+
+    /**
+     *
+     *
+     * <pre>
+     * Information about the user or users fulfilling the transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.User merchants = 13;
+     * </code>
+     */
+    public java.util.List<com.google.recaptchaenterprise.v1beta1.TransactionData.User>
+        getMerchantsList() {
+      if (merchantsBuilder_ == null) {
+        return java.util.Collections.unmodifiableList(merchants_);
+      } else {
+        return merchantsBuilder_.getMessageList();
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the user or users fulfilling the transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.User merchants = 13;
+     * </code>
+     */
+    public int getMerchantsCount() {
+      if (merchantsBuilder_ == null) {
+        return merchants_.size();
+      } else {
+        return merchantsBuilder_.getCount();
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the user or users fulfilling the transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.User merchants = 13;
+     * </code>
+     */
+    public com.google.recaptchaenterprise.v1beta1.TransactionData.User getMerchants(int index) {
+      if (merchantsBuilder_ == null) {
+        return merchants_.get(index);
+      } else {
+        return merchantsBuilder_.getMessage(index);
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the user or users fulfilling the transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.User merchants = 13;
+     * </code>
+     */
+    public Builder setMerchants(
+        int index, com.google.recaptchaenterprise.v1beta1.TransactionData.User value) {
+      if (merchantsBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureMerchantsIsMutable();
+        merchants_.set(index, value);
+        onChanged();
+      } else {
+        merchantsBuilder_.setMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the user or users fulfilling the transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.User merchants = 13;
+     * </code>
+     */
+    public Builder setMerchants(
+        int index,
+        com.google.recaptchaenterprise.v1beta1.TransactionData.User.Builder builderForValue) {
+      if (merchantsBuilder_ == null) {
+        ensureMerchantsIsMutable();
+        merchants_.set(index, builderForValue.build());
+        onChanged();
+      } else {
+        merchantsBuilder_.setMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the user or users fulfilling the transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.User merchants = 13;
+     * </code>
+     */
+    public Builder addMerchants(com.google.recaptchaenterprise.v1beta1.TransactionData.User value) {
+      if (merchantsBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureMerchantsIsMutable();
+        merchants_.add(value);
+        onChanged();
+      } else {
+        merchantsBuilder_.addMessage(value);
+      }
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the user or users fulfilling the transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.User merchants = 13;
+     * </code>
+     */
+    public Builder addMerchants(
+        int index, com.google.recaptchaenterprise.v1beta1.TransactionData.User value) {
+      if (merchantsBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureMerchantsIsMutable();
+        merchants_.add(index, value);
+        onChanged();
+      } else {
+        merchantsBuilder_.addMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the user or users fulfilling the transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.User merchants = 13;
+     * </code>
+     */
+    public Builder addMerchants(
+        com.google.recaptchaenterprise.v1beta1.TransactionData.User.Builder builderForValue) {
+      if (merchantsBuilder_ == null) {
+        ensureMerchantsIsMutable();
+        merchants_.add(builderForValue.build());
+        onChanged();
+      } else {
+        merchantsBuilder_.addMessage(builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the user or users fulfilling the transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.User merchants = 13;
+     * </code>
+     */
+    public Builder addMerchants(
+        int index,
+        com.google.recaptchaenterprise.v1beta1.TransactionData.User.Builder builderForValue) {
+      if (merchantsBuilder_ == null) {
+        ensureMerchantsIsMutable();
+        merchants_.add(index, builderForValue.build());
+        onChanged();
+      } else {
+        merchantsBuilder_.addMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the user or users fulfilling the transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.User merchants = 13;
+     * </code>
+     */
+    public Builder addAllMerchants(
+        java.lang.Iterable<? extends com.google.recaptchaenterprise.v1beta1.TransactionData.User>
+            values) {
+      if (merchantsBuilder_ == null) {
+        ensureMerchantsIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(values, merchants_);
+        onChanged();
+      } else {
+        merchantsBuilder_.addAllMessages(values);
+      }
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the user or users fulfilling the transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.User merchants = 13;
+     * </code>
+     */
+    public Builder clearMerchants() {
+      if (merchantsBuilder_ == null) {
+        merchants_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000400);
+        onChanged();
+      } else {
+        merchantsBuilder_.clear();
+      }
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the user or users fulfilling the transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.User merchants = 13;
+     * </code>
+     */
+    public Builder removeMerchants(int index) {
+      if (merchantsBuilder_ == null) {
+        ensureMerchantsIsMutable();
+        merchants_.remove(index);
+        onChanged();
+      } else {
+        merchantsBuilder_.remove(index);
+      }
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the user or users fulfilling the transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.User merchants = 13;
+     * </code>
+     */
+    public com.google.recaptchaenterprise.v1beta1.TransactionData.User.Builder getMerchantsBuilder(
+        int index) {
+      return getMerchantsFieldBuilder().getBuilder(index);
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the user or users fulfilling the transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.User merchants = 13;
+     * </code>
+     */
+    public com.google.recaptchaenterprise.v1beta1.TransactionData.UserOrBuilder
+        getMerchantsOrBuilder(int index) {
+      if (merchantsBuilder_ == null) {
+        return merchants_.get(index);
+      } else {
+        return merchantsBuilder_.getMessageOrBuilder(index);
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the user or users fulfilling the transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.User merchants = 13;
+     * </code>
+     */
+    public java.util.List<
+            ? extends com.google.recaptchaenterprise.v1beta1.TransactionData.UserOrBuilder>
+        getMerchantsOrBuilderList() {
+      if (merchantsBuilder_ != null) {
+        return merchantsBuilder_.getMessageOrBuilderList();
+      } else {
+        return java.util.Collections.unmodifiableList(merchants_);
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the user or users fulfilling the transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.User merchants = 13;
+     * </code>
+     */
+    public com.google.recaptchaenterprise.v1beta1.TransactionData.User.Builder
+        addMerchantsBuilder() {
+      return getMerchantsFieldBuilder()
+          .addBuilder(
+              com.google.recaptchaenterprise.v1beta1.TransactionData.User.getDefaultInstance());
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the user or users fulfilling the transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.User merchants = 13;
+     * </code>
+     */
+    public com.google.recaptchaenterprise.v1beta1.TransactionData.User.Builder addMerchantsBuilder(
+        int index) {
+      return getMerchantsFieldBuilder()
+          .addBuilder(
+              index,
+              com.google.recaptchaenterprise.v1beta1.TransactionData.User.getDefaultInstance());
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the user or users fulfilling the transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.User merchants = 13;
+     * </code>
+     */
+    public java.util.List<com.google.recaptchaenterprise.v1beta1.TransactionData.User.Builder>
+        getMerchantsBuilderList() {
+      return getMerchantsFieldBuilder().getBuilderList();
+    }
+
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+            com.google.recaptchaenterprise.v1beta1.TransactionData.User,
+            com.google.recaptchaenterprise.v1beta1.TransactionData.User.Builder,
+            com.google.recaptchaenterprise.v1beta1.TransactionData.UserOrBuilder>
+        getMerchantsFieldBuilder() {
+      if (merchantsBuilder_ == null) {
+        merchantsBuilder_ =
+            new com.google.protobuf.RepeatedFieldBuilderV3<
+                com.google.recaptchaenterprise.v1beta1.TransactionData.User,
+                com.google.recaptchaenterprise.v1beta1.TransactionData.User.Builder,
+                com.google.recaptchaenterprise.v1beta1.TransactionData.UserOrBuilder>(
+                merchants_, ((bitField0_ & 0x00000400) != 0), getParentForChildren(), isClean());
+        merchants_ = null;
+      }
+      return merchantsBuilder_;
+    }
+
+    private java.util.List<com.google.recaptchaenterprise.v1beta1.TransactionData.Item> items_ =
+        java.util.Collections.emptyList();
+
+    private void ensureItemsIsMutable() {
+      if (!((bitField0_ & 0x00000800) != 0)) {
+        items_ =
+            new java.util.ArrayList<com.google.recaptchaenterprise.v1beta1.TransactionData.Item>(
+                items_);
+        bitField0_ |= 0x00000800;
+      }
+    }
+
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+            com.google.recaptchaenterprise.v1beta1.TransactionData.Item,
+            com.google.recaptchaenterprise.v1beta1.TransactionData.Item.Builder,
+            com.google.recaptchaenterprise.v1beta1.TransactionData.ItemOrBuilder>
+        itemsBuilder_;
+
+    /**
+     *
+     *
+     * <pre>
+     * Items purchased in this transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item items = 14;
+     * </code>
+     */
+    public java.util.List<com.google.recaptchaenterprise.v1beta1.TransactionData.Item>
+        getItemsList() {
+      if (itemsBuilder_ == null) {
+        return java.util.Collections.unmodifiableList(items_);
+      } else {
+        return itemsBuilder_.getMessageList();
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Items purchased in this transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item items = 14;
+     * </code>
+     */
+    public int getItemsCount() {
+      if (itemsBuilder_ == null) {
+        return items_.size();
+      } else {
+        return itemsBuilder_.getCount();
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Items purchased in this transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item items = 14;
+     * </code>
+     */
+    public com.google.recaptchaenterprise.v1beta1.TransactionData.Item getItems(int index) {
+      if (itemsBuilder_ == null) {
+        return items_.get(index);
+      } else {
+        return itemsBuilder_.getMessage(index);
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Items purchased in this transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item items = 14;
+     * </code>
+     */
+    public Builder setItems(
+        int index, com.google.recaptchaenterprise.v1beta1.TransactionData.Item value) {
+      if (itemsBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureItemsIsMutable();
+        items_.set(index, value);
+        onChanged();
+      } else {
+        itemsBuilder_.setMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Items purchased in this transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item items = 14;
+     * </code>
+     */
+    public Builder setItems(
+        int index,
+        com.google.recaptchaenterprise.v1beta1.TransactionData.Item.Builder builderForValue) {
+      if (itemsBuilder_ == null) {
+        ensureItemsIsMutable();
+        items_.set(index, builderForValue.build());
+        onChanged();
+      } else {
+        itemsBuilder_.setMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Items purchased in this transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item items = 14;
+     * </code>
+     */
+    public Builder addItems(com.google.recaptchaenterprise.v1beta1.TransactionData.Item value) {
+      if (itemsBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureItemsIsMutable();
+        items_.add(value);
+        onChanged();
+      } else {
+        itemsBuilder_.addMessage(value);
+      }
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Items purchased in this transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item items = 14;
+     * </code>
+     */
+    public Builder addItems(
+        int index, com.google.recaptchaenterprise.v1beta1.TransactionData.Item value) {
+      if (itemsBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureItemsIsMutable();
+        items_.add(index, value);
+        onChanged();
+      } else {
+        itemsBuilder_.addMessage(index, value);
+      }
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Items purchased in this transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item items = 14;
+     * </code>
+     */
+    public Builder addItems(
+        com.google.recaptchaenterprise.v1beta1.TransactionData.Item.Builder builderForValue) {
+      if (itemsBuilder_ == null) {
+        ensureItemsIsMutable();
+        items_.add(builderForValue.build());
+        onChanged();
+      } else {
+        itemsBuilder_.addMessage(builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Items purchased in this transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item items = 14;
+     * </code>
+     */
+    public Builder addItems(
+        int index,
+        com.google.recaptchaenterprise.v1beta1.TransactionData.Item.Builder builderForValue) {
+      if (itemsBuilder_ == null) {
+        ensureItemsIsMutable();
+        items_.add(index, builderForValue.build());
+        onChanged();
+      } else {
+        itemsBuilder_.addMessage(index, builderForValue.build());
+      }
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Items purchased in this transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item items = 14;
+     * </code>
+     */
+    public Builder addAllItems(
+        java.lang.Iterable<? extends com.google.recaptchaenterprise.v1beta1.TransactionData.Item>
+            values) {
+      if (itemsBuilder_ == null) {
+        ensureItemsIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(values, items_);
+        onChanged();
+      } else {
+        itemsBuilder_.addAllMessages(values);
+      }
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Items purchased in this transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item items = 14;
+     * </code>
+     */
+    public Builder clearItems() {
+      if (itemsBuilder_ == null) {
+        items_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000800);
+        onChanged();
+      } else {
+        itemsBuilder_.clear();
+      }
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Items purchased in this transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item items = 14;
+     * </code>
+     */
+    public Builder removeItems(int index) {
+      if (itemsBuilder_ == null) {
+        ensureItemsIsMutable();
+        items_.remove(index);
+        onChanged();
+      } else {
+        itemsBuilder_.remove(index);
+      }
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Items purchased in this transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item items = 14;
+     * </code>
+     */
+    public com.google.recaptchaenterprise.v1beta1.TransactionData.Item.Builder getItemsBuilder(
+        int index) {
+      return getItemsFieldBuilder().getBuilder(index);
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Items purchased in this transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item items = 14;
+     * </code>
+     */
+    public com.google.recaptchaenterprise.v1beta1.TransactionData.ItemOrBuilder getItemsOrBuilder(
+        int index) {
+      if (itemsBuilder_ == null) {
+        return items_.get(index);
+      } else {
+        return itemsBuilder_.getMessageOrBuilder(index);
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Items purchased in this transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item items = 14;
+     * </code>
+     */
+    public java.util.List<
+            ? extends com.google.recaptchaenterprise.v1beta1.TransactionData.ItemOrBuilder>
+        getItemsOrBuilderList() {
+      if (itemsBuilder_ != null) {
+        return itemsBuilder_.getMessageOrBuilderList();
+      } else {
+        return java.util.Collections.unmodifiableList(items_);
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Items purchased in this transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item items = 14;
+     * </code>
+     */
+    public com.google.recaptchaenterprise.v1beta1.TransactionData.Item.Builder addItemsBuilder() {
+      return getItemsFieldBuilder()
+          .addBuilder(
+              com.google.recaptchaenterprise.v1beta1.TransactionData.Item.getDefaultInstance());
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Items purchased in this transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item items = 14;
+     * </code>
+     */
+    public com.google.recaptchaenterprise.v1beta1.TransactionData.Item.Builder addItemsBuilder(
+        int index) {
+      return getItemsFieldBuilder()
+          .addBuilder(
+              index,
+              com.google.recaptchaenterprise.v1beta1.TransactionData.Item.getDefaultInstance());
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Items purchased in this transaction.
+     * </pre>
+     *
+     * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item items = 14;
+     * </code>
+     */
+    public java.util.List<com.google.recaptchaenterprise.v1beta1.TransactionData.Item.Builder>
+        getItemsBuilderList() {
+      return getItemsFieldBuilder().getBuilderList();
+    }
+
+    private com.google.protobuf.RepeatedFieldBuilderV3<
+            com.google.recaptchaenterprise.v1beta1.TransactionData.Item,
+            com.google.recaptchaenterprise.v1beta1.TransactionData.Item.Builder,
+            com.google.recaptchaenterprise.v1beta1.TransactionData.ItemOrBuilder>
+        getItemsFieldBuilder() {
+      if (itemsBuilder_ == null) {
+        itemsBuilder_ =
+            new com.google.protobuf.RepeatedFieldBuilderV3<
+                com.google.recaptchaenterprise.v1beta1.TransactionData.Item,
+                com.google.recaptchaenterprise.v1beta1.TransactionData.Item.Builder,
+                com.google.recaptchaenterprise.v1beta1.TransactionData.ItemOrBuilder>(
+                items_, ((bitField0_ & 0x00000800) != 0), getParentForChildren(), isClean());
+        items_ = null;
+      }
+      return itemsBuilder_;
+    }
+
+    private com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo gatewayInfo_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+            com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo,
+            com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo.Builder,
+            com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfoOrBuilder>
+        gatewayInfoBuilder_;
+    /**
+     *
+     *
+     * <pre>
+     * Information about the payment gateway's response to the transaction.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo gateway_info = 10;
+     * </code>
+     *
+     * @return Whether the gatewayInfo field is set.
+     */
+    public boolean hasGatewayInfo() {
+      return ((bitField0_ & 0x00001000) != 0);
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the payment gateway's response to the transaction.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo gateway_info = 10;
+     * </code>
+     *
+     * @return The gatewayInfo.
+     */
+    public com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo getGatewayInfo() {
+      if (gatewayInfoBuilder_ == null) {
+        return gatewayInfo_ == null
+            ? com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo
+                .getDefaultInstance()
+            : gatewayInfo_;
+      } else {
+        return gatewayInfoBuilder_.getMessage();
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the payment gateway's response to the transaction.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo gateway_info = 10;
+     * </code>
+     */
+    public Builder setGatewayInfo(
+        com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo value) {
+      if (gatewayInfoBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        gatewayInfo_ = value;
+      } else {
+        gatewayInfoBuilder_.setMessage(value);
+      }
+      bitField0_ |= 0x00001000;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the payment gateway's response to the transaction.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo gateway_info = 10;
+     * </code>
+     */
+    public Builder setGatewayInfo(
+        com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo.Builder
+            builderForValue) {
+      if (gatewayInfoBuilder_ == null) {
+        gatewayInfo_ = builderForValue.build();
+      } else {
+        gatewayInfoBuilder_.setMessage(builderForValue.build());
+      }
+      bitField0_ |= 0x00001000;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the payment gateway's response to the transaction.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo gateway_info = 10;
+     * </code>
+     */
+    public Builder mergeGatewayInfo(
+        com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo value) {
+      if (gatewayInfoBuilder_ == null) {
+        if (((bitField0_ & 0x00001000) != 0)
+            && gatewayInfo_ != null
+            && gatewayInfo_
+                != com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo
+                    .getDefaultInstance()) {
+          getGatewayInfoBuilder().mergeFrom(value);
+        } else {
+          gatewayInfo_ = value;
+        }
+      } else {
+        gatewayInfoBuilder_.mergeFrom(value);
+      }
+      bitField0_ |= 0x00001000;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the payment gateway's response to the transaction.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo gateway_info = 10;
+     * </code>
+     */
+    public Builder clearGatewayInfo() {
+      bitField0_ = (bitField0_ & ~0x00001000);
+      gatewayInfo_ = null;
+      if (gatewayInfoBuilder_ != null) {
+        gatewayInfoBuilder_.dispose();
+        gatewayInfoBuilder_ = null;
+      }
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the payment gateway's response to the transaction.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo gateway_info = 10;
+     * </code>
+     */
+    public com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo.Builder
+        getGatewayInfoBuilder() {
+      bitField0_ |= 0x00001000;
+      onChanged();
+      return getGatewayInfoFieldBuilder().getBuilder();
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the payment gateway's response to the transaction.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo gateway_info = 10;
+     * </code>
+     */
+    public com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfoOrBuilder
+        getGatewayInfoOrBuilder() {
+      if (gatewayInfoBuilder_ != null) {
+        return gatewayInfoBuilder_.getMessageOrBuilder();
+      } else {
+        return gatewayInfo_ == null
+            ? com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo
+                .getDefaultInstance()
+            : gatewayInfo_;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Information about the payment gateway's response to the transaction.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo gateway_info = 10;
+     * </code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+            com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo,
+            com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo.Builder,
+            com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfoOrBuilder>
+        getGatewayInfoFieldBuilder() {
+      if (gatewayInfoBuilder_ == null) {
+        gatewayInfoBuilder_ =
+            new com.google.protobuf.SingleFieldBuilderV3<
+                com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo,
+                com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo.Builder,
+                com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfoOrBuilder>(
+                getGatewayInfo(), getParentForChildren(), isClean());
+        gatewayInfo_ = null;
+      }
+      return gatewayInfoBuilder_;
+    }
+
+    @java.lang.Override
+    public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+    // @@protoc_insertion_point(builder_scope:google.cloud.recaptchaenterprise.v1beta1.TransactionData)
+  }
+
+  // @@protoc_insertion_point(class_scope:google.cloud.recaptchaenterprise.v1beta1.TransactionData)
+  private static final com.google.recaptchaenterprise.v1beta1.TransactionData DEFAULT_INSTANCE;
+
+  static {
+    DEFAULT_INSTANCE = new com.google.recaptchaenterprise.v1beta1.TransactionData();
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.TransactionData getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<TransactionData> PARSER =
+      new com.google.protobuf.AbstractParser<TransactionData>() {
+        @java.lang.Override
+        public TransactionData parsePartialFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          Builder builder = newBuilder();
+          try {
+            builder.mergeFrom(input, extensionRegistry);
+          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+            throw e.setUnfinishedMessage(builder.buildPartial());
+          } catch (com.google.protobuf.UninitializedMessageException e) {
+            throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+          } catch (java.io.IOException e) {
+            throw new com.google.protobuf.InvalidProtocolBufferException(e)
+                .setUnfinishedMessage(builder.buildPartial());
+          }
+          return builder.buildPartial();
+        }
+      };
+
+  public static com.google.protobuf.Parser<TransactionData> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<TransactionData> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.recaptchaenterprise.v1beta1.TransactionData getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+}
diff --git a/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/TransactionDataOrBuilder.java b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/TransactionDataOrBuilder.java
new file mode 100644
index 000000000000..5a6791c459e8
--- /dev/null
+++ b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/TransactionDataOrBuilder.java
@@ -0,0 +1,480 @@
+/*
+ * Copyright 2020 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: google/cloud/recaptchaenterprise/v1beta1/recaptchaenterprise.proto
+
+package com.google.recaptchaenterprise.v1beta1;
+
+public interface TransactionDataOrBuilder
+    extends
+    // @@protoc_insertion_point(interface_extends:google.cloud.recaptchaenterprise.v1beta1.TransactionData)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   *
+   *
+   * <pre>
+   * Unique identifier for the transaction. This custom identifier can be used
+   * to reference this transaction in the future, for example, labeling a refund
+   * or chargeback event. Two attempts at the same transaction should use the
+   * same transaction id.
+   * </pre>
+   *
+   * <code>optional string transaction_id = 11;</code>
+   *
+   * @return Whether the transactionId field is set.
+   */
+  boolean hasTransactionId();
+  /**
+   *
+   *
+   * <pre>
+   * Unique identifier for the transaction. This custom identifier can be used
+   * to reference this transaction in the future, for example, labeling a refund
+   * or chargeback event. Two attempts at the same transaction should use the
+   * same transaction id.
+   * </pre>
+   *
+   * <code>optional string transaction_id = 11;</code>
+   *
+   * @return The transactionId.
+   */
+  java.lang.String getTransactionId();
+  /**
+   *
+   *
+   * <pre>
+   * Unique identifier for the transaction. This custom identifier can be used
+   * to reference this transaction in the future, for example, labeling a refund
+   * or chargeback event. Two attempts at the same transaction should use the
+   * same transaction id.
+   * </pre>
+   *
+   * <code>optional string transaction_id = 11;</code>
+   *
+   * @return The bytes for transactionId.
+   */
+  com.google.protobuf.ByteString getTransactionIdBytes();
+
+  /**
+   *
+   *
+   * <pre>
+   * The payment method for the transaction. The allowed values are:
+   * * credit-card
+   * * debit-card
+   * * gift-card
+   * * processor-{name} (If a third-party is used, for example,
+   * processor-paypal)
+   * * custom-{name} (If an alternative method is used, for example,
+   * custom-crypto)
+   * </pre>
+   *
+   * <code>string payment_method = 1;</code>
+   *
+   * @return The paymentMethod.
+   */
+  java.lang.String getPaymentMethod();
+  /**
+   *
+   *
+   * <pre>
+   * The payment method for the transaction. The allowed values are:
+   * * credit-card
+   * * debit-card
+   * * gift-card
+   * * processor-{name} (If a third-party is used, for example,
+   * processor-paypal)
+   * * custom-{name} (If an alternative method is used, for example,
+   * custom-crypto)
+   * </pre>
+   *
+   * <code>string payment_method = 1;</code>
+   *
+   * @return The bytes for paymentMethod.
+   */
+  com.google.protobuf.ByteString getPaymentMethodBytes();
+
+  /**
+   *
+   *
+   * <pre>
+   * The Bank Identification Number - generally the first 6 or 8 digits of the
+   * card.
+   * </pre>
+   *
+   * <code>string card_bin = 2;</code>
+   *
+   * @return The cardBin.
+   */
+  java.lang.String getCardBin();
+  /**
+   *
+   *
+   * <pre>
+   * The Bank Identification Number - generally the first 6 or 8 digits of the
+   * card.
+   * </pre>
+   *
+   * <code>string card_bin = 2;</code>
+   *
+   * @return The bytes for cardBin.
+   */
+  com.google.protobuf.ByteString getCardBinBytes();
+
+  /**
+   *
+   *
+   * <pre>
+   * The last four digits of the card.
+   * </pre>
+   *
+   * <code>string card_last_four = 3;</code>
+   *
+   * @return The cardLastFour.
+   */
+  java.lang.String getCardLastFour();
+  /**
+   *
+   *
+   * <pre>
+   * The last four digits of the card.
+   * </pre>
+   *
+   * <code>string card_last_four = 3;</code>
+   *
+   * @return The bytes for cardLastFour.
+   */
+  com.google.protobuf.ByteString getCardLastFourBytes();
+
+  /**
+   *
+   *
+   * <pre>
+   * The currency code in ISO-4217 format.
+   * </pre>
+   *
+   * <code>string currency_code = 4;</code>
+   *
+   * @return The currencyCode.
+   */
+  java.lang.String getCurrencyCode();
+  /**
+   *
+   *
+   * <pre>
+   * The currency code in ISO-4217 format.
+   * </pre>
+   *
+   * <code>string currency_code = 4;</code>
+   *
+   * @return The bytes for currencyCode.
+   */
+  com.google.protobuf.ByteString getCurrencyCodeBytes();
+
+  /**
+   *
+   *
+   * <pre>
+   * The decimal value of the transaction in the specified currency.
+   * </pre>
+   *
+   * <code>double value = 5;</code>
+   *
+   * @return The value.
+   */
+  double getValue();
+
+  /**
+   *
+   *
+   * <pre>
+   * The value of shipping in the specified currency. 0 for free or no shipping.
+   * </pre>
+   *
+   * <code>double shipping_value = 12;</code>
+   *
+   * @return The shippingValue.
+   */
+  double getShippingValue();
+
+  /**
+   *
+   *
+   * <pre>
+   * Destination address if this transaction involves shipping a physical item.
+   * </pre>
+   *
+   * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address shipping_address = 6;
+   * </code>
+   *
+   * @return Whether the shippingAddress field is set.
+   */
+  boolean hasShippingAddress();
+  /**
+   *
+   *
+   * <pre>
+   * Destination address if this transaction involves shipping a physical item.
+   * </pre>
+   *
+   * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address shipping_address = 6;
+   * </code>
+   *
+   * @return The shippingAddress.
+   */
+  com.google.recaptchaenterprise.v1beta1.TransactionData.Address getShippingAddress();
+  /**
+   *
+   *
+   * <pre>
+   * Destination address if this transaction involves shipping a physical item.
+   * </pre>
+   *
+   * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address shipping_address = 6;
+   * </code>
+   */
+  com.google.recaptchaenterprise.v1beta1.TransactionData.AddressOrBuilder
+      getShippingAddressOrBuilder();
+
+  /**
+   *
+   *
+   * <pre>
+   * Address associated with the payment method when applicable.
+   * </pre>
+   *
+   * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address billing_address = 7;
+   * </code>
+   *
+   * @return Whether the billingAddress field is set.
+   */
+  boolean hasBillingAddress();
+  /**
+   *
+   *
+   * <pre>
+   * Address associated with the payment method when applicable.
+   * </pre>
+   *
+   * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address billing_address = 7;
+   * </code>
+   *
+   * @return The billingAddress.
+   */
+  com.google.recaptchaenterprise.v1beta1.TransactionData.Address getBillingAddress();
+  /**
+   *
+   *
+   * <pre>
+   * Address associated with the payment method when applicable.
+   * </pre>
+   *
+   * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.Address billing_address = 7;
+   * </code>
+   */
+  com.google.recaptchaenterprise.v1beta1.TransactionData.AddressOrBuilder
+      getBillingAddressOrBuilder();
+
+  /**
+   *
+   *
+   * <pre>
+   * Information about the user paying/initiating the transaction.
+   * </pre>
+   *
+   * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.User user = 8;</code>
+   *
+   * @return Whether the user field is set.
+   */
+  boolean hasUser();
+  /**
+   *
+   *
+   * <pre>
+   * Information about the user paying/initiating the transaction.
+   * </pre>
+   *
+   * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.User user = 8;</code>
+   *
+   * @return The user.
+   */
+  com.google.recaptchaenterprise.v1beta1.TransactionData.User getUser();
+  /**
+   *
+   *
+   * <pre>
+   * Information about the user paying/initiating the transaction.
+   * </pre>
+   *
+   * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.User user = 8;</code>
+   */
+  com.google.recaptchaenterprise.v1beta1.TransactionData.UserOrBuilder getUserOrBuilder();
+
+  /**
+   *
+   *
+   * <pre>
+   * Information about the user or users fulfilling the transaction.
+   * </pre>
+   *
+   * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.User merchants = 13;
+   * </code>
+   */
+  java.util.List<com.google.recaptchaenterprise.v1beta1.TransactionData.User> getMerchantsList();
+  /**
+   *
+   *
+   * <pre>
+   * Information about the user or users fulfilling the transaction.
+   * </pre>
+   *
+   * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.User merchants = 13;
+   * </code>
+   */
+  com.google.recaptchaenterprise.v1beta1.TransactionData.User getMerchants(int index);
+  /**
+   *
+   *
+   * <pre>
+   * Information about the user or users fulfilling the transaction.
+   * </pre>
+   *
+   * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.User merchants = 13;
+   * </code>
+   */
+  int getMerchantsCount();
+  /**
+   *
+   *
+   * <pre>
+   * Information about the user or users fulfilling the transaction.
+   * </pre>
+   *
+   * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.User merchants = 13;
+   * </code>
+   */
+  java.util.List<? extends com.google.recaptchaenterprise.v1beta1.TransactionData.UserOrBuilder>
+      getMerchantsOrBuilderList();
+  /**
+   *
+   *
+   * <pre>
+   * Information about the user or users fulfilling the transaction.
+   * </pre>
+   *
+   * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.User merchants = 13;
+   * </code>
+   */
+  com.google.recaptchaenterprise.v1beta1.TransactionData.UserOrBuilder getMerchantsOrBuilder(
+      int index);
+
+  /**
+   *
+   *
+   * <pre>
+   * Items purchased in this transaction.
+   * </pre>
+   *
+   * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item items = 14;
+   * </code>
+   */
+  java.util.List<com.google.recaptchaenterprise.v1beta1.TransactionData.Item> getItemsList();
+  /**
+   *
+   *
+   * <pre>
+   * Items purchased in this transaction.
+   * </pre>
+   *
+   * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item items = 14;
+   * </code>
+   */
+  com.google.recaptchaenterprise.v1beta1.TransactionData.Item getItems(int index);
+  /**
+   *
+   *
+   * <pre>
+   * Items purchased in this transaction.
+   * </pre>
+   *
+   * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item items = 14;
+   * </code>
+   */
+  int getItemsCount();
+  /**
+   *
+   *
+   * <pre>
+   * Items purchased in this transaction.
+   * </pre>
+   *
+   * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item items = 14;
+   * </code>
+   */
+  java.util.List<? extends com.google.recaptchaenterprise.v1beta1.TransactionData.ItemOrBuilder>
+      getItemsOrBuilderList();
+  /**
+   *
+   *
+   * <pre>
+   * Items purchased in this transaction.
+   * </pre>
+   *
+   * <code>repeated .google.cloud.recaptchaenterprise.v1beta1.TransactionData.Item items = 14;
+   * </code>
+   */
+  com.google.recaptchaenterprise.v1beta1.TransactionData.ItemOrBuilder getItemsOrBuilder(int index);
+
+  /**
+   *
+   *
+   * <pre>
+   * Information about the payment gateway's response to the transaction.
+   * </pre>
+   *
+   * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo gateway_info = 10;
+   * </code>
+   *
+   * @return Whether the gatewayInfo field is set.
+   */
+  boolean hasGatewayInfo();
+  /**
+   *
+   *
+   * <pre>
+   * Information about the payment gateway's response to the transaction.
+   * </pre>
+   *
+   * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo gateway_info = 10;
+   * </code>
+   *
+   * @return The gatewayInfo.
+   */
+  com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo getGatewayInfo();
+  /**
+   *
+   *
+   * <pre>
+   * Information about the payment gateway's response to the transaction.
+   * </pre>
+   *
+   * <code>.google.cloud.recaptchaenterprise.v1beta1.TransactionData.GatewayInfo gateway_info = 10;
+   * </code>
+   */
+  com.google.recaptchaenterprise.v1beta1.TransactionData.GatewayInfoOrBuilder
+      getGatewayInfoOrBuilder();
+}
diff --git a/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/TransactionEvent.java b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/TransactionEvent.java
new file mode 100644
index 000000000000..6532c8b75a17
--- /dev/null
+++ b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/TransactionEvent.java
@@ -0,0 +1,1797 @@
+/*
+ * Copyright 2020 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: google/cloud/recaptchaenterprise/v1beta1/recaptchaenterprise.proto
+
+package com.google.recaptchaenterprise.v1beta1;
+
+/**
+ *
+ *
+ * <pre>
+ * Describes an event in the lifecycle of a payment transaction.
+ * </pre>
+ *
+ * Protobuf type {@code google.cloud.recaptchaenterprise.v1beta1.TransactionEvent}
+ */
+public final class TransactionEvent extends com.google.protobuf.GeneratedMessageV3
+    implements
+    // @@protoc_insertion_point(message_implements:google.cloud.recaptchaenterprise.v1beta1.TransactionEvent)
+    TransactionEventOrBuilder {
+  private static final long serialVersionUID = 0L;
+  // Use TransactionEvent.newBuilder() to construct.
+  private TransactionEvent(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+
+  private TransactionEvent() {
+    eventType_ = 0;
+    reason_ = "";
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(UnusedPrivateParameter unused) {
+    return new TransactionEvent();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
+    return this.unknownFields;
+  }
+
+  public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+    return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+        .internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionEvent_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+        .internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionEvent_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.google.recaptchaenterprise.v1beta1.TransactionEvent.class,
+            com.google.recaptchaenterprise.v1beta1.TransactionEvent.Builder.class);
+  }
+
+  /**
+   *
+   *
+   * <pre>
+   * Enum that represents an event in the payment transaction lifecycle.
+   * </pre>
+   *
+   * Protobuf enum {@code
+   * google.cloud.recaptchaenterprise.v1beta1.TransactionEvent.TransactionEventType}
+   */
+  public enum TransactionEventType implements com.google.protobuf.ProtocolMessageEnum {
+    /**
+     *
+     *
+     * <pre>
+     * Default, unspecified event type.
+     * </pre>
+     *
+     * <code>TRANSACTION_EVENT_TYPE_UNSPECIFIED = 0;</code>
+     */
+    TRANSACTION_EVENT_TYPE_UNSPECIFIED(0),
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the transaction is approved by the merchant. The
+     * accompanying reasons can include terms such as 'INHOUSE', 'ACCERTIFY',
+     * 'CYBERSOURCE', or 'MANUAL_REVIEW'.
+     * </pre>
+     *
+     * <code>MERCHANT_APPROVE = 1;</code>
+     */
+    MERCHANT_APPROVE(1),
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the transaction is denied and concluded due to risks
+     * detected by the merchant. The accompanying reasons can include terms such
+     * as 'INHOUSE',  'ACCERTIFY',  'CYBERSOURCE', or 'MANUAL_REVIEW'.
+     * </pre>
+     *
+     * <code>MERCHANT_DENY = 2;</code>
+     */
+    MERCHANT_DENY(2),
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the transaction is being evaluated by a human, due to
+     * suspicion or risk.
+     * </pre>
+     *
+     * <code>MANUAL_REVIEW = 3;</code>
+     */
+    MANUAL_REVIEW(3),
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the authorization attempt with the card issuer succeeded.
+     * </pre>
+     *
+     * <code>AUTHORIZATION = 4;</code>
+     */
+    AUTHORIZATION(4),
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the authorization attempt with the card issuer failed.
+     * The accompanying reasons can include Visa's '54' indicating that the card
+     * is expired, or '82' indicating that the CVV is incorrect.
+     * </pre>
+     *
+     * <code>AUTHORIZATION_DECLINE = 5;</code>
+     */
+    AUTHORIZATION_DECLINE(5),
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the transaction is completed because the funds were
+     * settled.
+     * </pre>
+     *
+     * <code>PAYMENT_CAPTURE = 6;</code>
+     */
+    PAYMENT_CAPTURE(6),
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the transaction could not be completed because the funds
+     * were not settled.
+     * </pre>
+     *
+     * <code>PAYMENT_CAPTURE_DECLINE = 7;</code>
+     */
+    PAYMENT_CAPTURE_DECLINE(7),
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the transaction has been canceled. Specify the reason
+     * for the cancellation. For example, 'INSUFFICIENT_INVENTORY'.
+     * </pre>
+     *
+     * <code>CANCEL = 8;</code>
+     */
+    CANCEL(8),
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the merchant has received a chargeback inquiry due to
+     * fraud for the transaction, requesting additional information before a
+     * fraud chargeback is officially issued and a formal chargeback
+     * notification is sent.
+     * </pre>
+     *
+     * <code>CHARGEBACK_INQUIRY = 9;</code>
+     */
+    CHARGEBACK_INQUIRY(9),
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the merchant has received a chargeback alert due to fraud
+     * for the transaction. The process of resolving the dispute without
+     * involving the payment network is started.
+     * </pre>
+     *
+     * <code>CHARGEBACK_ALERT = 10;</code>
+     */
+    CHARGEBACK_ALERT(10),
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that a fraud notification is issued for the transaction, sent
+     * by the payment instrument's issuing bank because the transaction appears
+     * to be fraudulent. We recommend including TC40 or SAFE data in the
+     * `reason` field for this event type. For partial chargebacks, we recommend
+     * that you include an amount in the `value` field.
+     * </pre>
+     *
+     * <code>FRAUD_NOTIFICATION = 11;</code>
+     */
+    FRAUD_NOTIFICATION(11),
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the merchant is informed by the payment network that the
+     * transaction has entered the chargeback process due to fraud. Reason code
+     * examples include Discover's '6005' and '6041'. For partial chargebacks,
+     * we recommend that you include an amount in the `value` field.
+     * </pre>
+     *
+     * <code>CHARGEBACK = 12;</code>
+     */
+    CHARGEBACK(12),
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the transaction has entered the chargeback process due to
+     * fraud, and that the merchant has chosen to enter representment. Reason
+     * examples include Discover's '6005' and '6041'. For partial chargebacks,
+     * we recommend that you include an amount in the `value` field.
+     * </pre>
+     *
+     * <code>CHARGEBACK_REPRESENTMENT = 13;</code>
+     */
+    CHARGEBACK_REPRESENTMENT(13),
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the transaction has had a fraud chargeback which was
+     * illegitimate and was reversed as a result. For partial chargebacks, we
+     * recommend that you include an amount in the `value` field.
+     * </pre>
+     *
+     * <code>CHARGEBACK_REVERSE = 14;</code>
+     */
+    CHARGEBACK_REVERSE(14),
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the merchant has received a refund for a completed
+     * transaction. For partial refunds, we recommend that you include an amount
+     * in the `value` field. Reason example: 'TAX_EXEMPT' (partial refund of
+     * exempt tax)
+     * </pre>
+     *
+     * <code>REFUND_REQUEST = 15;</code>
+     */
+    REFUND_REQUEST(15),
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the merchant has received a refund request for this
+     * transaction, but that they have declined it. For partial refunds, we
+     * recommend that you include an amount in the `value` field. Reason
+     * example: 'TAX_EXEMPT' (partial refund of exempt tax)
+     * </pre>
+     *
+     * <code>REFUND_DECLINE = 16;</code>
+     */
+    REFUND_DECLINE(16),
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the completed transaction was refunded by the merchant.
+     * For partial refunds, we recommend that you include an amount in the
+     * `value` field. Reason example: 'TAX_EXEMPT' (partial refund of exempt
+     * tax)
+     * </pre>
+     *
+     * <code>REFUND = 17;</code>
+     */
+    REFUND(17),
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the completed transaction was refunded by the merchant,
+     * and that this refund was reversed. For partial refunds, we recommend that
+     * you include an amount in the `value` field.
+     * </pre>
+     *
+     * <code>REFUND_REVERSE = 18;</code>
+     */
+    REFUND_REVERSE(18),
+    UNRECOGNIZED(-1),
+    ;
+
+    /**
+     *
+     *
+     * <pre>
+     * Default, unspecified event type.
+     * </pre>
+     *
+     * <code>TRANSACTION_EVENT_TYPE_UNSPECIFIED = 0;</code>
+     */
+    public static final int TRANSACTION_EVENT_TYPE_UNSPECIFIED_VALUE = 0;
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the transaction is approved by the merchant. The
+     * accompanying reasons can include terms such as 'INHOUSE', 'ACCERTIFY',
+     * 'CYBERSOURCE', or 'MANUAL_REVIEW'.
+     * </pre>
+     *
+     * <code>MERCHANT_APPROVE = 1;</code>
+     */
+    public static final int MERCHANT_APPROVE_VALUE = 1;
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the transaction is denied and concluded due to risks
+     * detected by the merchant. The accompanying reasons can include terms such
+     * as 'INHOUSE',  'ACCERTIFY',  'CYBERSOURCE', or 'MANUAL_REVIEW'.
+     * </pre>
+     *
+     * <code>MERCHANT_DENY = 2;</code>
+     */
+    public static final int MERCHANT_DENY_VALUE = 2;
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the transaction is being evaluated by a human, due to
+     * suspicion or risk.
+     * </pre>
+     *
+     * <code>MANUAL_REVIEW = 3;</code>
+     */
+    public static final int MANUAL_REVIEW_VALUE = 3;
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the authorization attempt with the card issuer succeeded.
+     * </pre>
+     *
+     * <code>AUTHORIZATION = 4;</code>
+     */
+    public static final int AUTHORIZATION_VALUE = 4;
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the authorization attempt with the card issuer failed.
+     * The accompanying reasons can include Visa's '54' indicating that the card
+     * is expired, or '82' indicating that the CVV is incorrect.
+     * </pre>
+     *
+     * <code>AUTHORIZATION_DECLINE = 5;</code>
+     */
+    public static final int AUTHORIZATION_DECLINE_VALUE = 5;
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the transaction is completed because the funds were
+     * settled.
+     * </pre>
+     *
+     * <code>PAYMENT_CAPTURE = 6;</code>
+     */
+    public static final int PAYMENT_CAPTURE_VALUE = 6;
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the transaction could not be completed because the funds
+     * were not settled.
+     * </pre>
+     *
+     * <code>PAYMENT_CAPTURE_DECLINE = 7;</code>
+     */
+    public static final int PAYMENT_CAPTURE_DECLINE_VALUE = 7;
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the transaction has been canceled. Specify the reason
+     * for the cancellation. For example, 'INSUFFICIENT_INVENTORY'.
+     * </pre>
+     *
+     * <code>CANCEL = 8;</code>
+     */
+    public static final int CANCEL_VALUE = 8;
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the merchant has received a chargeback inquiry due to
+     * fraud for the transaction, requesting additional information before a
+     * fraud chargeback is officially issued and a formal chargeback
+     * notification is sent.
+     * </pre>
+     *
+     * <code>CHARGEBACK_INQUIRY = 9;</code>
+     */
+    public static final int CHARGEBACK_INQUIRY_VALUE = 9;
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the merchant has received a chargeback alert due to fraud
+     * for the transaction. The process of resolving the dispute without
+     * involving the payment network is started.
+     * </pre>
+     *
+     * <code>CHARGEBACK_ALERT = 10;</code>
+     */
+    public static final int CHARGEBACK_ALERT_VALUE = 10;
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that a fraud notification is issued for the transaction, sent
+     * by the payment instrument's issuing bank because the transaction appears
+     * to be fraudulent. We recommend including TC40 or SAFE data in the
+     * `reason` field for this event type. For partial chargebacks, we recommend
+     * that you include an amount in the `value` field.
+     * </pre>
+     *
+     * <code>FRAUD_NOTIFICATION = 11;</code>
+     */
+    public static final int FRAUD_NOTIFICATION_VALUE = 11;
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the merchant is informed by the payment network that the
+     * transaction has entered the chargeback process due to fraud. Reason code
+     * examples include Discover's '6005' and '6041'. For partial chargebacks,
+     * we recommend that you include an amount in the `value` field.
+     * </pre>
+     *
+     * <code>CHARGEBACK = 12;</code>
+     */
+    public static final int CHARGEBACK_VALUE = 12;
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the transaction has entered the chargeback process due to
+     * fraud, and that the merchant has chosen to enter representment. Reason
+     * examples include Discover's '6005' and '6041'. For partial chargebacks,
+     * we recommend that you include an amount in the `value` field.
+     * </pre>
+     *
+     * <code>CHARGEBACK_REPRESENTMENT = 13;</code>
+     */
+    public static final int CHARGEBACK_REPRESENTMENT_VALUE = 13;
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the transaction has had a fraud chargeback which was
+     * illegitimate and was reversed as a result. For partial chargebacks, we
+     * recommend that you include an amount in the `value` field.
+     * </pre>
+     *
+     * <code>CHARGEBACK_REVERSE = 14;</code>
+     */
+    public static final int CHARGEBACK_REVERSE_VALUE = 14;
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the merchant has received a refund for a completed
+     * transaction. For partial refunds, we recommend that you include an amount
+     * in the `value` field. Reason example: 'TAX_EXEMPT' (partial refund of
+     * exempt tax)
+     * </pre>
+     *
+     * <code>REFUND_REQUEST = 15;</code>
+     */
+    public static final int REFUND_REQUEST_VALUE = 15;
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the merchant has received a refund request for this
+     * transaction, but that they have declined it. For partial refunds, we
+     * recommend that you include an amount in the `value` field. Reason
+     * example: 'TAX_EXEMPT' (partial refund of exempt tax)
+     * </pre>
+     *
+     * <code>REFUND_DECLINE = 16;</code>
+     */
+    public static final int REFUND_DECLINE_VALUE = 16;
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the completed transaction was refunded by the merchant.
+     * For partial refunds, we recommend that you include an amount in the
+     * `value` field. Reason example: 'TAX_EXEMPT' (partial refund of exempt
+     * tax)
+     * </pre>
+     *
+     * <code>REFUND = 17;</code>
+     */
+    public static final int REFUND_VALUE = 17;
+    /**
+     *
+     *
+     * <pre>
+     * Indicates that the completed transaction was refunded by the merchant,
+     * and that this refund was reversed. For partial refunds, we recommend that
+     * you include an amount in the `value` field.
+     * </pre>
+     *
+     * <code>REFUND_REVERSE = 18;</code>
+     */
+    public static final int REFUND_REVERSE_VALUE = 18;
+
+    public final int getNumber() {
+      if (this == UNRECOGNIZED) {
+        throw new java.lang.IllegalArgumentException(
+            "Can't get the number of an unknown enum value.");
+      }
+      return value;
+    }
+
+    /**
+     * @param value The numeric wire value of the corresponding enum entry.
+     * @return The enum associated with the given numeric wire value.
+     * @deprecated Use {@link #forNumber(int)} instead.
+     */
+    @java.lang.Deprecated
+    public static TransactionEventType valueOf(int value) {
+      return forNumber(value);
+    }
+
+    /**
+     * @param value The numeric wire value of the corresponding enum entry.
+     * @return The enum associated with the given numeric wire value.
+     */
+    public static TransactionEventType forNumber(int value) {
+      switch (value) {
+        case 0:
+          return TRANSACTION_EVENT_TYPE_UNSPECIFIED;
+        case 1:
+          return MERCHANT_APPROVE;
+        case 2:
+          return MERCHANT_DENY;
+        case 3:
+          return MANUAL_REVIEW;
+        case 4:
+          return AUTHORIZATION;
+        case 5:
+          return AUTHORIZATION_DECLINE;
+        case 6:
+          return PAYMENT_CAPTURE;
+        case 7:
+          return PAYMENT_CAPTURE_DECLINE;
+        case 8:
+          return CANCEL;
+        case 9:
+          return CHARGEBACK_INQUIRY;
+        case 10:
+          return CHARGEBACK_ALERT;
+        case 11:
+          return FRAUD_NOTIFICATION;
+        case 12:
+          return CHARGEBACK;
+        case 13:
+          return CHARGEBACK_REPRESENTMENT;
+        case 14:
+          return CHARGEBACK_REVERSE;
+        case 15:
+          return REFUND_REQUEST;
+        case 16:
+          return REFUND_DECLINE;
+        case 17:
+          return REFUND;
+        case 18:
+          return REFUND_REVERSE;
+        default:
+          return null;
+      }
+    }
+
+    public static com.google.protobuf.Internal.EnumLiteMap<TransactionEventType>
+        internalGetValueMap() {
+      return internalValueMap;
+    }
+
+    private static final com.google.protobuf.Internal.EnumLiteMap<TransactionEventType>
+        internalValueMap =
+            new com.google.protobuf.Internal.EnumLiteMap<TransactionEventType>() {
+              public TransactionEventType findValueByNumber(int number) {
+                return TransactionEventType.forNumber(number);
+              }
+            };
+
+    public final com.google.protobuf.Descriptors.EnumValueDescriptor getValueDescriptor() {
+      if (this == UNRECOGNIZED) {
+        throw new java.lang.IllegalStateException(
+            "Can't get the descriptor of an unrecognized enum value.");
+      }
+      return getDescriptor().getValues().get(ordinal());
+    }
+
+    public final com.google.protobuf.Descriptors.EnumDescriptor getDescriptorForType() {
+      return getDescriptor();
+    }
+
+    public static final com.google.protobuf.Descriptors.EnumDescriptor getDescriptor() {
+      return com.google.recaptchaenterprise.v1beta1.TransactionEvent.getDescriptor()
+          .getEnumTypes()
+          .get(0);
+    }
+
+    private static final TransactionEventType[] VALUES = values();
+
+    public static TransactionEventType valueOf(
+        com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+      if (desc.getType() != getDescriptor()) {
+        throw new java.lang.IllegalArgumentException("EnumValueDescriptor is not for this type.");
+      }
+      if (desc.getIndex() == -1) {
+        return UNRECOGNIZED;
+      }
+      return VALUES[desc.getIndex()];
+    }
+
+    private final int value;
+
+    private TransactionEventType(int value) {
+      this.value = value;
+    }
+
+    // @@protoc_insertion_point(enum_scope:google.cloud.recaptchaenterprise.v1beta1.TransactionEvent.TransactionEventType)
+  }
+
+  public static final int EVENT_TYPE_FIELD_NUMBER = 1;
+  private int eventType_ = 0;
+  /**
+   *
+   *
+   * <pre>
+   * Optional. The type of this transaction event.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.TransactionEvent.TransactionEventType event_type = 1 [(.google.api.field_behavior) = OPTIONAL];
+   * </code>
+   *
+   * @return The enum numeric value on the wire for eventType.
+   */
+  @java.lang.Override
+  public int getEventTypeValue() {
+    return eventType_;
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Optional. The type of this transaction event.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.TransactionEvent.TransactionEventType event_type = 1 [(.google.api.field_behavior) = OPTIONAL];
+   * </code>
+   *
+   * @return The eventType.
+   */
+  @java.lang.Override
+  public com.google.recaptchaenterprise.v1beta1.TransactionEvent.TransactionEventType
+      getEventType() {
+    com.google.recaptchaenterprise.v1beta1.TransactionEvent.TransactionEventType result =
+        com.google.recaptchaenterprise.v1beta1.TransactionEvent.TransactionEventType.forNumber(
+            eventType_);
+    return result == null
+        ? com.google.recaptchaenterprise.v1beta1.TransactionEvent.TransactionEventType.UNRECOGNIZED
+        : result;
+  }
+
+  public static final int REASON_FIELD_NUMBER = 2;
+
+  @SuppressWarnings("serial")
+  private volatile java.lang.Object reason_ = "";
+  /**
+   *
+   *
+   * <pre>
+   * Optional. The reason or standardized code that corresponds with this
+   * transaction event, if one exists. For example, a CHARGEBACK event with code
+   * 6005.
+   * </pre>
+   *
+   * <code>string reason = 2 [(.google.api.field_behavior) = OPTIONAL];</code>
+   *
+   * @return The reason.
+   */
+  @java.lang.Override
+  public java.lang.String getReason() {
+    java.lang.Object ref = reason_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      reason_ = s;
+      return s;
+    }
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Optional. The reason or standardized code that corresponds with this
+   * transaction event, if one exists. For example, a CHARGEBACK event with code
+   * 6005.
+   * </pre>
+   *
+   * <code>string reason = 2 [(.google.api.field_behavior) = OPTIONAL];</code>
+   *
+   * @return The bytes for reason.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString getReasonBytes() {
+    java.lang.Object ref = reason_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b =
+          com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+      reason_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int VALUE_FIELD_NUMBER = 3;
+  private double value_ = 0D;
+  /**
+   *
+   *
+   * <pre>
+   * Optional. The value that corresponds with this transaction event, if one
+   * exists. For example, a refund event where $5.00 was refunded. Currency is
+   * obtained from the original transaction data.
+   * </pre>
+   *
+   * <code>double value = 3 [(.google.api.field_behavior) = OPTIONAL];</code>
+   *
+   * @return The value.
+   */
+  @java.lang.Override
+  public double getValue() {
+    return value_;
+  }
+
+  public static final int EVENT_TIME_FIELD_NUMBER = 4;
+  private com.google.protobuf.Timestamp eventTime_;
+  /**
+   *
+   *
+   * <pre>
+   * Optional. Timestamp when this transaction event occurred; otherwise assumed
+   * to be the time of the API call.
+   * </pre>
+   *
+   * <code>.google.protobuf.Timestamp event_time = 4 [(.google.api.field_behavior) = OPTIONAL];
+   * </code>
+   *
+   * @return Whether the eventTime field is set.
+   */
+  @java.lang.Override
+  public boolean hasEventTime() {
+    return eventTime_ != null;
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Optional. Timestamp when this transaction event occurred; otherwise assumed
+   * to be the time of the API call.
+   * </pre>
+   *
+   * <code>.google.protobuf.Timestamp event_time = 4 [(.google.api.field_behavior) = OPTIONAL];
+   * </code>
+   *
+   * @return The eventTime.
+   */
+  @java.lang.Override
+  public com.google.protobuf.Timestamp getEventTime() {
+    return eventTime_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : eventTime_;
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Optional. Timestamp when this transaction event occurred; otherwise assumed
+   * to be the time of the API call.
+   * </pre>
+   *
+   * <code>.google.protobuf.Timestamp event_time = 4 [(.google.api.field_behavior) = OPTIONAL];
+   * </code>
+   */
+  @java.lang.Override
+  public com.google.protobuf.TimestampOrBuilder getEventTimeOrBuilder() {
+    return eventTime_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : eventTime_;
+  }
+
+  private byte memoizedIsInitialized = -1;
+
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
+    if (eventType_
+        != com.google.recaptchaenterprise.v1beta1.TransactionEvent.TransactionEventType
+            .TRANSACTION_EVENT_TYPE_UNSPECIFIED
+            .getNumber()) {
+      output.writeEnum(1, eventType_);
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(reason_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, reason_);
+    }
+    if (java.lang.Double.doubleToRawLongBits(value_) != 0) {
+      output.writeDouble(3, value_);
+    }
+    if (eventTime_ != null) {
+      output.writeMessage(4, getEventTime());
+    }
+    getUnknownFields().writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (eventType_
+        != com.google.recaptchaenterprise.v1beta1.TransactionEvent.TransactionEventType
+            .TRANSACTION_EVENT_TYPE_UNSPECIFIED
+            .getNumber()) {
+      size += com.google.protobuf.CodedOutputStream.computeEnumSize(1, eventType_);
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(reason_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, reason_);
+    }
+    if (java.lang.Double.doubleToRawLongBits(value_) != 0) {
+      size += com.google.protobuf.CodedOutputStream.computeDoubleSize(3, value_);
+    }
+    if (eventTime_ != null) {
+      size += com.google.protobuf.CodedOutputStream.computeMessageSize(4, getEventTime());
+    }
+    size += getUnknownFields().getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+      return true;
+    }
+    if (!(obj instanceof com.google.recaptchaenterprise.v1beta1.TransactionEvent)) {
+      return super.equals(obj);
+    }
+    com.google.recaptchaenterprise.v1beta1.TransactionEvent other =
+        (com.google.recaptchaenterprise.v1beta1.TransactionEvent) obj;
+
+    if (eventType_ != other.eventType_) return false;
+    if (!getReason().equals(other.getReason())) return false;
+    if (java.lang.Double.doubleToLongBits(getValue())
+        != java.lang.Double.doubleToLongBits(other.getValue())) return false;
+    if (hasEventTime() != other.hasEventTime()) return false;
+    if (hasEventTime()) {
+      if (!getEventTime().equals(other.getEventTime())) return false;
+    }
+    if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    hash = (37 * hash) + EVENT_TYPE_FIELD_NUMBER;
+    hash = (53 * hash) + eventType_;
+    hash = (37 * hash) + REASON_FIELD_NUMBER;
+    hash = (53 * hash) + getReason().hashCode();
+    hash = (37 * hash) + VALUE_FIELD_NUMBER;
+    hash =
+        (53 * hash)
+            + com.google.protobuf.Internal.hashLong(java.lang.Double.doubleToLongBits(getValue()));
+    if (hasEventTime()) {
+      hash = (37 * hash) + EVENT_TIME_FIELD_NUMBER;
+      hash = (53 * hash) + getEventTime().hashCode();
+    }
+    hash = (29 * hash) + getUnknownFields().hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.TransactionEvent parseFrom(
+      java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.TransactionEvent parseFrom(
+      java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.TransactionEvent parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.TransactionEvent parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.TransactionEvent parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.TransactionEvent parseFrom(
+      byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.TransactionEvent parseFrom(
+      java.io.InputStream input) throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.TransactionEvent parseFrom(
+      java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3.parseWithIOException(
+        PARSER, input, extensionRegistry);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.TransactionEvent parseDelimitedFrom(
+      java.io.InputStream input) throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.TransactionEvent parseDelimitedFrom(
+      java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(
+        PARSER, input, extensionRegistry);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.TransactionEvent parseFrom(
+      com.google.protobuf.CodedInputStream input) throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.TransactionEvent parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3.parseWithIOException(
+        PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() {
+    return newBuilder();
+  }
+
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+
+  public static Builder newBuilder(
+      com.google.recaptchaenterprise.v1beta1.TransactionEvent prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   *
+   *
+   * <pre>
+   * Describes an event in the lifecycle of a payment transaction.
+   * </pre>
+   *
+   * Protobuf type {@code google.cloud.recaptchaenterprise.v1beta1.TransactionEvent}
+   */
+  public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder<Builder>
+      implements
+      // @@protoc_insertion_point(builder_implements:google.cloud.recaptchaenterprise.v1beta1.TransactionEvent)
+      com.google.recaptchaenterprise.v1beta1.TransactionEventOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+      return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+          .internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionEvent_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+          .internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionEvent_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.google.recaptchaenterprise.v1beta1.TransactionEvent.class,
+              com.google.recaptchaenterprise.v1beta1.TransactionEvent.Builder.class);
+    }
+
+    // Construct using com.google.recaptchaenterprise.v1beta1.TransactionEvent.newBuilder()
+    private Builder() {}
+
+    private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+    }
+
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      bitField0_ = 0;
+      eventType_ = 0;
+      reason_ = "";
+      value_ = 0D;
+      eventTime_ = null;
+      if (eventTimeBuilder_ != null) {
+        eventTimeBuilder_.dispose();
+        eventTimeBuilder_ = null;
+      }
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+      return com.google.recaptchaenterprise.v1beta1.RecaptchaEnterpriseProto
+          .internal_static_google_cloud_recaptchaenterprise_v1beta1_TransactionEvent_descriptor;
+    }
+
+    @java.lang.Override
+    public com.google.recaptchaenterprise.v1beta1.TransactionEvent getDefaultInstanceForType() {
+      return com.google.recaptchaenterprise.v1beta1.TransactionEvent.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.google.recaptchaenterprise.v1beta1.TransactionEvent build() {
+      com.google.recaptchaenterprise.v1beta1.TransactionEvent result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.google.recaptchaenterprise.v1beta1.TransactionEvent buildPartial() {
+      com.google.recaptchaenterprise.v1beta1.TransactionEvent result =
+          new com.google.recaptchaenterprise.v1beta1.TransactionEvent(this);
+      if (bitField0_ != 0) {
+        buildPartial0(result);
+      }
+      onBuilt();
+      return result;
+    }
+
+    private void buildPartial0(com.google.recaptchaenterprise.v1beta1.TransactionEvent result) {
+      int from_bitField0_ = bitField0_;
+      if (((from_bitField0_ & 0x00000001) != 0)) {
+        result.eventType_ = eventType_;
+      }
+      if (((from_bitField0_ & 0x00000002) != 0)) {
+        result.reason_ = reason_;
+      }
+      if (((from_bitField0_ & 0x00000004) != 0)) {
+        result.value_ = value_;
+      }
+      if (((from_bitField0_ & 0x00000008) != 0)) {
+        result.eventTime_ = eventTimeBuilder_ == null ? eventTime_ : eventTimeBuilder_.build();
+      }
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+      return super.setField(field, value);
+    }
+
+    @java.lang.Override
+    public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+
+    @java.lang.Override
+    public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.google.recaptchaenterprise.v1beta1.TransactionEvent) {
+        return mergeFrom((com.google.recaptchaenterprise.v1beta1.TransactionEvent) other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.google.recaptchaenterprise.v1beta1.TransactionEvent other) {
+      if (other == com.google.recaptchaenterprise.v1beta1.TransactionEvent.getDefaultInstance())
+        return this;
+      if (other.eventType_ != 0) {
+        setEventTypeValue(other.getEventTypeValue());
+      }
+      if (!other.getReason().isEmpty()) {
+        reason_ = other.reason_;
+        bitField0_ |= 0x00000002;
+        onChanged();
+      }
+      if (other.getValue() != 0D) {
+        setValue(other.getValue());
+      }
+      if (other.hasEventTime()) {
+        mergeEventTime(other.getEventTime());
+      }
+      this.mergeUnknownFields(other.getUnknownFields());
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
+      }
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 8:
+              {
+                eventType_ = input.readEnum();
+                bitField0_ |= 0x00000001;
+                break;
+              } // case 8
+            case 18:
+              {
+                reason_ = input.readStringRequireUtf8();
+                bitField0_ |= 0x00000002;
+                break;
+              } // case 18
+            case 25:
+              {
+                value_ = input.readDouble();
+                bitField0_ |= 0x00000004;
+                break;
+              } // case 25
+            case 34:
+              {
+                input.readMessage(getEventTimeFieldBuilder().getBuilder(), extensionRegistry);
+                bitField0_ |= 0x00000008;
+                break;
+              } // case 34
+            default:
+              {
+                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                  done = true; // was an endgroup tag
+                }
+                break;
+              } // default:
+          } // switch (tag)
+        } // while (!done)
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.unwrapIOException();
+      } finally {
+        onChanged();
+      } // finally
+      return this;
+    }
+
+    private int bitField0_;
+
+    private int eventType_ = 0;
+    /**
+     *
+     *
+     * <pre>
+     * Optional. The type of this transaction event.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.TransactionEvent.TransactionEventType event_type = 1 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     *
+     * @return The enum numeric value on the wire for eventType.
+     */
+    @java.lang.Override
+    public int getEventTypeValue() {
+      return eventType_;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. The type of this transaction event.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.TransactionEvent.TransactionEventType event_type = 1 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     *
+     * @param value The enum numeric value on the wire for eventType to set.
+     * @return This builder for chaining.
+     */
+    public Builder setEventTypeValue(int value) {
+      eventType_ = value;
+      bitField0_ |= 0x00000001;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. The type of this transaction event.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.TransactionEvent.TransactionEventType event_type = 1 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     *
+     * @return The eventType.
+     */
+    @java.lang.Override
+    public com.google.recaptchaenterprise.v1beta1.TransactionEvent.TransactionEventType
+        getEventType() {
+      com.google.recaptchaenterprise.v1beta1.TransactionEvent.TransactionEventType result =
+          com.google.recaptchaenterprise.v1beta1.TransactionEvent.TransactionEventType.forNumber(
+              eventType_);
+      return result == null
+          ? com.google.recaptchaenterprise.v1beta1.TransactionEvent.TransactionEventType
+              .UNRECOGNIZED
+          : result;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. The type of this transaction event.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.TransactionEvent.TransactionEventType event_type = 1 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     *
+     * @param value The eventType to set.
+     * @return This builder for chaining.
+     */
+    public Builder setEventType(
+        com.google.recaptchaenterprise.v1beta1.TransactionEvent.TransactionEventType value) {
+      if (value == null) {
+        throw new NullPointerException();
+      }
+      bitField0_ |= 0x00000001;
+      eventType_ = value.getNumber();
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. The type of this transaction event.
+     * </pre>
+     *
+     * <code>
+     * .google.cloud.recaptchaenterprise.v1beta1.TransactionEvent.TransactionEventType event_type = 1 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     *
+     * @return This builder for chaining.
+     */
+    public Builder clearEventType() {
+      bitField0_ = (bitField0_ & ~0x00000001);
+      eventType_ = 0;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object reason_ = "";
+    /**
+     *
+     *
+     * <pre>
+     * Optional. The reason or standardized code that corresponds with this
+     * transaction event, if one exists. For example, a CHARGEBACK event with code
+     * 6005.
+     * </pre>
+     *
+     * <code>string reason = 2 [(.google.api.field_behavior) = OPTIONAL];</code>
+     *
+     * @return The reason.
+     */
+    public java.lang.String getReason() {
+      java.lang.Object ref = reason_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        reason_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. The reason or standardized code that corresponds with this
+     * transaction event, if one exists. For example, a CHARGEBACK event with code
+     * 6005.
+     * </pre>
+     *
+     * <code>string reason = 2 [(.google.api.field_behavior) = OPTIONAL];</code>
+     *
+     * @return The bytes for reason.
+     */
+    public com.google.protobuf.ByteString getReasonBytes() {
+      java.lang.Object ref = reason_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b =
+            com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+        reason_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. The reason or standardized code that corresponds with this
+     * transaction event, if one exists. For example, a CHARGEBACK event with code
+     * 6005.
+     * </pre>
+     *
+     * <code>string reason = 2 [(.google.api.field_behavior) = OPTIONAL];</code>
+     *
+     * @param value The reason to set.
+     * @return This builder for chaining.
+     */
+    public Builder setReason(java.lang.String value) {
+      if (value == null) {
+        throw new NullPointerException();
+      }
+      reason_ = value;
+      bitField0_ |= 0x00000002;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. The reason or standardized code that corresponds with this
+     * transaction event, if one exists. For example, a CHARGEBACK event with code
+     * 6005.
+     * </pre>
+     *
+     * <code>string reason = 2 [(.google.api.field_behavior) = OPTIONAL];</code>
+     *
+     * @return This builder for chaining.
+     */
+    public Builder clearReason() {
+      reason_ = getDefaultInstance().getReason();
+      bitField0_ = (bitField0_ & ~0x00000002);
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. The reason or standardized code that corresponds with this
+     * transaction event, if one exists. For example, a CHARGEBACK event with code
+     * 6005.
+     * </pre>
+     *
+     * <code>string reason = 2 [(.google.api.field_behavior) = OPTIONAL];</code>
+     *
+     * @param value The bytes for reason to set.
+     * @return This builder for chaining.
+     */
+    public Builder setReasonBytes(com.google.protobuf.ByteString value) {
+      if (value == null) {
+        throw new NullPointerException();
+      }
+      checkByteStringIsUtf8(value);
+      reason_ = value;
+      bitField0_ |= 0x00000002;
+      onChanged();
+      return this;
+    }
+
+    private double value_;
+    /**
+     *
+     *
+     * <pre>
+     * Optional. The value that corresponds with this transaction event, if one
+     * exists. For example, a refund event where $5.00 was refunded. Currency is
+     * obtained from the original transaction data.
+     * </pre>
+     *
+     * <code>double value = 3 [(.google.api.field_behavior) = OPTIONAL];</code>
+     *
+     * @return The value.
+     */
+    @java.lang.Override
+    public double getValue() {
+      return value_;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. The value that corresponds with this transaction event, if one
+     * exists. For example, a refund event where $5.00 was refunded. Currency is
+     * obtained from the original transaction data.
+     * </pre>
+     *
+     * <code>double value = 3 [(.google.api.field_behavior) = OPTIONAL];</code>
+     *
+     * @param value The value to set.
+     * @return This builder for chaining.
+     */
+    public Builder setValue(double value) {
+
+      value_ = value;
+      bitField0_ |= 0x00000004;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. The value that corresponds with this transaction event, if one
+     * exists. For example, a refund event where $5.00 was refunded. Currency is
+     * obtained from the original transaction data.
+     * </pre>
+     *
+     * <code>double value = 3 [(.google.api.field_behavior) = OPTIONAL];</code>
+     *
+     * @return This builder for chaining.
+     */
+    public Builder clearValue() {
+      bitField0_ = (bitField0_ & ~0x00000004);
+      value_ = 0D;
+      onChanged();
+      return this;
+    }
+
+    private com.google.protobuf.Timestamp eventTime_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+            com.google.protobuf.Timestamp,
+            com.google.protobuf.Timestamp.Builder,
+            com.google.protobuf.TimestampOrBuilder>
+        eventTimeBuilder_;
+    /**
+     *
+     *
+     * <pre>
+     * Optional. Timestamp when this transaction event occurred; otherwise assumed
+     * to be the time of the API call.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp event_time = 4 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     *
+     * @return Whether the eventTime field is set.
+     */
+    public boolean hasEventTime() {
+      return ((bitField0_ & 0x00000008) != 0);
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. Timestamp when this transaction event occurred; otherwise assumed
+     * to be the time of the API call.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp event_time = 4 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     *
+     * @return The eventTime.
+     */
+    public com.google.protobuf.Timestamp getEventTime() {
+      if (eventTimeBuilder_ == null) {
+        return eventTime_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : eventTime_;
+      } else {
+        return eventTimeBuilder_.getMessage();
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. Timestamp when this transaction event occurred; otherwise assumed
+     * to be the time of the API call.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp event_time = 4 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     */
+    public Builder setEventTime(com.google.protobuf.Timestamp value) {
+      if (eventTimeBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        eventTime_ = value;
+      } else {
+        eventTimeBuilder_.setMessage(value);
+      }
+      bitField0_ |= 0x00000008;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. Timestamp when this transaction event occurred; otherwise assumed
+     * to be the time of the API call.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp event_time = 4 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     */
+    public Builder setEventTime(com.google.protobuf.Timestamp.Builder builderForValue) {
+      if (eventTimeBuilder_ == null) {
+        eventTime_ = builderForValue.build();
+      } else {
+        eventTimeBuilder_.setMessage(builderForValue.build());
+      }
+      bitField0_ |= 0x00000008;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. Timestamp when this transaction event occurred; otherwise assumed
+     * to be the time of the API call.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp event_time = 4 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     */
+    public Builder mergeEventTime(com.google.protobuf.Timestamp value) {
+      if (eventTimeBuilder_ == null) {
+        if (((bitField0_ & 0x00000008) != 0)
+            && eventTime_ != null
+            && eventTime_ != com.google.protobuf.Timestamp.getDefaultInstance()) {
+          getEventTimeBuilder().mergeFrom(value);
+        } else {
+          eventTime_ = value;
+        }
+      } else {
+        eventTimeBuilder_.mergeFrom(value);
+      }
+      bitField0_ |= 0x00000008;
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. Timestamp when this transaction event occurred; otherwise assumed
+     * to be the time of the API call.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp event_time = 4 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     */
+    public Builder clearEventTime() {
+      bitField0_ = (bitField0_ & ~0x00000008);
+      eventTime_ = null;
+      if (eventTimeBuilder_ != null) {
+        eventTimeBuilder_.dispose();
+        eventTimeBuilder_ = null;
+      }
+      onChanged();
+      return this;
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. Timestamp when this transaction event occurred; otherwise assumed
+     * to be the time of the API call.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp event_time = 4 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     */
+    public com.google.protobuf.Timestamp.Builder getEventTimeBuilder() {
+      bitField0_ |= 0x00000008;
+      onChanged();
+      return getEventTimeFieldBuilder().getBuilder();
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. Timestamp when this transaction event occurred; otherwise assumed
+     * to be the time of the API call.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp event_time = 4 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     */
+    public com.google.protobuf.TimestampOrBuilder getEventTimeOrBuilder() {
+      if (eventTimeBuilder_ != null) {
+        return eventTimeBuilder_.getMessageOrBuilder();
+      } else {
+        return eventTime_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : eventTime_;
+      }
+    }
+    /**
+     *
+     *
+     * <pre>
+     * Optional. Timestamp when this transaction event occurred; otherwise assumed
+     * to be the time of the API call.
+     * </pre>
+     *
+     * <code>.google.protobuf.Timestamp event_time = 4 [(.google.api.field_behavior) = OPTIONAL];
+     * </code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+            com.google.protobuf.Timestamp,
+            com.google.protobuf.Timestamp.Builder,
+            com.google.protobuf.TimestampOrBuilder>
+        getEventTimeFieldBuilder() {
+      if (eventTimeBuilder_ == null) {
+        eventTimeBuilder_ =
+            new com.google.protobuf.SingleFieldBuilderV3<
+                com.google.protobuf.Timestamp,
+                com.google.protobuf.Timestamp.Builder,
+                com.google.protobuf.TimestampOrBuilder>(
+                getEventTime(), getParentForChildren(), isClean());
+        eventTime_ = null;
+      }
+      return eventTimeBuilder_;
+    }
+
+    @java.lang.Override
+    public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+    // @@protoc_insertion_point(builder_scope:google.cloud.recaptchaenterprise.v1beta1.TransactionEvent)
+  }
+
+  // @@protoc_insertion_point(class_scope:google.cloud.recaptchaenterprise.v1beta1.TransactionEvent)
+  private static final com.google.recaptchaenterprise.v1beta1.TransactionEvent DEFAULT_INSTANCE;
+
+  static {
+    DEFAULT_INSTANCE = new com.google.recaptchaenterprise.v1beta1.TransactionEvent();
+  }
+
+  public static com.google.recaptchaenterprise.v1beta1.TransactionEvent getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<TransactionEvent> PARSER =
+      new com.google.protobuf.AbstractParser<TransactionEvent>() {
+        @java.lang.Override
+        public TransactionEvent parsePartialFrom(
+            com.google.protobuf.CodedInputStream input,
+            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+            throws com.google.protobuf.InvalidProtocolBufferException {
+          Builder builder = newBuilder();
+          try {
+            builder.mergeFrom(input, extensionRegistry);
+          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+            throw e.setUnfinishedMessage(builder.buildPartial());
+          } catch (com.google.protobuf.UninitializedMessageException e) {
+            throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+          } catch (java.io.IOException e) {
+            throw new com.google.protobuf.InvalidProtocolBufferException(e)
+                .setUnfinishedMessage(builder.buildPartial());
+          }
+          return builder.buildPartial();
+        }
+      };
+
+  public static com.google.protobuf.Parser<TransactionEvent> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<TransactionEvent> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.recaptchaenterprise.v1beta1.TransactionEvent getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+}
diff --git a/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/TransactionEventOrBuilder.java b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/TransactionEventOrBuilder.java
new file mode 100644
index 000000000000..ebed92f03e66
--- /dev/null
+++ b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/java/com/google/recaptchaenterprise/v1beta1/TransactionEventOrBuilder.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright 2020 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: google/cloud/recaptchaenterprise/v1beta1/recaptchaenterprise.proto
+
+package com.google.recaptchaenterprise.v1beta1;
+
+public interface TransactionEventOrBuilder
+    extends
+    // @@protoc_insertion_point(interface_extends:google.cloud.recaptchaenterprise.v1beta1.TransactionEvent)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   *
+   *
+   * <pre>
+   * Optional. The type of this transaction event.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.TransactionEvent.TransactionEventType event_type = 1 [(.google.api.field_behavior) = OPTIONAL];
+   * </code>
+   *
+   * @return The enum numeric value on the wire for eventType.
+   */
+  int getEventTypeValue();
+  /**
+   *
+   *
+   * <pre>
+   * Optional. The type of this transaction event.
+   * </pre>
+   *
+   * <code>
+   * .google.cloud.recaptchaenterprise.v1beta1.TransactionEvent.TransactionEventType event_type = 1 [(.google.api.field_behavior) = OPTIONAL];
+   * </code>
+   *
+   * @return The eventType.
+   */
+  com.google.recaptchaenterprise.v1beta1.TransactionEvent.TransactionEventType getEventType();
+
+  /**
+   *
+   *
+   * <pre>
+   * Optional. The reason or standardized code that corresponds with this
+   * transaction event, if one exists. For example, a CHARGEBACK event with code
+   * 6005.
+   * </pre>
+   *
+   * <code>string reason = 2 [(.google.api.field_behavior) = OPTIONAL];</code>
+   *
+   * @return The reason.
+   */
+  java.lang.String getReason();
+  /**
+   *
+   *
+   * <pre>
+   * Optional. The reason or standardized code that corresponds with this
+   * transaction event, if one exists. For example, a CHARGEBACK event with code
+   * 6005.
+   * </pre>
+   *
+   * <code>string reason = 2 [(.google.api.field_behavior) = OPTIONAL];</code>
+   *
+   * @return The bytes for reason.
+   */
+  com.google.protobuf.ByteString getReasonBytes();
+
+  /**
+   *
+   *
+   * <pre>
+   * Optional. The value that corresponds with this transaction event, if one
+   * exists. For example, a refund event where $5.00 was refunded. Currency is
+   * obtained from the original transaction data.
+   * </pre>
+   *
+   * <code>double value = 3 [(.google.api.field_behavior) = OPTIONAL];</code>
+   *
+   * @return The value.
+   */
+  double getValue();
+
+  /**
+   *
+   *
+   * <pre>
+   * Optional. Timestamp when this transaction event occurred; otherwise assumed
+   * to be the time of the API call.
+   * </pre>
+   *
+   * <code>.google.protobuf.Timestamp event_time = 4 [(.google.api.field_behavior) = OPTIONAL];
+   * </code>
+   *
+   * @return Whether the eventTime field is set.
+   */
+  boolean hasEventTime();
+  /**
+   *
+   *
+   * <pre>
+   * Optional. Timestamp when this transaction event occurred; otherwise assumed
+   * to be the time of the API call.
+   * </pre>
+   *
+   * <code>.google.protobuf.Timestamp event_time = 4 [(.google.api.field_behavior) = OPTIONAL];
+   * </code>
+   *
+   * @return The eventTime.
+   */
+  com.google.protobuf.Timestamp getEventTime();
+  /**
+   *
+   *
+   * <pre>
+   * Optional. Timestamp when this transaction event occurred; otherwise assumed
+   * to be the time of the API call.
+   * </pre>
+   *
+   * <code>.google.protobuf.Timestamp event_time = 4 [(.google.api.field_behavior) = OPTIONAL];
+   * </code>
+   */
+  com.google.protobuf.TimestampOrBuilder getEventTimeOrBuilder();
+}
diff --git a/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/proto/google/cloud/recaptchaenterprise/v1beta1/recaptchaenterprise.proto b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/proto/google/cloud/recaptchaenterprise/v1beta1/recaptchaenterprise.proto
index ba7aaaa6a91f..f2d83af23914 100644
--- a/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/proto/google/cloud/recaptchaenterprise/v1beta1/recaptchaenterprise.proto
+++ b/java-recaptchaenterprise/proto-google-cloud-recaptchaenterprise-v1beta1/src/main/proto/google/cloud/recaptchaenterprise/v1beta1/recaptchaenterprise.proto
@@ -1,4 +1,4 @@
-// Copyright 2022 Google LLC
+// Copyright 2023 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -34,7 +34,8 @@ option ruby_package = "Google::Cloud::RecaptchaEnterprise::V1beta1";
 // Service to determine the likelihood an event is legitimate.
 service RecaptchaEnterpriseServiceV1Beta1 {
   option (google.api.default_host) = "recaptchaenterprise.googleapis.com";
-  option (google.api.oauth_scopes) = "https://www.googleapis.com/auth/cloud-platform";
+  option (google.api.oauth_scopes) =
+      "https://www.googleapis.com/auth/cloud-platform";
 
   // Creates an Assessment of the likelihood an event is legitimate.
   rpc CreateAssessment(CreateAssessmentRequest) returns (Assessment) {
@@ -47,7 +48,8 @@ service RecaptchaEnterpriseServiceV1Beta1 {
 
   // Annotates a previously created Assessment to provide additional information
   // on whether the event turned out to be authentic or fradulent.
-  rpc AnnotateAssessment(AnnotateAssessmentRequest) returns (AnnotateAssessmentResponse) {
+  rpc AnnotateAssessment(AnnotateAssessmentRequest)
+      returns (AnnotateAssessmentResponse) {
     option (google.api.http) = {
       post: "/v1beta1/{name=projects/*/assessments/*}:annotate"
       body: "*"
@@ -71,6 +73,125 @@ message CreateAssessmentRequest {
   Assessment assessment = 2 [(google.api.field_behavior) = REQUIRED];
 }
 
+// Describes an event in the lifecycle of a payment transaction.
+message TransactionEvent {
+  // Enum that represents an event in the payment transaction lifecycle.
+  enum TransactionEventType {
+    // Default, unspecified event type.
+    TRANSACTION_EVENT_TYPE_UNSPECIFIED = 0;
+
+    // Indicates that the transaction is approved by the merchant. The
+    // accompanying reasons can include terms such as 'INHOUSE', 'ACCERTIFY',
+    // 'CYBERSOURCE', or 'MANUAL_REVIEW'.
+    MERCHANT_APPROVE = 1;
+
+    // Indicates that the transaction is denied and concluded due to risks
+    // detected by the merchant. The accompanying reasons can include terms such
+    // as 'INHOUSE',  'ACCERTIFY',  'CYBERSOURCE', or 'MANUAL_REVIEW'.
+    MERCHANT_DENY = 2;
+
+    // Indicates that the transaction is being evaluated by a human, due to
+    // suspicion or risk.
+    MANUAL_REVIEW = 3;
+
+    // Indicates that the authorization attempt with the card issuer succeeded.
+    AUTHORIZATION = 4;
+
+    // Indicates that the authorization attempt with the card issuer failed.
+    // The accompanying reasons can include Visa's '54' indicating that the card
+    // is expired, or '82' indicating that the CVV is incorrect.
+    AUTHORIZATION_DECLINE = 5;
+
+    // Indicates that the transaction is completed because the funds were
+    // settled.
+    PAYMENT_CAPTURE = 6;
+
+    // Indicates that the transaction could not be completed because the funds
+    // were not settled.
+    PAYMENT_CAPTURE_DECLINE = 7;
+
+    // Indicates that the transaction has been canceled. Specify the reason
+    // for the cancellation. For example, 'INSUFFICIENT_INVENTORY'.
+    CANCEL = 8;
+
+    // Indicates that the merchant has received a chargeback inquiry due to
+    // fraud for the transaction, requesting additional information before a
+    // fraud chargeback is officially issued and a formal chargeback
+    // notification is sent.
+    CHARGEBACK_INQUIRY = 9;
+
+    // Indicates that the merchant has received a chargeback alert due to fraud
+    // for the transaction. The process of resolving the dispute without
+    // involving the payment network is started.
+    CHARGEBACK_ALERT = 10;
+
+    // Indicates that a fraud notification is issued for the transaction, sent
+    // by the payment instrument's issuing bank because the transaction appears
+    // to be fraudulent. We recommend including TC40 or SAFE data in the
+    // `reason` field for this event type. For partial chargebacks, we recommend
+    // that you include an amount in the `value` field.
+    FRAUD_NOTIFICATION = 11;
+
+    // Indicates that the merchant is informed by the payment network that the
+    // transaction has entered the chargeback process due to fraud. Reason code
+    // examples include Discover's '6005' and '6041'. For partial chargebacks,
+    // we recommend that you include an amount in the `value` field.
+    CHARGEBACK = 12;
+
+    // Indicates that the transaction has entered the chargeback process due to
+    // fraud, and that the merchant has chosen to enter representment. Reason
+    // examples include Discover's '6005' and '6041'. For partial chargebacks,
+    // we recommend that you include an amount in the `value` field.
+    CHARGEBACK_REPRESENTMENT = 13;
+
+    // Indicates that the transaction has had a fraud chargeback which was
+    // illegitimate and was reversed as a result. For partial chargebacks, we
+    // recommend that you include an amount in the `value` field.
+    CHARGEBACK_REVERSE = 14;
+
+    // Indicates that the merchant has received a refund for a completed
+    // transaction. For partial refunds, we recommend that you include an amount
+    // in the `value` field. Reason example: 'TAX_EXEMPT' (partial refund of
+    // exempt tax)
+    REFUND_REQUEST = 15;
+
+    // Indicates that the merchant has received a refund request for this
+    // transaction, but that they have declined it. For partial refunds, we
+    // recommend that you include an amount in the `value` field. Reason
+    // example: 'TAX_EXEMPT' (partial refund of exempt tax)
+    REFUND_DECLINE = 16;
+
+    // Indicates that the completed transaction was refunded by the merchant.
+    // For partial refunds, we recommend that you include an amount in the
+    // `value` field. Reason example: 'TAX_EXEMPT' (partial refund of exempt
+    // tax)
+    REFUND = 17;
+
+    // Indicates that the completed transaction was refunded by the merchant,
+    // and that this refund was reversed. For partial refunds, we recommend that
+    // you include an amount in the `value` field.
+    REFUND_REVERSE = 18;
+  }
+
+  // Optional. The type of this transaction event.
+  TransactionEventType event_type = 1 [(google.api.field_behavior) = OPTIONAL];
+
+  // Optional. The reason or standardized code that corresponds with this
+  // transaction event, if one exists. For example, a CHARGEBACK event with code
+  // 6005.
+  string reason = 2 [(google.api.field_behavior) = OPTIONAL];
+
+  // Optional. The value that corresponds with this transaction event, if one
+  // exists. For example, a refund event where $5.00 was refunded. Currency is
+  // obtained from the original transaction data.
+  double value = 3 [(google.api.field_behavior) = OPTIONAL];
+
+  // Optional. Timestamp when this transaction event occurred; otherwise assumed
+  // to be the time of the API call.
+  google.protobuf.Timestamp event_time = 4
+      [(google.api.field_behavior) = OPTIONAL];
+}
+
 // The request message to annotate an Assessment.
 message AnnotateAssessmentRequest {
   // Enum that represents the types of annotations.
@@ -100,21 +221,38 @@ message AnnotateAssessmentRequest {
     // Default unspecified reason.
     REASON_UNSPECIFIED = 0;
 
-    // Indicates a chargeback issued for the transaction with no other details.
-    // When possible, specify the type by using CHARGEBACK_FRAUD or
+    // Indicates that the transaction had a chargeback issued with no other
+    // details. When possible, specify the type by using CHARGEBACK_FRAUD or
     // CHARGEBACK_DISPUTE instead.
     CHARGEBACK = 1;
 
-    // Indicates a chargeback related to an alleged unauthorized transaction
-    // from the cardholder's perspective (for example, the card number was
-    // stolen).
+    // Indicates that the transaction had a chargeback issued related to an
+    // alleged unauthorized transaction from the cardholder's perspective (for
+    // example, the card number was stolen).
     CHARGEBACK_FRAUD = 8;
 
-    // Indicates a chargeback related to the cardholder having provided their
-    // card details but allegedly not being satisfied with the purchase
-    // (for example, misrepresentation, attempted cancellation).
+    // Indicates that the transaction had a chargeback issued related to the
+    // cardholder having provided their card details but allegedly not being
+    // satisfied with the purchase (for example, misrepresentation, attempted
+    // cancellation).
     CHARGEBACK_DISPUTE = 9;
 
+    // Indicates that the completed payment transaction was refunded by the
+    // seller.
+    REFUND = 10;
+
+    // Indicates that the completed payment transaction was determined to be
+    // fraudulent by the seller, and was cancelled and refunded as a result.
+    REFUND_FRAUD = 11;
+
+    // Indicates that the payment transaction was accepted, and the user was
+    // charged.
+    TRANSACTION_ACCEPTED = 12;
+
+    // Indicates that the payment transaction was declined, for example due to
+    // invalid card details.
+    TRANSACTION_DECLINED = 13;
+
     // Indicates the transaction associated with the assessment is suspected of
     // being fraudulent based on the payment method, billing details, shipping
     // address or other transaction information.
@@ -137,6 +275,10 @@ message AnnotateAssessmentRequest {
 
     // Indicates the user provided an incorrect password.
     INCORRECT_PASSWORD = 6;
+
+    // Indicates that the user sent unwanted and abusive messages to other users
+    // of the platform, such as spam, scams, phishing, or social engineering.
+    SOCIAL_SPAM = 14;
   }
 
   // Required. The resource name of the Assessment, in the format
@@ -148,43 +290,48 @@ message AnnotateAssessmentRequest {
     }
   ];
 
-  // Optional. The annotation that will be assigned to the Event. This field can be left
-  // empty to provide reasons that apply to an event without concluding whether
-  // the event is legitimate or fraudulent.
+  // Optional. The annotation that will be assigned to the Event. This field can
+  // be left empty to provide reasons that apply to an event without concluding
+  // whether the event is legitimate or fraudulent.
   Annotation annotation = 2 [(google.api.field_behavior) = OPTIONAL];
 
-  // Optional. Optional reasons for the annotation that will be assigned to the Event.
+  // Optional. Optional reasons for the annotation that will be assigned to the
+  // Event.
   repeated Reason reasons = 3 [(google.api.field_behavior) = OPTIONAL];
 
-  // Optional. Optional unique stable hashed user identifier to apply to the assessment.
-  // This is an alternative to setting the hashed_account_id in
+  // Optional. Optional unique stable hashed user identifier to apply to the
+  // assessment. This is an alternative to setting the hashed_account_id in
   // CreateAssessment, for example when the account identifier is not yet known
   // in the initial request. It is recommended that the identifier is hashed
   // using hmac-sha256 with stable secret.
   bytes hashed_account_id = 4 [(google.api.field_behavior) = OPTIONAL];
+
+  // Optional. If the assessment is part of a payment transaction, provide
+  // details on payment lifecycle events that occur in the transaction.
+  TransactionEvent transaction_event = 5
+      [(google.api.field_behavior) = OPTIONAL];
 }
 
 // Empty response for AnnotateAssessment.
-message AnnotateAssessmentResponse {
-
-}
+message AnnotateAssessmentResponse {}
 
 // Password leak verification info.
 message PasswordLeakVerification {
-  // Optional. Scrypt hash of the username+password that the customer wants to verify
-  // against a known password leak.
+  // Optional. Scrypt hash of the username+password that the customer wants to
+  // verify against a known password leak.
   bytes hashed_user_credentials = 1 [(google.api.field_behavior) = OPTIONAL];
 
-  // Output only. Whether or not the user's credentials are present in a known leak.
+  // Output only. Whether or not the user's credentials are present in a known
+  // leak.
   bool credentials_leaked = 2 [(google.api.field_behavior) = OUTPUT_ONLY];
 
-  // Optional. The username part of the user credentials for which we want to trigger a
-  // leak check in canonicalized form. This is the same data used to create the
-  // hashed_user_credentials on the customer side.
+  // Optional. The username part of the user credentials for which we want to
+  // trigger a leak check in canonicalized form. This is the same data used to
+  // create the hashed_user_credentials on the customer side.
   string canonicalized_username = 3 [(google.api.field_behavior) = OPTIONAL];
 }
 
-// A recaptcha assessment resource.
+// A reCAPTCHA Enterprise assessment resource.
 message Assessment {
   option (google.api.resource) = {
     type: "recaptchaenterprise.googleapis.com/Assessment"
@@ -212,6 +359,12 @@ message Assessment {
     // Too little traffic has been received from this site thus far to generate
     // quality risk analysis.
     LOW_CONFIDENCE_SCORE = 5;
+
+    // The request matches behavioral characteristics of a carding attack.
+    SUSPECTED_CARDING = 6;
+
+    // The request matches behavioral characteristics of chargebacks for fraud.
+    SUSPECTED_CHARGEBACK = 7;
   }
 
   // Output only. The resource name for the Assessment in the format
@@ -227,10 +380,12 @@ message Assessment {
   float score = 3 [(google.api.field_behavior) = OUTPUT_ONLY];
 
   // Output only. Properties of the provided event token.
-  TokenProperties token_properties = 4 [(google.api.field_behavior) = OUTPUT_ONLY];
+  TokenProperties token_properties = 4
+      [(google.api.field_behavior) = OUTPUT_ONLY];
 
   // Output only. Reasons contributing to the risk analysis verdict.
-  repeated ClassificationReason reasons = 5 [(google.api.field_behavior) = OUTPUT_ONLY];
+  repeated ClassificationReason reasons = 5
+      [(google.api.field_behavior) = OUTPUT_ONLY];
 
   // Information about the user's credentials used to check for leaks.
   // This feature is part of the Early Access Program (EAP). Exercise caution,
@@ -238,35 +393,182 @@ message Assessment {
   // environment.
   PasswordLeakVerification password_leak_verification = 7;
 
-  // Assessment returned by Account Defender when a hashed_account_id is
+  // Assessment returned by account defender when a hashed_account_id is
   // provided.
   AccountDefenderAssessment account_defender_assessment = 8;
+
+  // Assessment returned by Fraud Prevention when TransactionData is provided.
+  FraudPreventionAssessment fraud_prevention_assessment = 11;
 }
 
 message Event {
-  // Optional. The user response token provided by the reCAPTCHA client-side integration
-  // on your site.
+  // Optional. The user response token provided by the reCAPTCHA Enterprise
+  // client-side integration on your site.
   string token = 1 [(google.api.field_behavior) = OPTIONAL];
 
-  // Optional. The site key that was used to invoke reCAPTCHA on your site and generate
-  // the token.
+  // Optional. The site key that was used to invoke reCAPTCHA Enterprise on your
+  // site and generate the token.
   string site_key = 2 [(google.api.field_behavior) = OPTIONAL];
 
-  // Optional. The user agent present in the request from the user's device related to
-  // this event.
+  // Optional. The user agent present in the request from the user's device
+  // related to this event.
   string user_agent = 3 [(google.api.field_behavior) = OPTIONAL];
 
-  // Optional. The IP address in the request from the user's device related to this event.
+  // Optional. The IP address in the request from the user's device related to
+  // this event.
   string user_ip_address = 4 [(google.api.field_behavior) = OPTIONAL];
 
-  // Optional. The expected action for this type of event. This should be the same action
-  // provided at token generation time on client-side platforms already
-  // integrated with recaptcha enterprise.
+  // Optional. The expected action for this type of event. This should be the
+  // same action provided at token generation time on client-side platforms
+  // already integrated with recaptcha enterprise.
   string expected_action = 5 [(google.api.field_behavior) = OPTIONAL];
 
-  // Optional. Optional unique stable hashed user identifier for the request. The
-  // identifier should ideally be hashed using sha256 with stable secret.
+  // Optional. Unique stable hashed user identifier for the request. The
+  // identifier must be hashed using hmac-sha256 with stable secret.
   bytes hashed_account_id = 6 [(google.api.field_behavior) = OPTIONAL];
+
+  // Optional. Data describing a payment transaction to be assessed. Sending
+  // this data enables reCAPTCHA Enterprise Fraud Prevention and the
+  // FraudPreventionAssessment component in the response.
+  TransactionData transaction_data = 13
+      [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Transaction data associated with a payment protected by reCAPTCHA Enterprise.
+// All fields are optional.
+message TransactionData {
+  // Structured address format for billing and shipping addresses.
+  message Address {
+    // The recipient name, potentially including information such as "care of".
+    string recipient = 1;
+
+    // The first lines of the address. The first line generally contains the
+    // street name and number, and further lines may include information such as
+    // an apartment number.
+    repeated string address = 2;
+
+    // The town/city of the address.
+    string locality = 3;
+
+    // The state, province, or otherwise administrative area of the address.
+    string administrative_area = 4;
+
+    // The CLDR country/region of the address.
+    string region_code = 5;
+
+    // The postal or ZIP code of the address.
+    string postal_code = 6;
+  }
+
+  // Details about a user's account involved in the transaction.
+  message User {
+    // Unique account identifier for this user. If using account defender,
+    // this should match the hashed_account_id field. Otherwise, a unique and
+    // persistent identifier for this account.
+    string account_id = 6;
+
+    // The epoch milliseconds of the user's account creation.
+    int64 creation_ms = 1;
+
+    // The email address of the user.
+    string email = 2;
+
+    // Whether the email has been verified to be accessible by the user (OTP or
+    // similar).
+    bool email_verified = 3;
+
+    // The phone number of the user, with country code.
+    string phone_number = 4;
+
+    // Whether the phone number has been verified to be accessible by the user
+    // (OTP or similar).
+    bool phone_verified = 5;
+  }
+
+  // Line items being purchased in this transaction.
+  message Item {
+    // The full name of the item.
+    string name = 1;
+
+    // The value per item that the user is paying, in the transaction currency,
+    // after discounts.
+    double value = 2;
+
+    // The quantity of this item that is being purchased.
+    int64 quantity = 3;
+
+    // When a merchant is specified, its corresponding account_id. Necessary to
+    // populate marketplace-style transactions.
+    string merchant_account_id = 4;
+  }
+
+  // Details about the transaction from the gateway.
+  message GatewayInfo {
+    // Name of the gateway service (for example, stripe, square, paypal).
+    string name = 1;
+
+    // Gateway response code describing the state of the transaction.
+    string gateway_response_code = 2;
+
+    // AVS response code from the gateway
+    // (available only when reCAPTCHA Enterprise is called after authorization).
+    string avs_response_code = 3;
+
+    // CVV response code from the gateway
+    // (available only when reCAPTCHA Enterprise is called after authorization).
+    string cvv_response_code = 4;
+  }
+
+  // Unique identifier for the transaction. This custom identifier can be used
+  // to reference this transaction in the future, for example, labeling a refund
+  // or chargeback event. Two attempts at the same transaction should use the
+  // same transaction id.
+  optional string transaction_id = 11;
+
+  // The payment method for the transaction. The allowed values are:
+  //
+  // * credit-card
+  // * debit-card
+  // * gift-card
+  // * processor-{name} (If a third-party is used, for example,
+  // processor-paypal)
+  // * custom-{name} (If an alternative method is used, for example,
+  // custom-crypto)
+  string payment_method = 1;
+
+  // The Bank Identification Number - generally the first 6 or 8 digits of the
+  // card.
+  string card_bin = 2;
+
+  // The last four digits of the card.
+  string card_last_four = 3;
+
+  // The currency code in ISO-4217 format.
+  string currency_code = 4;
+
+  // The decimal value of the transaction in the specified currency.
+  double value = 5;
+
+  // The value of shipping in the specified currency. 0 for free or no shipping.
+  double shipping_value = 12;
+
+  // Destination address if this transaction involves shipping a physical item.
+  Address shipping_address = 6;
+
+  // Address associated with the payment method when applicable.
+  Address billing_address = 7;
+
+  // Information about the user paying/initiating the transaction.
+  User user = 8;
+
+  // Information about the user or users fulfilling the transaction.
+  repeated User merchants = 13;
+
+  // Items purchased in this transaction.
+  repeated Item items = 14;
+
+  // Information about the payment gateway's response to the transaction.
+  GatewayInfo gateway_info = 10;
 }
 
 message TokenProperties {
@@ -288,7 +590,7 @@ message TokenProperties {
     DUPE = 4;
 
     // The user verification token did not match the provided site key.
-    // This may be a configuration error (e.g. development keys used in
+    // This may be a configuration error (for example, development keys used in
     // production) or end users trying to use verification tokens from other
     // sites.
     SITE_MISMATCH = 5 [deprecated = true];
@@ -321,9 +623,39 @@ message TokenProperties {
   string action = 5;
 }
 
-// Account Defender risk assessment.
+// Assessment for Fraud Prevention.
+message FraudPreventionAssessment {
+  // Information about stolen instrument fraud, where the user is not the
+  // legitimate owner of the instrument being used for the purchase.
+  message StolenInstrumentVerdict {
+    // Probability (0-1) of this transaction being executed with a stolen
+    // instrument.
+    float risk = 1;
+  }
+
+  // Information about card testing fraud, where an adversary is testing
+  // fraudulently obtained cards or brute forcing their details.
+  message CardTestingVerdict {
+    // Probability (0-1) of this transaction attempt being part of a card
+    // testing attack.
+    float risk = 1;
+  }
+
+  // Probability (0-1) of this transaction being fraudulent. Summarizes the
+  // combined risk of attack vectors below.
+  float transaction_risk = 1;
+
+  // Assessment of this transaction for risk of a stolen instrument.
+  StolenInstrumentVerdict stolen_instrument_verdict = 2;
+
+  // Assessment of this transaction for risk of being part of a card testing
+  // attack.
+  CardTestingVerdict card_testing_verdict = 3;
+}
+
+// Account defender risk assessment.
 message AccountDefenderAssessment {
-  // Labels returned by Account Defender for this request.
+  // Labels returned by account defender for this request.
   enum AccountDefenderLabel {
     // Default unspecified type.
     ACCOUNT_DEFENDER_LABEL_UNSPECIFIED = 0;
diff --git a/java-recaptchaenterprise/samples/snippets/generated/com/google/cloud/recaptchaenterprise/v1beta1/recaptchaenterpriseservicev1beta1/annotateassessment/AsyncAnnotateAssessment.java b/java-recaptchaenterprise/samples/snippets/generated/com/google/cloud/recaptchaenterprise/v1beta1/recaptchaenterpriseservicev1beta1/annotateassessment/AsyncAnnotateAssessment.java
index e62af61ca2c6..e5ac4e2ec0f1 100644
--- a/java-recaptchaenterprise/samples/snippets/generated/com/google/cloud/recaptchaenterprise/v1beta1/recaptchaenterpriseservicev1beta1/annotateassessment/AsyncAnnotateAssessment.java
+++ b/java-recaptchaenterprise/samples/snippets/generated/com/google/cloud/recaptchaenterprise/v1beta1/recaptchaenterpriseservicev1beta1/annotateassessment/AsyncAnnotateAssessment.java
@@ -23,6 +23,7 @@
 import com.google.recaptchaenterprise.v1beta1.AnnotateAssessmentRequest;
 import com.google.recaptchaenterprise.v1beta1.AnnotateAssessmentResponse;
 import com.google.recaptchaenterprise.v1beta1.AssessmentName;
+import com.google.recaptchaenterprise.v1beta1.TransactionEvent;
 import java.util.ArrayList;
 
 public class AsyncAnnotateAssessment {
@@ -44,6 +45,7 @@ public static void asyncAnnotateAssessment() throws Exception {
               .setName(AssessmentName.of("[PROJECT]", "[ASSESSMENT]").toString())
               .addAllReasons(new ArrayList<AnnotateAssessmentRequest.Reason>())
               .setHashedAccountId(ByteString.EMPTY)
+              .setTransactionEvent(TransactionEvent.newBuilder().build())
               .build();
       ApiFuture<AnnotateAssessmentResponse> future =
           recaptchaEnterpriseServiceV1Beta1Client.annotateAssessmentCallable().futureCall(request);
diff --git a/java-recaptchaenterprise/samples/snippets/generated/com/google/cloud/recaptchaenterprise/v1beta1/recaptchaenterpriseservicev1beta1/annotateassessment/SyncAnnotateAssessment.java b/java-recaptchaenterprise/samples/snippets/generated/com/google/cloud/recaptchaenterprise/v1beta1/recaptchaenterpriseservicev1beta1/annotateassessment/SyncAnnotateAssessment.java
index 3beea750d2e7..a02c3237c1d5 100644
--- a/java-recaptchaenterprise/samples/snippets/generated/com/google/cloud/recaptchaenterprise/v1beta1/recaptchaenterpriseservicev1beta1/annotateassessment/SyncAnnotateAssessment.java
+++ b/java-recaptchaenterprise/samples/snippets/generated/com/google/cloud/recaptchaenterprise/v1beta1/recaptchaenterpriseservicev1beta1/annotateassessment/SyncAnnotateAssessment.java
@@ -22,6 +22,7 @@
 import com.google.recaptchaenterprise.v1beta1.AnnotateAssessmentRequest;
 import com.google.recaptchaenterprise.v1beta1.AnnotateAssessmentResponse;
 import com.google.recaptchaenterprise.v1beta1.AssessmentName;
+import com.google.recaptchaenterprise.v1beta1.TransactionEvent;
 import java.util.ArrayList;
 
 public class SyncAnnotateAssessment {
@@ -43,6 +44,7 @@ public static void syncAnnotateAssessment() throws Exception {
               .setName(AssessmentName.of("[PROJECT]", "[ASSESSMENT]").toString())
               .addAllReasons(new ArrayList<AnnotateAssessmentRequest.Reason>())
               .setHashedAccountId(ByteString.EMPTY)
+              .setTransactionEvent(TransactionEvent.newBuilder().build())
               .build();
       AnnotateAssessmentResponse response =
           recaptchaEnterpriseServiceV1Beta1Client.annotateAssessment(request);
