// 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. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. syntax = "proto3"; package google.cloud.recaptchaenterprise.v1; import "google/api/annotations.proto"; import "google/api/client.proto"; import "google/api/field_behavior.proto"; import "google/api/resource.proto"; import "google/protobuf/empty.proto"; import "google/protobuf/field_mask.proto"; import "google/protobuf/timestamp.proto"; option csharp_namespace = "Google.Cloud.RecaptchaEnterprise.V1"; option go_package = "cloud.google.com/go/recaptchaenterprise/v2/apiv1/recaptchaenterprisepb;recaptchaenterprisepb"; option java_multiple_files = true; option java_outer_classname = "RecaptchaEnterpriseProto"; option java_package = "com.google.recaptchaenterprise.v1"; option objc_class_prefix = "GCRE"; option php_namespace = "Google\\Cloud\\RecaptchaEnterprise\\V1"; option ruby_package = "Google::Cloud::RecaptchaEnterprise::V1"; // Service to determine the likelihood an event is legitimate. service RecaptchaEnterpriseService { option (google.api.default_host) = "recaptchaenterprise.googleapis.com"; 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) { option (google.api.http) = { post: "/v1/{parent=projects/*}/assessments" body: "assessment" }; option (google.api.method_signature) = "parent,assessment"; } // Annotates a previously created Assessment to provide additional information // on whether the event turned out to be authentic or fraudulent. rpc AnnotateAssessment(AnnotateAssessmentRequest) returns (AnnotateAssessmentResponse) { option (google.api.http) = { post: "/v1/{name=projects/*/assessments/*}:annotate" body: "*" }; option (google.api.method_signature) = "name,annotation"; } // Creates a new reCAPTCHA Enterprise key. rpc CreateKey(CreateKeyRequest) returns (Key) { option (google.api.http) = { post: "/v1/{parent=projects/*}/keys" body: "key" }; option (google.api.method_signature) = "parent,key"; } // Returns the list of all keys that belong to a project. rpc ListKeys(ListKeysRequest) returns (ListKeysResponse) { option (google.api.http) = { get: "/v1/{parent=projects/*}/keys" }; option (google.api.method_signature) = "parent"; } // Returns the secret key related to the specified public key. // You must use the legacy secret key only in a 3rd party integration with // legacy reCAPTCHA. rpc RetrieveLegacySecretKey(RetrieveLegacySecretKeyRequest) returns (RetrieveLegacySecretKeyResponse) { option (google.api.http) = { get: "/v1/{key=projects/*/keys/*}:retrieveLegacySecretKey" }; option (google.api.method_signature) = "key"; } // Returns the specified key. rpc GetKey(GetKeyRequest) returns (Key) { option (google.api.http) = { get: "/v1/{name=projects/*/keys/*}" }; option (google.api.method_signature) = "name"; } // Updates the specified key. rpc UpdateKey(UpdateKeyRequest) returns (Key) { option (google.api.http) = { patch: "/v1/{key.name=projects/*/keys/*}" body: "key" }; option (google.api.method_signature) = "key,update_mask"; } // Deletes the specified key. rpc DeleteKey(DeleteKeyRequest) returns (google.protobuf.Empty) { option (google.api.http) = { delete: "/v1/{name=projects/*/keys/*}" }; option (google.api.method_signature) = "name"; } // Migrates an existing key from reCAPTCHA to reCAPTCHA Enterprise. // Once a key is migrated, it can be used from either product. SiteVerify // requests are billed as CreateAssessment calls. You must be // authenticated as one of the current owners of the reCAPTCHA Site Key, and // your user must have the reCAPTCHA Enterprise Admin IAM role in the // destination project. rpc MigrateKey(MigrateKeyRequest) returns (Key) { option (google.api.http) = { post: "/v1/{name=projects/*/keys/*}:migrate" body: "*" }; } // Get some aggregated metrics for a Key. This data can be used to build // dashboards. rpc GetMetrics(GetMetricsRequest) returns (Metrics) { option (google.api.http) = { get: "/v1/{name=projects/*/keys/*/metrics}" }; option (google.api.method_signature) = "name"; } // List groups of related accounts. rpc ListRelatedAccountGroups(ListRelatedAccountGroupsRequest) returns (ListRelatedAccountGroupsResponse) { option (google.api.http) = { get: "/v1/{parent=projects/*}/relatedaccountgroups" }; option (google.api.method_signature) = "parent"; } // Get memberships in a group of related accounts. rpc ListRelatedAccountGroupMemberships( ListRelatedAccountGroupMembershipsRequest) returns (ListRelatedAccountGroupMembershipsResponse) { option (google.api.http) = { get: "/v1/{parent=projects/*/relatedaccountgroups/*}/memberships" }; option (google.api.method_signature) = "parent"; } // Search group memberships related to a given account. rpc SearchRelatedAccountGroupMemberships( SearchRelatedAccountGroupMembershipsRequest) returns (SearchRelatedAccountGroupMembershipsResponse) { option (google.api.http) = { post: "/v1/{project=projects/*}/relatedaccountgroupmemberships:search" body: "*" }; option (google.api.method_signature) = "project,hashed_account_id"; } } // The create assessment request message. message CreateAssessmentRequest { // Required. The name of the project in which the assessment will be created, // in the format "projects/{project}". string parent = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "cloudresourcemanager.googleapis.com/Project" } ]; // Required. The assessment details. 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. enum Annotation { // Default unspecified type. ANNOTATION_UNSPECIFIED = 0; // Provides information that the event turned out to be legitimate. LEGITIMATE = 1; // Provides information that the event turned out to be fraudulent. FRAUDULENT = 2; // Provides information that the event was related to a login event in which // the user typed the correct password. Deprecated, prefer indicating // CORRECT_PASSWORD through the reasons field instead. PASSWORD_CORRECT = 3 [deprecated = true]; // Provides information that the event was related to a login event in which // the user typed the incorrect password. Deprecated, prefer indicating // INCORRECT_PASSWORD through the reasons field instead. PASSWORD_INCORRECT = 4 [deprecated = true]; } // Enum that represents potential reasons for annotating an assessment. enum Reason { // Default unspecified reason. REASON_UNSPECIFIED = 0; // 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 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 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. PAYMENT_HEURISTICS = 2; // Indicates that the user was served a 2FA challenge. An old assessment // with `ENUM_VALUES.INITIATED_TWO_FACTOR` reason that has not been // overwritten with `PASSED_TWO_FACTOR` is treated as an abandoned 2FA flow. // This is equivalent to `FAILED_TWO_FACTOR`. INITIATED_TWO_FACTOR = 7; // Indicates that the user passed a 2FA challenge. PASSED_TWO_FACTOR = 3; // Indicates that the user failed a 2FA challenge. FAILED_TWO_FACTOR = 4; // Indicates the user provided the correct password. CORRECT_PASSWORD = 5; // 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 // "projects/{project}/assessments/{assessment}". string name = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "recaptchaenterprise.googleapis.com/Assessment" } ]; // 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. repeated Reason reasons = 3 [(google.api.field_behavior) = 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 {} // Information about a verification endpoint that can be used for 2FA. message EndpointVerificationInfo { oneof endpoint { // Email address for which to trigger a verification request. string email_address = 1; // Phone number for which to trigger a verification request. Should be given // in E.164 format. string phone_number = 2; } // Output only. Token to provide to the client to trigger endpoint // verification. It must be used within 15 minutes. string request_token = 3 [(google.api.field_behavior) = OUTPUT_ONLY]; // Output only. Timestamp of the last successful verification for the // endpoint, if any. google.protobuf.Timestamp last_verification_time = 4 [(google.api.field_behavior) = OUTPUT_ONLY]; } // Information about account verification, used for identity verification. message AccountVerificationInfo { // Result of the account verification as contained in the verdict token issued // at the end of the verification flow. enum Result { // No information about the latest account verification. RESULT_UNSPECIFIED = 0; // The user was successfully verified. This means the account verification // challenge was successfully completed. SUCCESS_USER_VERIFIED = 1; // The user failed the verification challenge. ERROR_USER_NOT_VERIFIED = 2; // The site is not properly onboarded to use the account verification // feature. ERROR_SITE_ONBOARDING_INCOMPLETE = 3; // The recipient is not allowed for account verification. This can occur // during integration but should not occur in production. ERROR_RECIPIENT_NOT_ALLOWED = 4; // The recipient has already been sent too many verification codes in a // short amount of time. ERROR_RECIPIENT_ABUSE_LIMIT_EXHAUSTED = 5; // The verification flow could not be completed due to a critical internal // error. ERROR_CRITICAL_INTERNAL = 6; // The client has exceeded their two factor request quota for this period of // time. ERROR_CUSTOMER_QUOTA_EXHAUSTED = 7; // The request cannot be processed at the time because of an incident. This // bypass can be restricted to a problematic destination email domain, a // customer, or could affect the entire service. ERROR_VERIFICATION_BYPASSED = 8; // The request parameters do not match with the token provided and cannot be // processed. ERROR_VERDICT_MISMATCH = 9; } // Endpoints that can be used for identity verification. repeated EndpointVerificationInfo endpoints = 1; // Language code preference for the verification message, set as a IETF BCP 47 // language code. string language_code = 3; // Output only. Result of the latest account verification challenge. Result latest_verification_result = 7 [(google.api.field_behavior) = OUTPUT_ONLY]; // Username of the account that is being verified. Deprecated. Customers // should now provide the hashed account ID field in Event. string username = 2 [deprecated = true]; } // Private password leak verification info. message PrivatePasswordLeakVerification { // Optional. Exactly 26-bit prefix of the SHA-256 hash of the canonicalized // username. It is used to look up password leaks associated with that hash // prefix. bytes lookup_hash_prefix = 1 [(google.api.field_behavior) = OPTIONAL]; // Optional. Encrypted Scrypt hash of the canonicalized username+password. It // is re-encrypted by the server and returned through // `reencrypted_user_credentials_hash`. bytes encrypted_user_credentials_hash = 2 [(google.api.field_behavior) = OPTIONAL]; // Output only. List of prefixes of the encrypted potential password leaks // that matched the given parameters. They must be compared with the // client-side decryption prefix of `reencrypted_user_credentials_hash` repeated bytes encrypted_leak_match_prefixes = 3 [(google.api.field_behavior) = OUTPUT_ONLY]; // Output only. Corresponds to the re-encryption of the // `encrypted_user_credentials_hash` field. It is used to match potential // password leaks within `encrypted_leak_match_prefixes`. bytes reencrypted_user_credentials_hash = 4 [(google.api.field_behavior) = OUTPUT_ONLY]; } // A reCAPTCHA Enterprise assessment resource. message Assessment { option (google.api.resource) = { type: "recaptchaenterprise.googleapis.com/Assessment" pattern: "projects/{project}/assessments/{assessment}" }; // Output only. The resource name for the Assessment in the format // "projects/{project}/assessments/{assessment}". string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; // The event being assessed. Event event = 2; // Output only. The risk analysis result for the event being assessed. RiskAnalysis risk_analysis = 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]; // Account verification information for identity verification. The assessment // event must include a token and site key to use this feature. AccountVerificationInfo account_verification = 5; // Assessment returned by account defender when a hashed_account_id is // provided. AccountDefenderAssessment account_defender_assessment = 6; // The private password leak verification field contains the parameters that // are used to to check for leaks privately without sharing user credentials. PrivatePasswordLeakVerification private_password_leak_verification = 8; // Assessment returned by Fraud Prevention when TransactionData is provided. FraudPreventionAssessment fraud_prevention_assessment = 11; } // The event being assessed. message Event { // 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 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. 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. 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. string expected_action = 5 [(google.api.field_behavior) = OPTIONAL]; // 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; } // Risk analysis result for an event. message RiskAnalysis { // Reasons contributing to the risk analysis verdict. enum ClassificationReason { // Default unspecified type. CLASSIFICATION_REASON_UNSPECIFIED = 0; // Interactions matched the behavior of an automated agent. AUTOMATION = 1; // The event originated from an illegitimate environment. UNEXPECTED_ENVIRONMENT = 2; // Traffic volume from the event source is higher than normal. TOO_MUCH_TRAFFIC = 3; // Interactions with the site were significantly different than expected // patterns. UNEXPECTED_USAGE_PATTERNS = 4; // 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; } // Legitimate event score from 0.0 to 1.0. // (1.0 means very likely legitimate traffic while 0.0 means very likely // non-legitimate traffic). float score = 1; // Reasons contributing to the risk analysis verdict. repeated ClassificationReason reasons = 2; } // Properties of the provided event token. message TokenProperties { // Enum that represents the types of invalid token reasons. enum InvalidReason { // Default unspecified type. INVALID_REASON_UNSPECIFIED = 0; // If the failure reason was not accounted for. UNKNOWN_INVALID_REASON = 1; // The provided user verification token was malformed. MALFORMED = 2; // The user verification token had expired. EXPIRED = 3; // The user verification had already been seen. DUPE = 4; // The user verification token was not present. MISSING = 5; // A retriable error (such as network failure) occurred on the browser. // Could easily be simulated by an attacker. BROWSER_ERROR = 6; } // Whether the provided user response token is valid. When valid = false, the // reason could be specified in invalid_reason or it could also be due to // a user failing to solve a challenge or a sitekey mismatch (i.e the sitekey // used to generate the token was different than the one specified in the // assessment). bool valid = 1; // Reason associated with the response when valid = false. InvalidReason invalid_reason = 2; // The timestamp corresponding to the generation of the token. google.protobuf.Timestamp create_time = 3; // The hostname of the page on which the token was generated (Web keys only). string hostname = 4; // The name of the Android package with which the token was generated (Android // keys only). string android_package_name = 8; // The ID of the iOS bundle with which the token was generated (iOS keys // only). string ios_bundle_id = 9; // Action name provided at token generation. string action = 5; } // 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. enum AccountDefenderLabel { // Default unspecified type. ACCOUNT_DEFENDER_LABEL_UNSPECIFIED = 0; // The request matches a known good profile for the user. PROFILE_MATCH = 1; // The request is potentially a suspicious login event and must be further // verified either through multi-factor authentication or another system. SUSPICIOUS_LOGIN_ACTIVITY = 2; // The request matched a profile that previously had suspicious account // creation behavior. This can mean that this is a fake account. SUSPICIOUS_ACCOUNT_CREATION = 3; // The account in the request has a high number of related accounts. It does // not necessarily imply that the account is bad but can require further // investigation. RELATED_ACCOUNTS_NUMBER_HIGH = 4; } // Labels for this request. repeated AccountDefenderLabel labels = 1; } // The create key request message. message CreateKeyRequest { // Required. The name of the project in which the key will be created, in the // format "projects/{project}". string parent = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "cloudresourcemanager.googleapis.com/Project" } ]; // Required. Information to create a reCAPTCHA Enterprise key. Key key = 2 [(google.api.field_behavior) = REQUIRED]; } // The list keys request message. message ListKeysRequest { // Required. The name of the project that contains the keys that will be // listed, in the format "projects/{project}". string parent = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "cloudresourcemanager.googleapis.com/Project" } ]; // Optional. The maximum number of keys to return. Default is 10. Max limit is // 1000. int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL]; // Optional. The next_page_token value returned from a previous. // ListKeysRequest, if any. string page_token = 3 [(google.api.field_behavior) = OPTIONAL]; } // Response to request to list keys in a project. message ListKeysResponse { // Key details. repeated Key keys = 1; // Token to retrieve the next page of results. It is set to empty if no keys // remain in results. string next_page_token = 2; } // The retrieve legacy secret key request message. message RetrieveLegacySecretKeyRequest { // Required. The public key name linked to the requested secret key in the // format "projects/{project}/keys/{key}". string key = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "recaptchaenterprise.googleapis.com/Key" } ]; } // The get key request message. message GetKeyRequest { // Required. The name of the requested key, in the format // "projects/{project}/keys/{key}". string name = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "recaptchaenterprise.googleapis.com/Key" } ]; } // The update key request message. message UpdateKeyRequest { // Required. The key to update. Key key = 1 [(google.api.field_behavior) = REQUIRED]; // Optional. The mask to control which fields of the key get updated. If the // mask is not present, all fields will be updated. google.protobuf.FieldMask update_mask = 2 [(google.api.field_behavior) = OPTIONAL]; } // The delete key request message. message DeleteKeyRequest { // Required. The name of the key to be deleted, in the format // "projects/{project}/keys/{key}". string name = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "recaptchaenterprise.googleapis.com/Key" } ]; } // The migrate key request message. message MigrateKeyRequest { // Required. The name of the key to be migrated, in the format // "projects/{project}/keys/{key}". string name = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "recaptchaenterprise.googleapis.com/Key" } ]; // Optional. If true, skips the billing check. // A reCAPTCHA Enterprise key or migrated key behaves differently than a // reCAPTCHA (non-Enterprise version) key when you reach a quota limit (see // https://cloud.google.com/recaptcha-enterprise/quotas#quota_limit). To avoid // any disruption of your usage, we check that a billing account is present. // If your usage of reCAPTCHA is under the free quota, you can safely skip the // billing check and proceed with the migration. See // https://cloud.google.com/recaptcha-enterprise/docs/billing-information. bool skip_billing_check = 2 [(google.api.field_behavior) = OPTIONAL]; } // The get metrics request message. message GetMetricsRequest { // Required. The name of the requested metrics, in the format // "projects/{project}/keys/{key}/metrics". string name = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "recaptchaenterprise.googleapis.com/Metrics" } ]; } // Metrics for a single Key. message Metrics { option (google.api.resource) = { type: "recaptchaenterprise.googleapis.com/Metrics" pattern: "projects/{project}/keys/{key}/metrics" }; // Output only. The name of the metrics, in the format // "projects/{project}/keys/{key}/metrics". string name = 4 [(google.api.field_behavior) = OUTPUT_ONLY]; // Inclusive start time aligned to a day (UTC). google.protobuf.Timestamp start_time = 1; // Metrics will be continuous and in order by dates, and in the granularity // of day. All Key types should have score-based data. repeated ScoreMetrics score_metrics = 2; // Metrics will be continuous and in order by dates, and in the granularity // of day. Only challenge-based keys (CHECKBOX, INVISIBLE), will have // challenge-based data. repeated ChallengeMetrics challenge_metrics = 3; } // Secret key is used only in legacy reCAPTCHA. It must be used in a 3rd party // integration with legacy reCAPTCHA. message RetrieveLegacySecretKeyResponse { // The secret key (also known as shared secret) authorizes communication // between your application backend and the reCAPTCHA Enterprise server to // create an assessment. // The secret key needs to be kept safe for security purposes. string legacy_secret_key = 1; } // A key used to identify and configure applications (web and/or mobile) that // use reCAPTCHA Enterprise. message Key { option (google.api.resource) = { type: "recaptchaenterprise.googleapis.com/Key" pattern: "projects/{project}/keys/{key}" }; // The resource name for the Key in the format // "projects/{project}/keys/{key}". string name = 1; // Human-readable display name of this key. Modifiable by user. string display_name = 2; // Platform specific settings for this key. The key can only be used on a // platform for which the settings are enabled. oneof platform_settings { // Settings for keys that can be used by websites. WebKeySettings web_settings = 3; // Settings for keys that can be used by Android apps. AndroidKeySettings android_settings = 4; // Settings for keys that can be used by iOS apps. IOSKeySettings ios_settings = 5; } // See // Creating and managing labels. map labels = 6; // Output only. The timestamp corresponding to the creation of this Key. google.protobuf.Timestamp create_time = 7 [(google.api.field_behavior) = OUTPUT_ONLY]; // Options for user acceptance testing. TestingOptions testing_options = 9; // Settings for WAF WafSettings waf_settings = 10; } // Options for user acceptance testing. message TestingOptions { // Enum that represents the challenge option for challenge-based (CHECKBOX, // INVISIBLE) testing keys. enum TestingChallenge { // Perform the normal risk analysis and return either nocaptcha or a // challenge depending on risk and trust factors. TESTING_CHALLENGE_UNSPECIFIED = 0; // Challenge requests for this key always return a nocaptcha, which // does not require a solution. NOCAPTCHA = 1; // Challenge requests for this key always return an unsolvable // challenge. UNSOLVABLE_CHALLENGE = 2; } // All assessments for this Key will return this score. Must be between 0 // (likely not legitimate) and 1 (likely legitimate) inclusive. float testing_score = 1; // For challenge-based keys only (CHECKBOX, INVISIBLE), all challenge requests // for this site will return nocaptcha if NOCAPTCHA, or an unsolvable // challenge if CHALLENGE. TestingChallenge testing_challenge = 2; } // Settings specific to keys that can be used by websites. message WebKeySettings { // Enum that represents the integration types for web keys. enum IntegrationType { // Default type that indicates this enum hasn't been specified. This is not // a valid IntegrationType, one of the other types must be specified // instead. INTEGRATION_TYPE_UNSPECIFIED = 0; // Only used to produce scores. It doesn't display the "I'm not a robot" // checkbox and never shows captcha challenges. SCORE = 1; // Displays the "I'm not a robot" checkbox and may show captcha challenges // after it is checked. CHECKBOX = 2; // Doesn't display the "I'm not a robot" checkbox, but may show captcha // challenges after risk analysis. INVISIBLE = 3; } // Enum that represents the possible challenge frequency and difficulty // configurations for a web key. enum ChallengeSecurityPreference { // Default type that indicates this enum hasn't been specified. CHALLENGE_SECURITY_PREFERENCE_UNSPECIFIED = 0; // Key tends to show fewer and easier challenges. USABILITY = 1; // Key tends to show balanced (in amount and difficulty) challenges. BALANCE = 2; // Key tends to show more and harder challenges. SECURITY = 3; } // If set to true, it means allowed_domains will not be enforced. bool allow_all_domains = 3; // Domains or subdomains of websites allowed to use the key. All subdomains // of an allowed domain are automatically allowed. A valid domain requires a // host and must not include any path, port, query or fragment. // Examples: 'example.com' or 'subdomain.example.com' repeated string allowed_domains = 1; // If set to true, the key can be used on AMP (Accelerated Mobile Pages) // websites. This is supported only for the SCORE integration type. bool allow_amp_traffic = 2; // Required. Describes how this key is integrated with the website. IntegrationType integration_type = 4 [(google.api.field_behavior) = REQUIRED]; // Settings for the frequency and difficulty at which this key triggers // captcha challenges. This should only be specified for IntegrationTypes // CHECKBOX and INVISIBLE. ChallengeSecurityPreference challenge_security_preference = 5; } // Settings specific to keys that can be used by Android apps. message AndroidKeySettings { // If set to true, allowed_package_names are not enforced. bool allow_all_package_names = 2; // Android package names of apps allowed to use the key. // Example: 'com.companyname.appname' repeated string allowed_package_names = 1; } // Settings specific to keys that can be used by iOS apps. message IOSKeySettings { // If set to true, allowed_bundle_ids are not enforced. bool allow_all_bundle_ids = 2; // iOS bundle ids of apps allowed to use the key. // Example: 'com.companyname.productname.appname' repeated string allowed_bundle_ids = 1; } // Score distribution. message ScoreDistribution { // Map key is score value multiplied by 100. The scores are discrete values // between [0, 1]. The maximum number of buckets is on order of a few dozen, // but typically much lower (ie. 10). map score_buckets = 1; } // Metrics related to scoring. message ScoreMetrics { // Aggregated score metrics for all traffic. ScoreDistribution overall_metrics = 1; // Action-based metrics. The map key is the action name which specified by the // site owners at time of the "execute" client-side call. map action_metrics = 2; } // Metrics related to challenges. message ChallengeMetrics { // Count of reCAPTCHA checkboxes or badges rendered. This is mostly equivalent // to a count of pageloads for pages that include reCAPTCHA. int64 pageload_count = 1; // Count of nocaptchas (successful verification without a challenge) issued. int64 nocaptcha_count = 2; // Count of submitted challenge solutions that were incorrect or otherwise // deemed suspicious such that a subsequent challenge was triggered. int64 failed_count = 3; // Count of nocaptchas (successful verification without a challenge) plus // submitted challenge solutions that were correct and resulted in // verification. int64 passed_count = 4; } // The request message to list memberships in a related account group. message ListRelatedAccountGroupMembershipsRequest { // Required. The resource name for the related account group in the format // `projects/{project}/relatedaccountgroups/{relatedaccountgroup}`. string parent = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { child_type: "recaptchaenterprise.googleapis.com/RelatedAccountGroupMembership" } ]; // Optional. The maximum number of accounts to return. The service might // return fewer than this value. If unspecified, at most 50 accounts are // returned. The maximum value is 1000; values above 1000 are coerced to 1000. int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL]; // Optional. A page token, received from a previous // `ListRelatedAccountGroupMemberships` call. // // When paginating, all other parameters provided to // `ListRelatedAccountGroupMemberships` must match the call that provided the // page token. string page_token = 3 [(google.api.field_behavior) = OPTIONAL]; } // The response to a `ListRelatedAccountGroupMemberships` call. message ListRelatedAccountGroupMembershipsResponse { // The memberships listed by the query. repeated RelatedAccountGroupMembership related_account_group_memberships = 1; // A token, which can be sent as `page_token` to retrieve the next page. // If this field is omitted, there are no subsequent pages. string next_page_token = 2; } // The request message to list related account groups. message ListRelatedAccountGroupsRequest { // Required. The name of the project to list related account groups from, in // the format "projects/{project}". string parent = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { child_type: "recaptchaenterprise.googleapis.com/RelatedAccountGroup" } ]; // Optional. The maximum number of groups to return. The service might return // fewer than this value. If unspecified, at most 50 groups are returned. The // maximum value is 1000; values above 1000 are coerced to 1000. int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL]; // Optional. A page token, received from a previous `ListRelatedAccountGroups` // call. Provide this to retrieve the subsequent page. // // When paginating, all other parameters provided to // `ListRelatedAccountGroups` must match the call that provided the page // token. string page_token = 3 [(google.api.field_behavior) = OPTIONAL]; } // The response to a `ListRelatedAccountGroups` call. message ListRelatedAccountGroupsResponse { // The groups of related accounts listed by the query. repeated RelatedAccountGroup related_account_groups = 1; // A token, which can be sent as `page_token` to retrieve the next page. // If this field is omitted, there are no subsequent pages. string next_page_token = 2; } // The request message to search related account group memberships. message SearchRelatedAccountGroupMembershipsRequest { // Required. The name of the project to search related account group // memberships from. Specify the project name in the following format: // "projects/{project}". string project = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { child_type: "recaptchaenterprise.googleapis.com/RelatedAccountGroupMembership" } ]; // Optional. The unique stable hashed user identifier we should search // connections to. The identifier should correspond to a `hashed_account_id` // provided in a previous `CreateAssessment` or `AnnotateAssessment` call. bytes hashed_account_id = 2 [(google.api.field_behavior) = OPTIONAL]; // Optional. The maximum number of groups to return. The service might return // fewer than this value. If unspecified, at most 50 groups are returned. The // maximum value is 1000; values above 1000 are coerced to 1000. int32 page_size = 3 [(google.api.field_behavior) = OPTIONAL]; // Optional. A page token, received from a previous // `SearchRelatedAccountGroupMemberships` call. Provide this to retrieve the // subsequent page. // // When paginating, all other parameters provided to // `SearchRelatedAccountGroupMemberships` must match the call that provided // the page token. string page_token = 4 [(google.api.field_behavior) = OPTIONAL]; } // The response to a `SearchRelatedAccountGroupMemberships` call. message SearchRelatedAccountGroupMembershipsResponse { // The queried memberships. repeated RelatedAccountGroupMembership related_account_group_memberships = 1; // A token, which can be sent as `page_token` to retrieve the next page. // If this field is omitted, there are no subsequent pages. string next_page_token = 2; } // A membership in a group of related accounts. message RelatedAccountGroupMembership { option (google.api.resource) = { type: "recaptchaenterprise.googleapis.com/RelatedAccountGroupMembership" pattern: "projects/{project}/relatedaccountgroups/{relatedaccountgroup}/memberships/{membership}" }; // Required. The resource name for this membership in the format // `projects/{project}/relatedaccountgroups/{relatedaccountgroup}/memberships/{membership}`. string name = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "recaptchaenterprise.googleapis.com/RelatedAccountGroupMembership" } ]; // The unique stable hashed user identifier of the member. The identifier // corresponds to a `hashed_account_id` provided in a previous // `CreateAssessment` or `AnnotateAssessment` call. bytes hashed_account_id = 2; } // A group of related accounts. message RelatedAccountGroup { option (google.api.resource) = { type: "recaptchaenterprise.googleapis.com/RelatedAccountGroup" pattern: "projects/{project}/relatedaccountgroups/{relatedaccountgroup}" }; // Required. The resource name for the related account group in the format // `projects/{project}/relatedaccountgroups/{related_account_group}`. string name = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "recaptchaenterprise.googleapis.com/RelatedAccountGroup" } ]; } // Settings specific to keys that can be used for WAF (Web Application // Firewall). message WafSettings { // Supported WAF features. For more information, see // https://cloud.google.com/recaptcha-enterprise/docs/usecase#comparison_of_features. enum WafFeature { // Undefined feature. WAF_FEATURE_UNSPECIFIED = 0; // Redirects suspicious traffic to reCAPTCHA. CHALLENGE_PAGE = 1; // Use reCAPTCHA session-tokens to protect the whole user session on the // site's domain. SESSION_TOKEN = 2; // Use reCAPTCHA action-tokens to protect user actions. ACTION_TOKEN = 3; } // Web Application Firewalls supported by reCAPTCHA Enterprise. enum WafService { // Undefined WAF WAF_SERVICE_UNSPECIFIED = 0; // Cloud Armor CA = 1; } // Required. The WAF service that uses this key. WafService waf_service = 1 [(google.api.field_behavior) = REQUIRED]; // Required. The WAF feature for which this key is enabled. WafFeature waf_feature = 2 [(google.api.field_behavior) = REQUIRED]; }