{
  "swagger": "2.0",
  "info": {
    "title": "Google Standard Payments Payment Integrator Hosted VirtualCards API",
    "description": "This includes services hosted by Payment Integrators for VirtualCards.",
    "version": "v1"
  },
  "host": "www.integratorhost.example.com",
  "basePath": "/integrator-base-path",
  "schemes": ["https"],
  "paths": {
    "/virtual-cards-v1/getTransactions": {
      "post": {
        "tags": ["payment_integrator_virtual_cards_api"],
        "operationId": "GetTransactions",
        "description": "Retrieves a list of transactions for the given enrollment in {{product_name_short}}. A `transactionListContinuationToken` will be returned with each call to this API. The same token would be used in subsequent calls to limit the returned transactions to those that have been added or updated since the request represented by the token. If the token is not provided, the response should include all transactions for the maximum period prior to the request. An example request looks like: { \"requestHeader\": { \"protocolVersion\": { \"major\": 1 }, \"requestId\": \"BKD0GF23KSD8S23\", \"requestTimestamp\": { \"epochMillis\": \"1481899949606\" }, \"paymentIntegratorAccountId\": \"abcdef123456\" }, \"enrollmentRequestId\": \"G1MQ0YERJ0Q7LPM\", \"transactionListContinuationToken\": \"xyz1234\" } An example success response looks like: { \"responseHeader\": { \"responseTimestamp\": { \"epochMillis\": \"1481899950236\" } }, \"result\": { \"success\" : { \"transactions\" : [ { \"transactionId\" : \"qazsw56789\", \"virtualCardTransactionTokenLastFour\" : \"1234\", \"amount\": { \"amountMicros\": \"10000000\", \"currencyCode\": \"USD\" }, \"purchase\" : {}, \"token\" : {}, \"status\" : { \"approved\" : {} }, \"merchantInfo\" : { \"merchantName\" : \"merchant\", \"address\": { \"addressLine\": [\"123 Fake St\"], \"localityName\": \"Springfield\", \"administrativeAreaName\": \"IL\" }, \"merchantCategoryCode\" : \"3001\", \"merchantDomainName\": \"https:\/\/www.gap.com\" }, \"occurredTimestamp\": { \"epochMillis\": 1641477744767 }, \"paymentMethodUrl\": \"https:\/\/www.partnerbank.com\/paymentmethod.html?card=MTIzNHNkYQ==\", \"transactionUrl\": \"https:\/\/www.partnerbank.com\/transaction.html?txnId=NDU0NjRmYg==\" } ], \"transactionListContinuationToken\": \"xyz1234\" } } } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/GetTransactionsRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/GetTransactionsResponse"
            }
          }
        }
      }
    },
    "/virtual-cards-v1/echo": {
      "post": {
        "tags": ["payment_integrator_virtual_cards_api"],
        "operationId": "Echo",
        "description": "Echos back a string sent from the client. If the endpoint encounters an error while processing the request, the response body from this endpoint should be of type `ErrorResponse`. An example request looks like: { \"requestHeader\": { \"protocolVersion\": { \"major\": 1 }, \"requestId\": \"G1MQ0YERJ0Q7LPM\", \"requestTimestamp\": { \"epochMillis\": \"1481899949606\" }, \"paymentIntegratorAccountId\": \"InvisiCashUSA_USD\" }, \"clientMessage\": \"Client echo message\" } An example success response looks like: { \"responseHeader\": { \"responseTimestamp\": { \"epochMillis\":\"1481899950236\" } }, \"clientMessage\": \"Client echo message\", \"serverMessage\": \"Debug ID 12345\" } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/EchoRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/EchoResponse"
            }
          }
        }
      }
    },
    "/virtual-cards-v1/enroll": {
      "post": {
        "tags": ["payment_integrator_virtual_cards_api"],
        "operationId": "Enroll",
        "description": "Enrolls a card in Virtual Cards. An example request looks like: { \"requestHeader\": { \"protocolVersion\": { \"major\": 1 }, \"requestId\": \"G1MQ0YERJ0Q7LPM\", \"requestTimestamp\": { \"epochMillis\": \"1481899949606\" }, \"paymentIntegratorAccountId\": \"abcdef123456\" }, \"googleManagedAcceptanceDetails\": { \"acceptanceTimestamp\": { \"epochMillis\": \"1481899949657\" }, \"version\": \"1.1\" }, \"cardToEnroll\": { \"accountNumber\": { \"value\": \"1111222233334444\" }, \"expiryDate\": { \"expiryMonth\": \"11\", \"expiryYear\": \"25\" } }, \"customerDetails\": { \"maskedEmailAddress\": \"l***r@gmail.com\" }, \"riskSignals\": { \"commonRiskSignals\": { \"environmentalDetails\": { \"ipAddress\": \"192.168.1.1\", \"actionContext\": \"NATIVE_APP\", \"deviceGeoLocation\": { \"latitudeE7\": \"396317000\", \"longitudeE7\": \"-86733000\" } }, \"physicalDetails\": { \"deviceToAccountBindingId\": \"0bba7f1e4a83ab4fdd77f5ebd6bd4495905f36db9c7c6e638833721e181bd837\", \"devicePhoneNumberLastFour\": \"1234\", \"deviceAccountAge\": \"LESS_THAN_SEVEN_DAYS\", \"android\": {}, \"devicePlatformAuthenticatorEnabled\": {} }, \"googleAccountDetails\": { \"mostRecentAccountPaymentMethodChangeActivity\": \"MOST_RECENT_ACCOUNT_PAYMENT_METHOD_CHANGE_ACTIVITY_LESS_THAN_ONE_DAY\", \"mostRecentAccountSecurityActivity\": \"MOST_RECENT_ACCOUNT_SECURITY_ACTIVITY_LESS_THAN_ONE_DAY\", \"accountAndCardNameMatch\": {}, \"customerPhoneNumberLastFour\": \"1234\", \"autofillPaymentMethodAttempts\": \"42\", \"cardAge\": \"LESS_THAN_SEVEN_DAYS\", \"numberOfBillingLastNames\": \"7\" }, \"googleRiskAssessment\": { \"deviceRiskScore\": \"DEVICE_RISK_SCORE_MEDIUM\", \"accountRiskScore\": \"ACCOUNT_RISK_SCORE_HIGH\" } }, \"customerRiskDetails\": { \"hashedEmailAddress\": \"a34fe89600bb813871c049ed50d323811cb3f6f4daeea88372014c90e350e688\", \"customerActionType\": \"NEW_CARD\", \"accountAge\": \"ACCOUNT_AGE_BUCKET_LESS_THAN_ONE_YEAR\" }, \"panSourceWeb\": {} } } An example success response looks like: { \"responseHeader\": { \"responseTimestamp\": { \"epochMillis\": \"1481899950236\" } }, \"result\": { \"success\" :{ } } } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/EnrollRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/EnrollResponse"
            }
          }
        }
      }
    },
    "/virtual-cards-v1/unenroll": {
      "post": {
        "tags": ["payment_integrator_virtual_cards_api"],
        "operationId": "Unenroll",
        "description": "Informs the integrator that an enrollment is over. This means that the given `enrollmentRequestId` is no longer valid and will not be used again to retrieve a virtual card number. Calls to `unenroll` with an `enrollmentRequestId` that has been seen previously should always return success to respect idempotency. In the event a future `retrieveVirtualCardNumber` uses this unenrolled `enrollmentRequestId` it should be declined. An example request looks like: { \"requestHeader\": { \"protocolVersion\": { \"major\": 1 }, \"requestId\": \"DWSW4Q689HT93PJ\", \"requestTimestamp\": { \"epochMillis\": \"1481899949854\" }, \"paymentIntegratorAccountId\": \"abcdef123456\" }, \"enrollmentRequestId\": \"G1MQ0YERJ0Q7LPM\" } An example success response looks like: { \"responseHeader\": { \"responseTimestamp\": { \"epochMillis\": \"1481899949868\" } }, \"result\": { \"success\" :{} } } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/UnenrollRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/UnenrollResponse"
            }
          }
        }
      }
    },
    "/virtual-cards-v1/sendOtp": {
      "post": {
        "tags": ["payment_integrator_virtual_cards_api"],
        "operationId": "SendOtp",
        "description": "Request to the vendor to send an OTP to the user. If the endpoint encounters an error while processing the request, the response body from this endpoint should be of type `ErrorResponse`. An example request looks like: { \"requestHeader\": { \"protocolVersion\": { \"major\": 1 }, \"requestId\": \"BKD0GF23KSD8S23\", \"requestTimestamp\": { \"epochMillis\": \"1481899949606\" }, \"paymentIntegratorAccountId\": \"abcdef123456\" }, \"enrollmentRequestId\": \"SFLKJS23542ALFJ\", \"challengeOptionId\": \"G1MQ0YERJ0Q7LPM\" } An example success response looks like: { \"responseHeader\": { \"responseTimestamp\": { \"epochMillis\": \"1481899950236\" } }, \"result\": { \"success\" :{ \"maxVerificationAttempts\": \"5\", \"maxSendAttempts\": \"3\", \"expirationTimestamp\": { \"epochMillis\": \"1481899960236\" } } } } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/SendOtpRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/SendOtpResponse"
            }
          }
        }
      }
    },
    "/virtual-cards-v1/retrieveVirtualCardNumber": {
      "post": {
        "tags": ["payment_integrator_virtual_cards_api"],
        "operationId": "RetrieveVirtualCardNumber",
        "description": "Retrieves a virtual card number for a card enrolled in Virtual Cards. An example request looks like this: { \"requestHeader\": { \"protocolVersion\": { \"major\": 1 }, \"requestId\": \"BKD0GF23KSD8S23\", \"requestTimestamp\": { \"epochMillis\": \"1481899949606\" }, \"paymentIntegratorAccountId\": \"abcdef123456\" }, \"enrollmentRequestId\": \"G1MQ0YERJ0Q7LPM\", \"merchantDetails\": { \"merchantDomainName\": \"https:\/\/www.gap.com\" }, \"riskSignals\": { \"commonRiskSignals\": { \"environmentalDetails\": { \"ipAddress\": \"192.168.1.1\", \"actionContext\": \"NATIVE_APP\", \"deviceGeoLocation\": { \"latitudeE7\": \"396317000\", \"longitudeE7\": \"-86733000\" } }, \"physicalDetails\": { \"deviceToAccountBindingId\": \"0bba7f1e4a83ab4fdd77f5ebd6bd4495905f36db9c7c6e638833721e181bd837\", \"devicePhoneNumberLastFour\": \"1234\", \"deviceAccountAge\": \"LESS_THAN_SEVEN_DAYS\", \"android\": {}, \"devicePlatformAuthenticatorEnabled\": {} }, \"googleAccountDetails\": { \"mostRecentAccountPaymentMethodChangeActivity\": \"MOST_RECENT_ACCOUNT_PAYMENT_METHOD_CHANGE_ACTIVITY_LESS_THAN_ONE_DAY\", \"mostRecentAccountSecurityActivity\": \"MOST_RECENT_ACCOUNT_SECURITY_ACTIVITY_LESS_THAN_ONE_DAY\", \"accountAndCardNameMatch\": {}, \"customerPhoneNumberLastFour\": \"1234\", \"autofillPaymentMethodAttempts\": \"42\", \"cardAge\": \"LESS_THAN_SEVEN_DAYS\", \"numberOfBillingLastNames\": \"7\" }, \"googleRiskAssessment\": { \"deviceRiskScore\": \"DEVICE_RISK_SCORE_MEDIUM\", \"accountRiskScore\": \"ACCOUNT_RISK_SCORE_HIGH\" } }, \"challengeRecommended\": {} } } An example `challengeRequired` response looks like this: { \"responseHeader\": { \"responseTimestamp\": { \"epochMillis\": \"1481899950236\" } }, \"result\": { \"challengeRequired\": { \"challengeOptions\": [ { \"challengeOptionId\": \"ALFKJSG2352\", \"platformAuthentication\": {} }, { \"challengeOptionId\": \"KLHL252LKJJ\", \"smsOtp\": { \"maskedPhoneNumber\": \"(***)-***-1212\" } }, { \"challengeOptionId\": \"QJF3295JGSA\", \"smsOtp\": { \"maskedPhoneNumber\": \"(***)-***-3434\" } }, { \"challengeOptionId\": \"GCAO261QRTS\", \"emailOtp\": { \"maskedEmailAddress\": \"a***b@gmail.com\" } }, { \"challengeOptionId\": \"BQT3143SAF1\", \"emailOtp\": { \"maskedEmailAddress\": \"c***d@gmail.com\" } }, { \"challengeOptionId\": \"SKDZ384SJDID\", \"cardSecurityCode\": { \"cardSecurityCodeType\": \"CARD_SECURITY_CODE_TYPE_CVV2\", \"maxVerificationAttempts\": \"3\" } } ] } } } An example request with challenge results looks like this: { \"requestHeader\": { \"protocolVersion\": { \"major\": 1 }, \"requestId\": \"BKD0GF23KSD8S23\", \"requestTimestamp\": { \"epochMillis\": \"1481899949606\" }, \"paymentIntegratorAccountId\": \"abcdef123456\" }, \"enrollmentRequestId\": \"G1MQ0YERJ0Q7LPM\", \"merchantDetails\": { \"merchantDomainName\": \"https:\/\/www.gap.com\" }, \"riskSignals\": { \"commonRiskSignals\": { \"environmentalDetails\": { \"ipAddress\": \"192.168.1.1\", \"actionContext\": \"NATIVE_APP\", \"deviceGeoLocation\": { \"latitudeE7\": \"396317000\", \"longitudeE7\": \"-86733000\" } }, \"physicalDetails\": { \"deviceToAccountBindingId\": \"0bba7f1e4a83ab4fdd77f5ebd6bd4495905f36db9c7c6e638833721e181bd837\", \"devicePhoneNumberLastFour\": \"1234\", \"deviceAccountAge\": \"LESS_THAN_SEVEN_DAYS\", \"android\": {}, \"devicePlatformAuthenticatorEnabled\": {} }, \"googleAccountDetails\": { \"mostRecentAccountPaymentMethodChangeActivity\": \"MOST_RECENT_ACCOUNT_PAYMENT_METHOD_CHANGE_ACTIVITY_LESS_THAN_ONE_DAY\", \"mostRecentAccountSecurityActivity\": \"MOST_RECENT_ACCOUNT_SECURITY_ACTIVITY_LESS_THAN_ONE_DAY\", \"accountAndCardNameMatch\": {}, \"customerPhoneNumberLastFour\": \"1234\", \"autofillPaymentMethodAttempts\": \"42\", \"cardAge\": \"LESS_THAN_SEVEN_DAYS\", \"numberOfBillingLastNames\": \"7\" }, \"googleRiskAssessment\": { \"deviceRiskScore\": \"DEVICE_RISK_SCORE_MEDIUM\", \"accountRiskScore\": \"ACCOUNT_RISK_SCORE_HIGH\" } }, \"challengeRecommended\": {} }, \"challengeResultDetails\": { \"challengeResults\": [ { \"challengeOptionId\":\"ALFKJSG2352\", \"platformAuthentication\": {} }, { \"challengeOptionId\":\"KLHL252LKJJ\", \"otp\": { \"oneTimePassword\": \"111111\" } }, { \"challengeOptionId\":\"SKDZ384SJDID\", \"cardSecurityCode\": { \"cardSecurityCode\": \"123\" } } ] } } An example success response looks like this: { \"responseHeader\": { \"responseTimestamp\": { \"epochMillis\": \"1481899950236\" } }, \"result\": { \"success\" :{ \"virtualCard\": { \"accountNumber\": { \"value\": \"2222444466668888\" }, \"expiryDate\": { \"expiryMonth\": \"09\", \"expiryYear\": \"26\" }, \"cvn\": \"246\" } } } } For an overview of the challenge flow, see [yellow path retrieval diagrams](https:\/\/developers.google.com\/pay\/virtual-cards-v1\/reference\/vcn-sequence-diagrams#yellow_path_retrieval).",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/RetrieveVirtualCardNumberRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/RetrieveVirtualCardNumberResponse"
            }
          }
        }
      }
    }
  },
  "definitions": {
    "GetTransactionsRequest": {
      "description": "Request for the `getTransactions` method.",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2RequestHeader"
        },
        "enrollmentRequestId": {
          "description": "**REQUIRED**: A reference to an earlier enrollment request. Specifically, the identifier set in the `requestId` of the `requestHeader` sent in the `enrollRequest` that registered a card for {{product_name_short}}. This is a string that has a maximum length of 100 characters.",
          "type": "string"
        },
        "transactionListContinuationToken": {
          "description": "**OPTIONAL**: A continuation token returned during a previous call to `getTransactions`. This is used to limit the returned transactions to those that have been added or updated since the request represented by this token. If this token is not provided, the response should include all transactions for the maximum period prior to the request.",
          "type": "string"
        }
      }
    },
    "GoogleStandardpaymentsTypesV2RequestHeader": {
      "description": "Header object that is defined on all requests sent to the server.",
      "type": "object",
      "properties": {
        "requestId": {
          "description": "**REQUIRED**: Unique identifier of this request. This is a string that has a max length of 100 characters, and contains only the characters \"a-z\", \"A-Z\", \"0-9\", \":\", \"-\", and \"_\".",
          "type": "string"
        },
        "requestTimestamp": {
          "description": "**REQUIRED**: Timestamp of this request. The receiver must verify that this timestamp is \u00B1 60s of 'now', and reject the request if it is not. This request timestamp is not idempotent upon retries.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Timestamp"
        },
        "protocolVersion": {
          "description": "**REQUIRED**: The version of this request.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Version"
        },
        "paymentIntegratorAccountId": {
          "description": "**REQUIRED**: Identifies a unique account with contractual constraints.",
          "type": "string"
        }
      }
    },
    "GoogleStandardpaymentsTypesV2Timestamp": {
      "description": "A timestamp object representing a point on the ISO timeline in milliseconds since the Unix epoch.",
      "type": "object",
      "properties": {
        "epochMillis": {
          "description": "**REQUIRED**: Milliseconds since the Unix epoch",
          "type": "string",
          "format": "int64"
        }
      }
    },
    "GoogleStandardpaymentsTypesV2Version": {
      "description": "Version object contains the major version of the API. Versions of the same major version are guaranteed to be compatible. The integrator must support all requests for the same major version.",
      "type": "object",
      "properties": {
        "major": {
          "description": "**REQUIRED**: Major version. This is marked for compatibility requests with different versions are not guaranteed to be compatible.",
          "type": "integer",
          "format": "int32"
        }
      }
    },
    "GetTransactionsResponse": {
      "description": "Response for the `getTransactions` method.",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2ResponseHeader"
        },
        "result": {
          "description": "**REQUIRED**: Contains the result of the request.",
          "$ref": "#/definitions/GetTransactionsResult"
        }
      }
    },
    "GoogleStandardpaymentsTypesV2ResponseHeader": {
      "description": "Header object that is defined on all responses sent from the server.",
      "type": "object",
      "properties": {
        "responseTimestamp": {
          "description": "**REQUIRED**: Timestamp of this response. The receiver must verify that this timestamp is \u00B1 60s of 'now', and reject the response if it is not.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Timestamp"
        }
      }
    },
    "GetTransactionsResult": {
      "description": "Details corresponding to the result.",
      "type": "object",
      "properties": {
        "success": {
          "description": "The request to `getTransactions` was successful.",
          "$ref": "#/definitions/GetTransactionsResultGetTransactionsSuccessResult"
        },
        "unknownEnrollment": {
          "description": "Declined because the given `enrollmentRequestId` is not recognized. Use this result instead of an `ErrorResponse` with `invalidIdentifier`.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "unknownTransactionListContinuationToken": {
          "description": "Declined because the given `transactionListContinuationToken` is not recognized. Use this result instead of an `ErrorResponse` with `invalidIdentifier`.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "transactionDataDisabled": {
          "description": "Declined because the user has opted out of sharing transaction data.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        }
      }
    },
    "GetTransactionsResultGetTransactionsSuccessResult": {
      "description": "Details about the success result.",
      "type": "object",
      "properties": {
        "transactions": {
          "description": "**REQUIRED**: A list of transactions for this card number or token.",
          "type": "array",
          "items": {
            "$ref": "#/definitions/GetTransactionsResultTransaction"
          }
        },
        "transactionListContinuationToken": {
          "description": "**REQUIRED**: A continuation token used to limit the returned transactions of future calls to those that have been added or updated since this request, which is represented by this token.",
          "type": "string"
        }
      }
    },
    "GetTransactionsResultTransaction": {
      "description": "Details about a transaction.",
      "type": "object",
      "properties": {
        "transactionId": {
          "description": "**REQUIRED**: The unique ID of this transaction. Uniqueness is within the scope of a particular enrollment.",
          "type": "string"
        },
        "virtualCardTransactionCardNumberLastFour": {
          "description": "The last four digits of the card used to make the transaction.",
          "type": "string"
        },
        "virtualCardTransactionTokenLastFour": {
          "description": "The last four digits of the token used to make the transaction.",
          "type": "string"
        },
        "amount": {
          "description": "**REQUIRED**: The absolute value of the amount of the transaction.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Amount"
        },
        "purchase": {
          "description": "This transaction is a purchase.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "refund": {
          "description": "This transaction is a refund.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "token": {
          "description": "This is a token based transaction.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "card": {
          "description": "This is a card based transaction.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "status": {
          "description": "**REQUIRED**: Status of the transaction.",
          "$ref": "#/definitions/GetTransactionsResultStatus"
        },
        "merchantInfo": {
          "description": "**REQUIRED**: Merchant details for the transaction.",
          "$ref": "#/definitions/GetTransactionsResultMerchantInfo"
        },
        "occurredTimestamp": {
          "description": "**REQUIRED**: Timestamp (in UTC) of when this transaction occurred.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Timestamp"
        },
        "lastUpdatedTimestamp": {
          "description": "**OPTIONAL**: Timestamp (in UTC) of when this transaction was last updated.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Timestamp"
        },
        "paymentMethodUrl": {
          "description": "**OPTIONAL**: Partner-hosted card detail page URL for this payment method which is used in this particular transaction, so that user can check the payment method info. It can also be a deeplink. The URL's domain has to be the partner's domain and stable. Any potential parameters (e.g. token\/card identifiers) have to be opaque to Google.",
          "type": "string"
        },
        "transactionUrl": {
          "description": "**OPTIONAL**: Partner-hosted transaction page URL for this particular transaction, so that user can check the transaction details. It can also be a deeplink. The URL's domain has to be the partner's domain and stable. Any potential parameters (e.g. transaction ID) have to be opaque to Google.",
          "type": "string"
        }
      }
    },
    "GoogleStandardpaymentsTypesV2Amount": {
      "description": "Associates an amount in micros with a currency code.",
      "type": "object",
      "properties": {
        "amountMicros": {
          "description": "**REQUIRED**: An amount in [micros]({{glossary_path}}#micros \"What are micros?\").",
          "type": "string",
          "format": "int64"
        },
        "currencyCode": {
          "description": "**REQUIRED**: ISO 4217 3-letter currency code",
          "type": "string"
        }
      }
    },
    "GoogleStandardpaymentsTypesV2Empty": {
      "description": " This object is used for extensibility because booleans and enumerations often need to be extended with extra data. The implementer uses it to determine presence. The enumeration this represents may be extended to contain data in future versions. The JSON representation for `Empty` is empty JSON object `{}`.",
      "type": "object",
      "properties": {
      }
    },
    "GetTransactionsResultStatus": {
      "description": "Status of the transaction.",
      "type": "object",
      "properties": {
        "pending": {
          "description": "This transaction is in a pending state.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "approved": {
          "description": "This transaction is in an approved state.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "declined": {
          "description": "This transaction is in a declined state.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "cleared": {
          "description": "This transaction is in a cleared state. Also known as settled state.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "refunded": {
          "description": "This transaction is in a refunded state. Also known as reversal state.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        }
      }
    },
    "GetTransactionsResultMerchantInfo": {
      "description": "Merchant details for the transaction.",
      "type": "object",
      "properties": {
        "merchantName": {
          "description": "**REQUIRED**: The merchant name for this transaction.",
          "type": "string"
        },
        "address": {
          "description": "**REQUIRED**: The address of the merchant used to make the purchase.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Address"
        },
        "merchantCategoryCode": {
          "description": "**OPTIONAL**: This is the ISO 18245 merchant category code (MCC) identifying the type of goods\/services being purchased by the user.",
          "type": "string"
        },
        "appPackageName": {
          "description": "The merchant's app package name where the transaction happened.",
          "type": "string"
        },
        "merchantDomainName": {
          "description": "The merchant's domain from the web URL where the transaction happened.",
          "type": "string"
        }
      }
    },
    "GoogleStandardpaymentsTypesV2Address": {
      "description": "Structure holding information about a physical address.",
      "type": "object",
      "properties": {
        "addressLine": {
          "description": "**OPTIONAL**: This holds unstructured Address text.",
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "localityName": {
          "description": "**OPTIONAL**: This is something of a fuzzy term, but it generally refers to the city\/town portion of an address. In regions of the world where localities are not well defined or do not fit into this structure well (for example, Japan and China), leave locality_name empty and use address_line. Examples: US city, IT comune, UK post town.",
          "type": "string"
        },
        "administrativeAreaName": {
          "description": "**OPTIONAL**: Top-level administrative subdivision of this country\" Examples: US state, IT region, CN province, JP prefecture.\"",
          "type": "string"
        },
        "postalCodeNumber": {
          "description": "**OPTIONAL**: Despite the name, postal_code_number values are frequently alphanumeric. Examples: \"94043\", \"SW1W\", \"SW1W 9TQ\".",
          "type": "string"
        },
        "countryCode": {
          "description": "**OPTIONAL**: Customer address country code, expected to be ISO-3166-1 Alpha-2.",
          "type": "string"
        }
      }
    },
    "GoogleStandardpaymentsTypesV2ErrorResponse": {
      "description": "Error Response object for all methods.",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2ResponseHeader"
        },
        "errorDescription": {
          "description": "**OPTIONAL**: Provide a description of this status for support reps to debug errors. Note that this is never shown to users. It can contain descriptive, non-sensitive text used for debugging. Note that some values for errorResponseCode should be accompanied by additional detail in this field. Warning: Do not include any tokens in this message unless they are defined as public.",
          "type": "string"
        },
        "paymentIntegratorErrorIdentifier": {
          "description": "**OPTIONAL**: This identifier is specific to the integrator and is generated by the integrator. It is used for debugging purposes only in order to identify this call. This is the identifier that the integrator knows this call by.",
          "type": "string"
        },
        "errorResponseResult": {
          "description": "**OPTIONAL**: A code that captures the type of error that occurred.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2ErrorResponseErrorResponseResult"
        }
      }
    },
    "GoogleStandardpaymentsTypesV2ErrorResponseErrorResponseResult": {
      "description": "Error Codes",
      "type": "object",
      "properties": {
        "invalidApiVersion": {
          "description": "Used if the request's API version is unsupported. Advised HTTP Code: 400",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2ErrorResponseInvalidApiVersion"
        },
        "invalidPayloadSignature": {
          "description": "Used if the signature of the payload is to an unknown or inactive key. Advised HTTP Code: 401",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2ErrorResponseInvalidPayloadSignature"
        },
        "invalidPayloadEncryption": {
          "description": "Used if the encryption of the payload is to an unknown or inactive key. Advised HTTP Code: 400",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2ErrorResponseInvalidPayloadEncryption"
        },
        "requestTimestampOutOfRange": {
          "description": "Used if the request_timestamp is not \u00B1 60s of now. Advised HTTP Code: 400",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2ErrorResponseRequestTimestampOutOfRange"
        },
        "invalidIdentifier": {
          "description": "Used if an identifier sent in the request was invalid or unknown. This may include PIAID, captureRequestId, Google Payment Token, etc. Advised HTTP Code: 404",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2ErrorResponseInvalidIdentifier"
        },
        "idempotencyViolation": {
          "description": "Used if the request violates the idempotency requirements for the request. Advised HTTP Code: 412",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2ErrorResponseIdempotencyViolation"
        },
        "invalidFieldValue": {
          "description": "Used if the request contains a value for a field that isn't in the set of supported values. Advised HTTP Code: 400",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2ErrorResponseInvalidFieldValue"
        },
        "missingRequiredField": {
          "description": "Used if a field that is required is unset in the request. Advised HTTP Code: 400",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2ErrorResponseMissingRequiredField"
        },
        "preconditionViolation": {
          "description": "Used if a constraint on the operation is violated (e.g. when a request for a refund amount exceeds the amount remaining on the transaction). Advised HTTP Code: 400",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2ErrorResponsePreconditionViolation"
        },
        "userActionInProgress": {
          "description": "Used if the request cannot be processed at this time because it would interrupt an in-process user action which effectively acts as a system lock. This code must *not* be used to indicate failures due to implementation-specific internal concurrency errors. Advised HTTP Code: 423",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2ErrorResponseUserActionInProgress"
        },
        "invalidDecryptedRequest": {
          "description": "Used if the request payload could be decrypted, but the resulting message could not be parsed. Advised HTTP Code: 400",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2ErrorResponseInvalidDecryptedRequest"
        },
        "forbidden": {
          "description": "Access to the requested resource is forbidden. Advised Http Code: 403",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2ErrorResponseForbidden"
        }
      }
    },
    "GoogleStandardpaymentsTypesV2ErrorResponseInvalidApiVersion": {
      "description": "Used if the request's API version is unsupported.",
      "type": "object",
      "properties": {
        "requestVersion": {
          "description": "**REQUIRED**: The invalid version that was specified on the request.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Version"
        },
        "expectedVersion": {
          "description": "**REQUIRED**: The expected version.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Version"
        }
      }
    },
    "GoogleStandardpaymentsTypesV2ErrorResponseInvalidPayloadSignature": {
      "description": "This message is intentionally empty right now. New fields could be added in the future.",
      "type": "object",
      "properties": {
      }
    },
    "GoogleStandardpaymentsTypesV2ErrorResponseInvalidPayloadEncryption": {
      "description": "This message is intentionally empty right now. New fields could be added in the future.",
      "type": "object",
      "properties": {
      }
    },
    "GoogleStandardpaymentsTypesV2ErrorResponseRequestTimestampOutOfRange": {
      "description": "Used if the request_timestamp is not \u00B1 60s of now.",
      "type": "object",
      "properties": {
        "requestTimestamp": {
          "description": "**REQUIRED**: The timestamp provided in the request",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Timestamp"
        },
        "serverTimestampAtReceipt": {
          "description": "**REQUIRED**: The server time at receipt, used for comparison",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Timestamp"
        }
      }
    },
    "GoogleStandardpaymentsTypesV2ErrorResponseInvalidIdentifier": {
      "description": "Used if an identifier sent in the request was invalid or unknown. This may include PIAID, captureRequestId, Google Payment Token, etc.",
      "type": "object",
      "properties": {
        "invalidIdentifierType": {
          "description": "**REQUIRED**: The type of identifier that was invalid, e.g. PIAID, captureRequestId, etc.",
          "type": "string"
        }
      }
    },
    "GoogleStandardpaymentsTypesV2ErrorResponseIdempotencyViolation": {
      "description": "This message is intentionally empty right now. New fields could be added in the future.",
      "type": "object",
      "properties": {
      }
    },
    "GoogleStandardpaymentsTypesV2ErrorResponseInvalidFieldValue": {
      "description": "Used if the request contains a value for a field that isn't in the set of supported values.",
      "type": "object",
      "properties": {
        "invalidFieldName": {
          "description": "**REQUIRED**: The name of the field that was found to be invalid.",
          "type": "string"
        }
      }
    },
    "GoogleStandardpaymentsTypesV2ErrorResponseMissingRequiredField": {
      "description": "Used if a field that is required is unset in the request.",
      "type": "object",
      "properties": {
        "missingFieldNames": {
          "description": "**REQUIRED**: The names of the missing fields.",
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      }
    },
    "GoogleStandardpaymentsTypesV2ErrorResponsePreconditionViolation": {
      "description": "This message is intentionally empty right now. New fields could be added in the future.",
      "type": "object",
      "properties": {
      }
    },
    "GoogleStandardpaymentsTypesV2ErrorResponseUserActionInProgress": {
      "description": "This message is intentionally empty right now. New fields could be added in the future.",
      "type": "object",
      "properties": {
      }
    },
    "GoogleStandardpaymentsTypesV2ErrorResponseInvalidDecryptedRequest": {
      "description": "This message is intentionally empty right now. New fields could be added in the future.",
      "type": "object",
      "properties": {
      }
    },
    "GoogleStandardpaymentsTypesV2ErrorResponseForbidden": {
      "description": "This message is intentionally empty right now. New fields could be added in the future.",
      "type": "object",
      "properties": {
      }
    },
    "EchoRequest": {
      "description": "Request object for the echo method.",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2RequestHeader"
        },
        "clientMessage": {
          "description": "**REQUIRED**: Message to echo in the response.",
          "type": "string"
        }
      }
    },
    "EchoResponse": {
      "description": "Response object for the echo method.",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2ResponseHeader"
        },
        "clientMessage": {
          "description": "**REQUIRED**: Message received in the request.",
          "type": "string"
        },
        "serverMessage": {
          "description": "**OPTIONAL**: Server message, independent of the `clientMessage` being echoed.",
          "type": "string"
        }
      }
    },
    "EnrollRequest": {
      "description": "Request object for the `enroll` method.",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests. This header contains the `requestId` which is known as the `enrollmentRequestId` in other methods. It will be used in subsequent calls as a reference to the enrollment request which registered a card for Virtual Cards. The same card can be enrolled multiple times, either by multiple users (different `hashedEmailAddress`) or a single user (same `hashedEmailAddress`) with [multiple payment profiles](https:\/\/support.google.com\/googlepay\/answer\/7644003?visit_id=638253754129670000-3896145703&rd=2#multiple-profiles). If a card is enrolled, un-enrolled, then enrolled again for Virtual Cards, the new enrollment will have a new `requestId`.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2RequestHeader"
        },
        "cardToEnroll": {
          "description": "**REQUIRED**: The card to enroll in Virtual Cards.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2MinimumRequiredCardInfo"
        },
        "riskSignals": {
          "description": "**REQUIRED**: The risk signals used by the vendor to make a risk assessment.",
          "$ref": "#/definitions/EnrollRequestEnrollmentRiskSignals"
        },
        "googleManagedAcceptanceDetails": {
          "description": "The presence of this field indicates that the customer accepted the partner's terms of service. This contains additional information gathered when they accepted.",
          "$ref": "#/definitions/EnrollRequestTermsOfServiceAcceptance"
        },
        "externallyManagedAcceptance": {
          "description": "The presence of this field indicates that the partner's terms of service was not surfaced through Google.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "customerDetails": {
          "description": "**REQUIRED** Details about the customer.",
          "$ref": "#/definitions/EnrollRequestCustomerDetails"
        }
      }
    },
    "GoogleStandardpaymentsTypesV2MinimumRequiredCardInfo": {
      "description": "FPAN representation of a card with an expiration date. No CVN.",
      "type": "object",
      "properties": {
        "accountNumber": {
          "description": "**REQUIRED**: The account number itself (i.e., the FPAN).",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2AccountNumber"
        },
        "expiryDate": {
          "description": "**REQUIRED**: Expiration date, month and year.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2ExpiryDate"
        }
      }
    },
    "GoogleStandardpaymentsTypesV2AccountNumber": {
      "description": "The account number itself (i.e., the FPAN).",
      "type": "object",
      "properties": {
        "value": {
          "description": "**REQUIRED**: The account number itself (i.e., the FPAN). This is a string that has 14-19 characters and contains only the characters \"0-9\".",
          "type": "string"
        }
      }
    },
    "GoogleStandardpaymentsTypesV2ExpiryDate": {
      "description": "Expiration date, the month and the year.",
      "type": "object",
      "properties": {
        "expiryMonth": {
          "description": "**REQUIRED**: Expiration month, formatted `MM`.",
          "type": "string"
        },
        "expiryYear": {
          "description": "**REQUIRED**: Expiration year, formatted `YY`.",
          "type": "string"
        }
      }
    },
    "EnrollRequestEnrollmentRiskSignals": {
      "description": "Information used by the vendor to make risk assessment about enrolling the card in Virtual Cards.",
      "type": "object",
      "properties": {
        "commonRiskSignals": {
          "description": "**REQUIRED** Common request risk signals.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesVirtualCardsV1RiskSignals"
        },
        "customerRiskDetails": {
          "description": "**REQUIRED** Details about the customer.",
          "$ref": "#/definitions/EnrollRequestEnrollmentRiskSignalsCustomerRiskDetails"
        },
        "panSourceWeb": {
          "description": "The PAN was sourced on a web browser.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "panSourceAndroid": {
          "description": "The PAN was sourced on an Android client.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "panSourceIos": {
          "description": "The PAN was sourced on an iOS client.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "panSourceUnknown": {
          "description": "The source of the PAN is unknown.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        }
      }
    },
    "GoogleStandardpaymentsTypesVirtualCardsV1RiskSignals": {
      "description": "Common request risk signals.",
      "type": "object",
      "properties": {
        "environmentalDetails": {
          "description": "**REQUIRED**: Environmental details about the device. These details are particular to the environment the physical device is located in, and therefore are expected to change over time.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesVirtualCardsV1RiskSignalsEnvironmentalDetails"
        },
        "physicalDetails": {
          "description": "**REQUIRED** Physical details about the device.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesVirtualCardsV1RiskSignalsPhysicalDetails"
        },
        "googleAccountDetails": {
          "description": "**REQUIRED** Details about the customer's Google account.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesVirtualCardsV1RiskSignalsGoogleAccountDetails"
        },
        "googleRiskAssessment": {
          "description": "**REQUIRED** Details about Google's risk assessment.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesVirtualCardsV1RiskSignalsGoogleRiskAssessment"
        }
      }
    },
    "GoogleStandardpaymentsTypesVirtualCardsV1RiskSignalsEnvironmentalDetails": {
      "description": "Environmental details about the device.",
      "type": "object",
      "properties": {
        "ipAddress": {
          "description": "**REQUIRED**: IP Address of the device making the request. This is a string that can be in IPv4 or IPv6 format.",
          "type": "string"
        },
        "actionContext": {
          "description": "**REQUIRED**: The context in which the action that triggered the request took place.",
          "type": "string",
          "enum": [
            "ACTION_CONTEXT_UNSPECIFIED",
            "WEB",
            "NATIVE_APP"
          ]
        },
        "deviceGeoLocation": {
          "description": "**OPTIONAL**: Anonymized lat\/long of the device at the time of request if it is available.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2AnonymizedUserLocation"
        }
      }
    },
    "GoogleStandardpaymentsTypesV2AnonymizedUserLocation": {
      "description": "A latitude and longitude used to describe an anonymized user location on the Earth's surface.",
      "type": "object",
      "properties": {
        "latitudeE7": {
          "description": "**REQUIRED**: Latitude in the range +\/- 90 degrees (inclusive). Units are degrees x 10^7. For example, 39.6317 degrees North is represented as 396317000.",
          "type": "string",
          "format": "int64"
        },
        "longitudeE7": {
          "description": "**REQUIRED**: Longitude in the range +\/- 180 degrees (inclusive). Units are degrees x 10^7. For example, 8.6733 degrees West is represented as -86733000.",
          "type": "string",
          "format": "int64"
        }
      }
    },
    "GoogleStandardpaymentsTypesVirtualCardsV1RiskSignalsPhysicalDetails": {
      "description": "Physical details about the device",
      "type": "object",
      "properties": {
        "deviceToAccountBindingId": {
          "description": "**REQUIRED**: This identifier uniquely identifies the device for the user. It is not stable across factory resets. It is not stable across users, so two Google users using the same device will have different values. The value will be different for different partners. This is a string that has 64 characters and contains only the characters \"0-9\" and \"a-f\".",
          "type": "string"
        },
        "deviceAccountAge": {
          "description": "**REQUIRED**: The age range the device account falls into.",
          "type": "string",
          "enum": [
            "DEVICE_ACCOUNT_AGE_BUCKET_UNSPECIFIED",
            "LESS_THAN_ONE_DAY",
            "LESS_THAN_SEVEN_DAYS",
            "LESS_THAN_THIRTY_DAYS",
            "LESS_THAN_ONE_YEAR",
            "ONE_YEAR_OR_GREATER"
          ]
        },
        "devicePhoneNumberLastFour": {
          "description": "**OPTIONAL**: Last four digits of the device phone number if it is available. This is a string that has 4 characters and contains only the characters \"0-9\".",
          "type": "string"
        },
        "android": {
          "description": "A device on an Android platform.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "desktop": {
          "description": "A device on a desktop platform.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "ios": {
          "description": "A device on an iOS platform.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "devicePlatformAuthenticatorDisabled": {
          "description": "Platform Authenticator is disabled on this device.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "devicePlatformAuthenticatorEnabled": {
          "description": "Platform Authenticator is enabled on this device.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        }
      }
    },
    "GoogleStandardpaymentsTypesVirtualCardsV1RiskSignalsGoogleAccountDetails": {
      "description": "Details about the customer's Google account.",
      "type": "object",
      "properties": {
        "mostRecentAccountPaymentMethodChangeActivity": {
          "description": "**REQUIRED**: Time elapsed since the most recent create\/update\/delete action that occurred for payment methods under the Google account.",
          "type": "string",
          "enum": [
            "MOST_RECENT_ACCOUNT_PAYMENT_METHOD_CHANGE_ACTIVITY_UNSPECIFIED",
            "MOST_RECENT_ACCOUNT_PAYMENT_METHOD_CHANGE_ACTIVITY_LESS_THAN_ONE_DAY",
            "MOST_RECENT_ACCOUNT_PAYMENT_METHOD_CHANGE_ACTIVITY_LESS_THAN_SEVEN_DAYS",
            "MOST_RECENT_ACCOUNT_PAYMENT_METHOD_CHANGE_ACTIVITY_LESS_THAN_THIRTY_DAYS",
            "MOST_RECENT_ACCOUNT_PAYMENT_METHOD_CHANGE_ACTIVITY_LESS_THAN_ONE_YEAR",
            "MOST_RECENT_ACCOUNT_PAYMENT_METHOD_CHANGE_ACTIVITY_ONE_YEAR_OR_GREATER"
          ]
        },
        "mostRecentAccountSecurityActivity": {
          "description": "**REQUIRED**: Time elapsed since the most recent password or two-factor authentication change on the Google account.",
          "type": "string",
          "enum": [
            "MOST_RECENT_ACCOUNT_SECURITY_ACTIVITY_UNSPECIFIED",
            "MOST_RECENT_ACCOUNT_SECURITY_ACTIVITY_LESS_THAN_ONE_DAY",
            "MOST_RECENT_ACCOUNT_SECURITY_ACTIVITY_LESS_THAN_SEVEN_DAYS",
            "MOST_RECENT_ACCOUNT_SECURITY_ACTIVITY_LESS_THAN_THIRTY_DAYS",
            "MOST_RECENT_ACCOUNT_SECURITY_ACTIVITY_LESS_THAN_ONE_YEAR",
            "MOST_RECENT_ACCOUNT_SECURITY_ACTIVITY_ONE_YEAR_OR_GREATER"
          ]
        },
        "accountAndCardNameMatch": {
          "description": "The names match.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "accountAndCardNameNoMatch": {
          "description": "The names do not match.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "unknownCardholderName": {
          "description": "Google does not know the name on the card and therefore cannot compare the names.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "customerPhoneNumberLastFour": {
          "description": "**OPTIONAL**: Last four digits of the customer phone number if it is available. This is a string that has 4 characters and contains only the characters \"0-9\".",
          "type": "string"
        },
        "autofillPaymentMethodAttempts": {
          "description": "**REQUIRED**: Number of attempts to add a payment method to the Google account over the past 24 hours via Autofill.",
          "type": "string",
          "format": "int64"
        },
        "cardAge": {
          "description": "**REQUIRED**: The age range the card falls into. Card age is the length of time since the card was added to the Google account.",
          "type": "string",
          "enum": [
            "CARD_AGE_BUCKET_UNSPECIFIED",
            "LESS_THAN_ONE_DAY",
            "LESS_THAN_SEVEN_DAYS",
            "LESS_THAN_THIRTY_DAYS",
            "LESS_THAN_ONE_YEAR",
            "ONE_YEAR_OR_GREATER"
          ]
        },
        "numberOfBillingLastNames": {
          "description": "**REQUIRED**: Number of distinct billing last names present in the Google account.",
          "type": "string",
          "format": "int64"
        }
      }
    },
    "GoogleStandardpaymentsTypesVirtualCardsV1RiskSignalsGoogleRiskAssessment": {
      "description": "Details about Google's risk assessment.",
      "type": "object",
      "properties": {
        "deviceRiskScore": {
          "description": "**OPTIONAL**: Google's assessment of the riskiness of the device, when available.",
          "type": "string",
          "enum": [
            "DEVICE_RISK_SCORE_UNSPECIFIED",
            "DEVICE_RISK_SCORE_VERY_LOW",
            "DEVICE_RISK_SCORE_LOW",
            "DEVICE_RISK_SCORE_MEDIUM",
            "DEVICE_RISK_SCORE_HIGH",
            "DEVICE_RISK_SCORE_VERY_HIGH"
          ]
        },
        "accountRiskScore": {
          "description": "**REQUIRED**: Google's assessment of the riskiness of the Google account.",
          "type": "string",
          "enum": [
            "ACCOUNT_RISK_SCORE_UNSPECIFIED",
            "ACCOUNT_RISK_SCORE_VERY_LOW",
            "ACCOUNT_RISK_SCORE_LOW",
            "ACCOUNT_RISK_SCORE_MEDIUM",
            "ACCOUNT_RISK_SCORE_HIGH",
            "ACCOUNT_RISK_SCORE_VERY_HIGH"
          ]
        }
      }
    },
    "EnrollRequestEnrollmentRiskSignalsCustomerRiskDetails": {
      "description": "Details about the customer.",
      "type": "object",
      "properties": {
        "hashedEmailAddress": {
          "description": "**REQUIRED**: A hash of the customer's email address. This is stable for the same email address across multiple enrollments. The value for a given email address will be different for different partners. This is a string that has 64 characters and contains only the characters \"0-9\" and \"a-f\".",
          "type": "string"
        },
        "customerActionType": {
          "description": "**REQUIRED**: The action the customer took to trigger the enrollment.",
          "type": "string",
          "enum": [
            "CUSTOMER_ACTION_TYPE_UNSPECIFIED",
            "PUSH_PROVISIONING",
            "NEW_CARD",
            "EXISTING_CARD"
          ]
        },
        "accountAge": {
          "description": "**REQUIRED**: Tenure of the Google account.",
          "type": "string",
          "enum": [
            "ACCOUNT_AGE_BUCKET_UNSPECIFIED",
            "ACCOUNT_AGE_BUCKET_LESS_THAN_ONE_DAY",
            "ACCOUNT_AGE_BUCKET_LESS_THAN_SEVEN_DAYS",
            "ACCOUNT_AGE_BUCKET_LESS_THAN_THIRTY_DAYS",
            "ACCOUNT_AGE_BUCKET_LESS_THAN_ONE_YEAR",
            "ACCOUNT_AGE_BUCKET_ONE_YEAR_OR_GREATER"
          ]
        }
      }
    },
    "EnrollRequestTermsOfServiceAcceptance": {
      "description": "The presence of this field indicates that the customer accepted the partner's terms of service. This contains additional information gathered when they accepted.",
      "type": "object",
      "properties": {
        "acceptanceTimestamp": {
          "description": "**REQUIRED**: The timestamp when the customer accepted the partner's terms of service.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Timestamp"
        },
        "version": {
          "description": "**REQUIRED**: The version of the partner's terms of service that the customer accepted.",
          "type": "string"
        }
      }
    },
    "EnrollRequestCustomerDetails": {
      "description": "Details about the customer.",
      "type": "object",
      "properties": {
        "maskedEmailAddress": {
          "description": "**REQUIRED**: The masked email of the customer enrolling the card. Used in the issuer's ecosystem to indicate to a customer which accounts have enrolled the card. Three asterisks are used to mask the symbols between the first and last symbols of an email address. (Ex: \u201Cl***r@gmail.com\u201D) The result is not a valid email address.",
          "type": "string"
        }
      }
    },
    "EnrollResponse": {
      "description": "Response object for the `enroll` method.",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2ResponseHeader"
        },
        "result": {
          "description": "**REQUIRED**: Contains the result of the request.",
          "$ref": "#/definitions/EnrollResult"
        }
      }
    },
    "EnrollResult": {
      "description": "Details corresponding to the result.",
      "type": "object",
      "properties": {
        "success": {
          "description": "The request to `enroll` was successful and the card is enrolled in Virtual Cards.",
          "$ref": "#/definitions/EnrollResultEnrollSuccessResult"
        },
        "invalidCardDetails": {
          "description": "**DEPRECATED**: All decline cases covered by this case should instead be covered by `cardAccountClosed`, `panNoLongerValid`, `unknownPan`, or `incorrectExpiration`. *Note:*This field will be removed once all usages of it has been migrated to other fields in the `EnrollResult.result` union field. ETA: H1 2024. Declined because the card details, while formatted correctly, were invalid. (e.g. The expiration date did not match).",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "cardIneligible": {
          "description": "Declined because the card was valid\/active, but ineligible to be enrolled in Virtual Cards. The card could potentially become eligible at a future date.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "riskDeclined": {
          "description": "Declined for risk reasons.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "tosNotAccepted": {
          "description": "Declined because the customer has not accepted the partner's terms of service. This result is only applicable if the partner's terms of service was not surfaced through Google, i.e. the request contained 'externallyManagedAcceptance'.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "tosAcceptanceOutdated": {
          "description": "Declined because too much time has passed since the customer's acceptance of the partner's terms of service and the enrollment attempt. This result is only applicable if the partner's terms of service was not surfaced through Google, i.e. the request contained 'externallyManagedAcceptance'.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "cardAccountClosed": {
          "description": "Declined because the card account has been closed or is effectively closed (i.e. the underlying account with the financial institution is closed or in a similar terminal state, e.g. bankrupt). The user may still have other active card accounts with this financial institution.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "panNoLongerValid": {
          "description": "Declined because the PAN is no longer valid, i.e. the PAN is recognized but has been invalidated or updated (card lost, stolen, expired, etc). The underlying card account is still open (use cardAccountClosed otherwise).",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "unknownPan": {
          "description": "Declined because the PAN was unrecognized.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "incorrectExpiration": {
          "description": "Declined because the expiration was incorrect.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        }
      }
    },
    "EnrollResultEnrollSuccessResult": {
      "description": "Details about the success result.",
      "type": "object",
      "properties": {
      }
    },
    "UnenrollRequest": {
      "description": "Request object for the `unenroll` method.",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2RequestHeader"
        },
        "enrollmentRequestId": {
          "description": "**REQUIRED**: A reference to an earlier enrollment request. Specifically, the identifier set in the `requestId` of the `requestHeader` sent in the `enrollRequest` that registered a card for Virtual Cards. This is a string that has a maximum length of 100 characters.",
          "type": "string"
        }
      }
    },
    "UnenrollResponse": {
      "description": "Response object for the `unenroll` method.",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2ResponseHeader"
        },
        "result": {
          "description": "**REQUIRED**: Contains the result of the request.",
          "$ref": "#/definitions/UnenrollResult"
        }
      }
    },
    "UnenrollResult": {
      "description": "Details corresponding to the result.",
      "type": "object",
      "properties": {
        "success": {
          "description": "The request to `unenroll` was successful.",
          "$ref": "#/definitions/UnenrollResultUnenrollSuccessResult"
        }
      }
    },
    "UnenrollResultUnenrollSuccessResult": {
      "description": "Details about the success result.",
      "type": "object",
      "properties": {
      }
    },
    "SendOtpRequest": {
      "description": "Request object for the `sendOtp` method.",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2RequestHeader"
        },
        "enrollmentRequestId": {
          "description": "**REQUIRED**: A reference to an earlier enrollment request. Specifically, the identifier set in the `requestId` of the `requestHeader` sent in the `enrollRequest` that registered a card for {{product_name_short}}. This is a string that has a maximum length of 100 characters.",
          "type": "string"
        },
        "challengeOptionId": {
          "description": "**REQUIRED**: A reference to an OTP challenge option returned in a previous call, indicating that the user has selected this particular OTP option. This is a string that has a maximum length of 100 characters. Valid characters: [`a-zA-Z0-9:_-`]",
          "type": "string"
        }
      }
    },
    "SendOtpResponse": {
      "description": "Response object for the `sendotp` method.",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2ResponseHeader"
        },
        "result": {
          "description": "**REQUIRED**: Contains the result of the request.",
          "$ref": "#/definitions/SendOtpResult"
        }
      }
    },
    "SendOtpResult": {
      "description": "Details corresponding to the result.",
      "type": "object",
      "properties": {
        "success": {
          "description": "The request to `sendOtp` was successful.",
          "$ref": "#/definitions/SendOtpResultSendOtpSuccessResult"
        },
        "challengeOptionExpired": {
          "description": "Declined because the challenge option has expired.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "sendLimitExceeded": {
          "description": "Declined because the maximum number of times the OTP can be sent has been exceeded.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "accountLocked": {
          "description": "Declined because the user's account has been locked.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "riskDeclined": {
          "description": "Declined due to risk.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        }
      }
    },
    "SendOtpResultSendOtpSuccessResult": {
      "description": "Details about the success result.",
      "type": "object",
      "properties": {
        "maxVerificationAttempts": {
          "description": "**REQUIRED** The maximum amount of times the OTP can be verified.",
          "type": "string",
          "format": "int64"
        },
        "maxSendAttempts": {
          "description": "**REQUIRED** The maximum amount of times the sending the OTP can be requested for this particular challenge option.",
          "type": "string",
          "format": "int64"
        },
        "expirationTimestamp": {
          "description": "**REQUIRED** The expiration timestamp after which the OTP will no longer be accepted.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Timestamp"
        }
      }
    },
    "RetrieveVirtualCardNumberRequest": {
      "description": "Request object for the `retrieveVirtualCardNumber` method.",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2RequestHeader"
        },
        "enrollmentRequestId": {
          "description": "**REQUIRED**: A reference to an earlier enrollment request. Specifically, the identifier set in the `requestId` of the `requestHeader` sent in the `enrollRequest` that registered a card for Virtual Cards. This is a string that has a maximum length of 100 characters.",
          "type": "string"
        },
        "merchantDetails": {
          "description": "**REQUIRED**: Details about the merchant that will accept the virtual card number.",
          "$ref": "#/definitions/RetrieveVirtualCardNumberRequestMerchantDetails"
        },
        "riskSignals": {
          "description": "**REQUIRED**: The risk signals used by the vendor to make a risk assessment.",
          "$ref": "#/definitions/RetrieveVirtualCardNumberRequestRetrieveVirtualCardNumberRiskSignals"
        },
        "challengeResultDetails": {
          "description": "**OPTIONAL** Challenge result information, provided after the user completes any requested challenges. The presence indicates the user has completed, or attempted to complete a given challenge.",
          "$ref": "#/definitions/RetrieveVirtualCardNumberRequestChallengeResultDetails"
        }
      }
    },
    "RetrieveVirtualCardNumberRequestMerchantDetails": {
      "description": "Details about a merchant that will accept the virtual card.",
      "type": "object",
      "properties": {
        "appPackageName": {
          "description": "The merchant's app package name where the virtual card number will be used.",
          "type": "string"
        },
        "merchantDomainName": {
          "description": "The merchant's domain from the web URL where the virtual card number will be used.",
          "type": "string"
        }
      }
    },
    "RetrieveVirtualCardNumberRequestRetrieveVirtualCardNumberRiskSignals": {
      "description": "Information used by the vendor to make risk assessment about a virtual card number retrieval.",
      "type": "object",
      "properties": {
        "commonRiskSignals": {
          "description": "**REQUIRED** Common request risk signals.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesVirtualCardsV1RiskSignals"
        },
        "challengeNotRecommended": {
          "description": "The user should not be challenged.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "challengeRecommended": {
          "description": "The user should be challenged.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        }
      }
    },
    "RetrieveVirtualCardNumberRequestChallengeResultDetails": {
      "description": "Information on any challenge results submitted with the request.",
      "type": "object",
      "properties": {
        "challengeResults": {
          "description": "**REQUIRED** The list of challenge results.",
          "type": "array",
          "items": {
            "$ref": "#/definitions/RetrieveVirtualCardNumberRequestChallengeResult"
          }
        }
      }
    },
    "RetrieveVirtualCardNumberRequestChallengeResult": {
      "description": "Details about a specific challenge result.",
      "type": "object",
      "properties": {
        "challengeOptionId": {
          "description": "**REQUIRED**: The globally unique reference identifying a specific challenge option. This is a string that has a maximum length of 100 characters. Valid characters: [`a-zA-Z0-9:_-`]",
          "type": "string"
        },
        "platformAuthentication": {
          "description": "A platform authentication verified by Google.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "otp": {
          "description": "An OTP result received from an out-of-band communication.",
          "$ref": "#/definitions/RetrieveVirtualCardNumberRequestOtpChallengeResult"
        },
        "cardSecurityCode": {
          "description": "A card security code input by the user.",
          "$ref": "#/definitions/RetrieveVirtualCardNumberRequestCardSecurityCodeChallengeResult"
        }
      }
    },
    "RetrieveVirtualCardNumberRequestOtpChallengeResult": {
      "description": "The result details of an OTP challenge.",
      "type": "object",
      "properties": {
        "oneTimePassword": {
          "description": "**REQUIRED** The OTP as submitted by the user for verification. The format is 6-digit numerical.",
          "type": "string"
        }
      }
    },
    "RetrieveVirtualCardNumberRequestCardSecurityCodeChallengeResult": {
      "description": "The result details of a card security code challenge.",
      "type": "object",
      "properties": {
        "cardSecurityCode": {
          "description": "**REQUIRED** The card security code as submitted by the user for verification. The format is 3-5 numerical digits.",
          "type": "string"
        }
      }
    },
    "RetrieveVirtualCardNumberResponse": {
      "description": "Response object for the `retrieveVirtualCardNumber` method.",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2ResponseHeader"
        },
        "result": {
          "description": "**REQUIRED**: Contains the result of the request.",
          "$ref": "#/definitions/RetrieveVirtualCardNumberResult"
        }
      }
    },
    "RetrieveVirtualCardNumberResult": {
      "description": "Details corresponding to the result.",
      "type": "object",
      "properties": {
        "success": {
          "description": "The request to `retrieveVirtualCardNumber` was successful the virtual card number was procured.",
          "$ref": "#/definitions/RetrieveVirtualCardNumberResultRetrieveVirtualCardNumberSuccessResult"
        },
        "riskDeclined": {
          "description": "Declined for risk reasons.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "cardIneligible": {
          "description": "Declined because the given enrollment is ineligible to retrieve a virtual card number.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "unsupportedMerchant": {
          "description": "Declined because the virtual card is not supported at this merchant. This can either be because the merchant has opted not to accept virtual cards, or because the partner does not support using virtual cards at this merchant.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "bankWebsiteAccountSignupRequired": {
          "description": "Declined because the user needs to sign up for an account on the bank's website before virtual card numbers can be retrieved.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "challengeRequired": {
          "description": "The payment integrator requires a challenge to retrieve the virtual card number.",
          "$ref": "#/definitions/RetrieveVirtualCardNumberResultChallengeRequiredDeclinedResult"
        },
        "challengeResultInvalid": {
          "description": "A provided challenge result has an invalid value.",
          "$ref": "#/definitions/RetrieveVirtualCardNumberResultChallengeResultInvalidDeclinedResult"
        },
        "challengeResultExpired": {
          "description": "A provided challenge result exceeded the time limit.",
          "$ref": "#/definitions/RetrieveVirtualCardNumberResultChallengeResultExpiredDeclinedResult"
        },
        "challengeResultVerificationLimitExceeded": {
          "description": "A provided challenge result exceeded the retry limit.",
          "$ref": "#/definitions/RetrieveVirtualCardNumberResultChallengeResultRetryExceededDeclinedResult"
        }
      }
    },
    "RetrieveVirtualCardNumberResultRetrieveVirtualCardNumberSuccessResult": {
      "description": "Details about the success result.",
      "type": "object",
      "properties": {
        "virtualCard": {
          "description": "**REQUIRED**: Contains the virtual card number information.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2VerifiableMinimumRequiredCardInfo"
        }
      }
    },
    "GoogleStandardpaymentsTypesV2VerifiableMinimumRequiredCardInfo": {
      "description": "FPAN representation of a card with an expiration date. Includes CVN.",
      "type": "object",
      "properties": {
        "accountNumber": {
          "description": "**REQUIRED**: The account number itself (i.e., the FPAN).",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2AccountNumber"
        },
        "expiryDate": {
          "description": "**REQUIRED**: Expiration date, month and year.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2ExpiryDate"
        },
        "cvn": {
          "description": "**REQUIRED**: The card verification number (CVN) for the given `accountNumber`. This is a string of 3-4 digits.",
          "type": "string"
        }
      }
    },
    "RetrieveVirtualCardNumberResultChallengeRequiredDeclinedResult": {
      "description": "Details about a challenge required result.",
      "type": "object",
      "properties": {
        "challengeOptions": {
          "description": "**REQUIRED** a list of challenges the user can complete in order to authenticate.",
          "type": "array",
          "items": {
            "$ref": "#/definitions/RetrieveVirtualCardNumberResultChallengeOption"
          }
        }
      }
    },
    "RetrieveVirtualCardNumberResultChallengeOption": {
      "description": "Details about a specific challenge option the user can complete in order to authenticate.",
      "type": "object",
      "properties": {
        "challengeOptionId": {
          "description": "**REQUIRED**: The globally unique reference identifying a specific challenge option. This is a string that has a maximum length of 100 characters. Valid characters: [`a-zA-Z0-9:_-`]",
          "type": "string"
        },
        "platformAuthentication": {
          "description": "A platform authentication verified by Google.",
          "$ref": "#/definitions/GoogleStandardpaymentsTypesV2Empty"
        },
        "smsOtp": {
          "description": "A one-time password transmitted via SMS.",
          "$ref": "#/definitions/RetrieveVirtualCardNumberResultSmsOtpChallengeOption"
        },
        "emailOtp": {
          "description": "A one-time password transmitted via email.",
          "$ref": "#/definitions/RetrieveVirtualCardNumberResultEmailOtpChallengeOption"
        },
        "cardSecurityCode": {
          "description": "A verification of a security code printed on the user's card.",
          "$ref": "#/definitions/RetrieveVirtualCardNumberResultCardSecurityCodeChallengeOption"
        }
      }
    },
    "RetrieveVirtualCardNumberResultSmsOtpChallengeOption": {
      "description": "A one-time password transmitted via SMS.",
      "type": "object",
      "properties": {
        "maskedPhoneNumber": {
          "description": "**REQUIRED** The masked phone number the SMS OTP will be sent to. If the user has multiple phone numbers that can be used for SMS OTP challenges, partners should return multiple `ChallengeOption` objects with the `smsOtp` field set. The phone number masking format is: \"[()*-]*[0-9]{4}\" - The last four digits are displayed. - The remaining digits are replaced with the character '*'. - The characters \"-\" \"(\" and \")\"are allowed for formatting. ex: \"(***)-***-1234\".",
          "type": "string"
        }
      }
    },
    "RetrieveVirtualCardNumberResultEmailOtpChallengeOption": {
      "description": "A one-time password transmitted via email.",
      "type": "object",
      "properties": {
        "maskedEmailAddress": {
          "description": "**REQUIRED** The masked email address the email OTP will be sent to. If the user has multiple email addresses that can be used for email OTP challenges, partners should return multiple `ChallengeOption` objects with the `emailOtp` field set. Three asterisks should be used to mask the characters between the first and last characters of the email address username. Fewer asterisks should be used for usernames shorter than 5 characters. Examples: * `abcdefghijk@gmail.com` \u2192 `a***k@gmail.com` * `abcde@gmail.com` \u2192 `a***e@gmail.com` * `abcd@gmail.com` \u2192 `a**d@gmail.com` * `abc@gmail.com` \u2192 `a*c@gmail.com` * `ab@gmail.com` \u2192 `a*@gmail.com` * `a@gmail.com` \u2192 `*@gmail.com`",
          "type": "string"
        }
      }
    },
    "RetrieveVirtualCardNumberResultCardSecurityCodeChallengeOption": {
      "description": "A verification of a security code printed on the user's card.",
      "type": "object",
      "properties": {
        "maxVerificationAttempts": {
          "description": "**REQUIRED** The maximum number of times a card security code can be submitted for verification for this challenge option.",
          "type": "string",
          "format": "int64"
        },
        "cardSecurityCodeType": {
          "description": "**REQUIRED**: The type of the card security code that is being requested from the user.",
          "type": "string",
          "enum": [
            "CARD_SECURITY_CODE_TYPE_UNSPECIFIED",
            "CARD_SECURITY_CODE_TYPE_CVV2",
            "CARD_SECURITY_CODE_TYPE_3CSC",
            "CARD_SECURITY_CODE_TYPE_XID"
          ]
        }
      }
    },
    "RetrieveVirtualCardNumberResultChallengeResultInvalidDeclinedResult": {
      "description": "Details about an invalid challenge response result.",
      "type": "object",
      "properties": {
        "challengeOptionId": {
          "description": "**REQUIRED**: The challenge option ID of the invalid challenge response.",
          "type": "string"
        }
      }
    },
    "RetrieveVirtualCardNumberResultChallengeResultExpiredDeclinedResult": {
      "description": "Details about a challenge response expired result.",
      "type": "object",
      "properties": {
        "challengeOptionId": {
          "description": "**REQUIRED**: The challenge option ID of the invalid challenge response.",
          "type": "string"
        }
      }
    },
    "RetrieveVirtualCardNumberResultChallengeResultRetryExceededDeclinedResult": {
      "description": "Details about a challenge response retry exceeded result.",
      "type": "object",
      "properties": {
        "challengeOptionId": {
          "description": "**REQUIRED**: The challenge option ID of the invalid challenge response.",
          "type": "string"
        }
      }
    }
  }
}
