{
  "swagger": "2.0",
  "info": {
    "title": "Google Standard Payments Payment Integrator Hosted Korea e-Wallets API",
    "description": "This includes services hosted by Payment Integrators for Korea e-Wallets.",
    "version": "v1"
  },
  "host": "payment-integrator-e-wallets-api.google.com",
  "basePath": "/integrator-base-path",
  "schemes": ["https"],
  "paths": {
    "/korea-e-wallets-v1/echo": {
      "post": {
        "tags": ["payment_integrator_e_wallets_api"],
        "operationId": "Echo",
        "description": "Echos back the `clientMessage` that is passed in. The purpose of this method is to test basic connectivity between the payment integrator and Google. This method may be called by Google multiple times per minute with valid or invalid parameters in order to test that security constraints are being held properly. Google also calls this method ad-hoc at the integrator's direction as well as at Google's direction. Google will never call this faster than once every 10s, and never more than 30 times in a 15 minute window. Examples of security constraint tests are (but not limited to): - Test to ensure payment integrator's endpoint doesn't negotiate to weak cipher suites. - Test to ensure payment integrator's endpoint doesn't negotiate to anything but TLS 1.2 - Test to ensure payment integrator's endpoint doesn't support HTTP. - Test to ensure payment integrator's endpoint mandates at least one known PGP signing key. - Test to ensure payment integrator's endpoint supports multiple PGP key signatures, both known and unknown, both expired and active. - Test to ensure payment integrator only support strict JSON parsing. 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, \"minor\": 0, \"revision\": 0 }, \"requestId\": \"ZWNobyB0cmFuc2FjdGlvbg\", \"requestTimestamp\": \"1481899949606\" }, \"clientMessage\": \"client message\" } An example response looks like: { \"responseHeader\": { \"responseTimestamp\": \"1481900013178\" }, \"clientMessage\": \"client message\", \"serverMessage\": \"server message\" } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/EchoRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/EchoResponse"
            }
          }
        }
      }
    },
    "/korea-e-wallets-v1/remittanceStatementNotification": {
      "post": {
        "tags": ["payment_integrator_e_wallets_api"],
        "operationId": "RemittanceStatementNotification",
        "description": "Notifies the integrator of a new remittance statement. Statement notifications occur everytime a new statement is raised that represents money that Google will pay the integrator or the money that the integrator owes Google. If the integrator returns a success, then it acknowledges receipt of the statement. The `requestId` is also the statement Id (used elsewhere). The `requestId` within the header is the idempotency key and uniquely identifies this statement. 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, \"minor\": 0, \"revision\": 0 }, \"requestId\": \"0123434-statement-abc\", \"requestTimestamp\": \"1502632800000\" }, \"paymentIntegratorAccountId\": \"InvisiCashUSA_USD\", \"remittanceStatementSummary\": { \"statementDate\": \"1502607600000\", \"billingPeriod\": { \"startDate\": \"1502434800000\", \"endDate\": \"1502521199000\" }, \"dateDue\": \"1503212400000\", \"currencyCode\": \"INR\", \"totalDueByIntegrator\": \"1076000000\", \"totalPresentmentAmounts\": [ { \"amountMicros\": \"1076000000\", \"currencyCode\": \"INR\" } ], \"remittanceInstructions\": { \"memoLineId\": \"stmt-1AB-pp0-invisi\" } } } An example response looks like: { \"responseHeader\": { \"responseTimestamp\": \"1502632802000\" }, \"paymentIntegratorStatementId\": \"334a\", \"result\": \"ACCEPTED\" } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/RemittanceStatementNotificationRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/RemittanceStatementNotificationResponse"
            }
          }
        }
      }
    },
    "/korea-e-wallets-v1/associateAccount": {
      "post": {
        "tags": ["payment_integrator_e_wallets_api"],
        "operationId": "AssociateAccount",
        "description": "Associates the customer's account with the payment processor to the Google instrument being added. Account association happens after the integrator has authenticated the user. Association occurs via a server-to-server call that contains the `requestId` for the associated authentication flow (`authenticationRequestId`), an `associationId` and a `googlePaymentToken` (GPT). The payment processor should associate the `associationId` and the `googlePaymentToken` to the customer's account for authentication. The GPT is used to initiate payments. The `associationId` is used during re-authentication calls to identify the account for authentication. If Google sends an `associationId` or a `googlePaymentToken` that the integrator has already seen during a different association, then it throws an error. 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, \"minor\": 0, \"revision\": 0 }, \"requestId\": \"cmVxdWVzdDE\", \"requestTimestamp\": \"1481899949606\" }, \"googlePaymentToken\": \"ZXhhbXBsZSB1bmlxdWUgcGF5bWVudCB0b2tlbiB2YWx1ZQ__\", \"authenticationRequestId\": \"bnAxdWTydDX==\", \"associationId\": \"LmddbXBsZSByZWZlcmVuY2UgdG9rZW4gdmFsdWU_\", \"provideUserInformation\": true } An example response looks like: { \"responseHeader\": { \"responseTimestamp\": \"1481899949611\" }, \"paymentIntegratorAssociateAccountId\": \"xx77df88934hfd\", \"accountId\": \"1234-5678-91\", \"accountNickname\": \"***-91\", \"tokenExpirationTime\": \"0\", \"userInformation\": { \"name\": \"Example Customer\", \"addressLine\": [\"123 Main St\"], \"localityName\": \"Springfield\", \"administrativeAreaName\": \"CO\", \"postalCodeNumber\": \"80309\", \"countryCode\": \"US\" }, \"result\": \"SUCCESS\" } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/AssociateAccountRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/AssociateAccountResponse"
            }
          }
        }
      }
    },
    "/korea-e-wallets-v1/refreshToken": {
      "post": {
        "tags": ["payment_integrator_e_wallets_api"],
        "operationId": "RefreshToken",
        "description": "Refreshes a payment token's expiration date. Token refresh happens when a token has expired, is near expiry, or when Google chooses to refresh based on risk profiles. The user is reauthenticated prior to calling this method. The `authenticationRequestId` that is passed contains the proof of authentication. The `googlePaymentToken` (GPT) is passed as well. A successful response to this call extends the GPT's expiry date. If Google sends a GPT that the integrator has never associated before, then it throws an error. 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, \"minor\": 0, \"revision\": 0 }, \"requestId\": \"bhHmmdHHvbeY\", \"requestTimestamp\": \"1481899949606\" }, \"authenticationRequestId\": \"dGVzdHRva2VuZnJvbWdvb2dsZQ==\", \"googlePaymentToken\": \"ZXhhbXBsZSB1bmlxdWUgcGF5bWVudCB0b2tlbiB2YWx1ZQ\" } An example response looks like: { \"responseHeader\": { \"responseTimestamp\": \"1481900013178\" }, \"paymentIntegratorRefreshTokenId\": \"iuKndnVzaCB0b2tlbiYYke=\", \"tokenExpirationTime\": \"1481901824177\", \"result\": \"SUCCESS\" } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/RefreshTokenRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/RefreshTokenResponse"
            }
          }
        }
      }
    },
    "/korea-e-wallets-v1/asynchronousCapture": {
      "post": {
        "tags": ["payment_integrator_e_wallets_api"],
        "operationId": "AsynchronousCapture",
        "description": "Triggers the start of a money movement operation between a customer's account and the integrator. The integrator should acknowledge the request and perform whatever actions need to happen in order to complete the capture (e.g., collect a PIN from the user). The integrator will inform Google of the capture's final result by calling the CaptureResultNotification API. The `requestId` within the header is the idempotency key and uniquely identifies this transaction. All mutations on this transaction (refunds) populate the `requestId` value in the `captureRequestId` field. 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, \"minor\": 1, \"revision\": 0 }, \"requestId\": \"bWVyY2hhbnQgdHJhbnNhY3Rpb24gaWQ\", \"requestTimestamp\": \"1502220196077\" }, \"paymentIntegratorAccountId\": \"InvisiCashIN_INR\", \"upiDetails\": { \"vpa\": \"foo@icici\" }, \"transactionDescription\": \"Google - Music\", \"currencyCode\": \"INR\", \"amount\": \"728000000\" } An example response looks like: { \"responseHeader\": { \"responseTimestamp\": \"1481900013178\" }, \"result\": \"ACKNOWLEDGED\", \"paymentIntegratorTransactionId\": \"aW50ZWdyYXRvciB0cmFuc2FjdGlvbiBpZA\" } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/AsynchronousCaptureRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/AsynchronousCaptureResponse"
            }
          }
        }
      }
    },
    "/korea-e-wallets-v1/authenticateIdentity": {
      "post": {
        "tags": ["payment_integrator_e_wallets_api"],
        "operationId": "AuthenticateIdentity",
        "description": "Authenticates a user's account using data about the user's Google account and current context. This authentication method can provide a seamless experience for the user by relying on data that has been verified ahead of time. Any follow-up step relying on this authentication (like `associateAccount` or `capture`) will contain the `authenticationRequestId` from the `authenticateIdentityRequest` as proof of authentication. 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, \"minor\": 1, \"revision\": 0 }, \"requestId\": \"G112YZH4XPDV88J\", \"requestTimestamp\": \"1481907920000\" }, \"authenticationRequestId\": \"1591303-231233235-151J\", \"associationId\": \"15522364553\", \"googleAccountAssertions\": { \"verifiedPhoneNumber\": { \"phoneNumber\": \"+12225551234\", \"lastVerificationTimestamp\": \"1481901920000\", \"verificationMethod\": \"CARRIER_API\" } } } An example response looks like: { \"responseHeader\": { \"responseTimestamp\": \"1502545413132\" }, \"paymentIntegratorAuthenticateIdentityId\": \"5539163\", \"result\": \"SUCCESS\" } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/AuthenticateIdentityRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/AuthenticateIdentityResponse"
            }
          }
        }
      }
    },
    "/korea-e-wallets-v1/capture": {
      "post": {
        "tags": ["payment_integrator_e_wallets_api"],
        "operationId": "Capture",
        "description": "Initiates money movement between a customer's account held with Google and the payment processor. The `requestId` within the header is the idempotency key and uniquely identifies this transaction. All mutations on this transaction (refunds) populate the `requestId` value in the `captureRequestId` field. 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, \"minor\": 0, \"revision\": 0 }, \"requestId\": \"bWVyY2hhbnQgdHJhbnNhY3Rpb24gaWQ\", \"requestTimestamp\": \"1502220196077\" }, \"paymentIntegratorAccountId\": \"InvisiCashUSA_USD\", \"googlePaymentToken\": \"ZXhhbXBsZSB1bmlxdWUgcGF5bWVudCB0b2tlbiB2YWx1ZQ\", \"transactionDescription\": \"Google - Music\", \"currencyCode\": \"INR\", \"amount\": \"728000000\", \"captureContext\": {} } An example response looks like: { \"responseHeader\": { \"responseTimestamp\": \"1481900013178\" }, \"result\": \"SUCCESS\", \"paymentIntegratorTransactionId\": \"aW50ZWdyYXRvciB0cmFuc2FjdGlvbiBpZA\" } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/CaptureRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/CaptureResponse"
            }
          }
        }
      }
    },
    "/korea-e-wallets-v1/getBalanceAndLimits": {
      "post": {
        "tags": ["payment_integrator_e_wallets_api"],
        "operationId": "GetBalanceAndLimits",
        "description": "Initiates a request for the current account balance associated with the association ID provided in the request. The return value contains the current balance and transaction limit data for the account. 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, \"minor\": 1, \"revision\": 0 }, \"requestId\": \"G112YZH4XPDV88J\", \"requestTimestamp\": \"1481907920000\" }, \"associationId\": \"LmddbXBsZSByZWZlcmVuY2UgdG9rZW4gdmFsdWU_\" } An example response looks like: { \"responseHeader\": { \"responseTimestamp\": \"1481900013178\" }, \"result\": { \"success\": { \"currentBalance\": { \"amountMicros\": \"51000000\", \"currencyCode\": \"USD\" }, \"transactionMaxLimit\": { \"amountMicros\": \"100000000\", \"currencyCode\": \"USD\" }, \"transactionMinLimit\": { \"amountMicros\": \"500000\", \"currencyCode\": \"USD\" }, \"remainingDailyLimit\": { \"amountMicros\": \"200000000\", \"currencyCode\": \"USD\" }, \"remainingMonthlyLimit\": { \"amountMicros\": \"3000000000\", \"currencyCode\": \"USD\" } } } } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/GetBalanceAndLimitsRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/GetBalanceAndLimitsResponse"
            }
          }
        }
      }
    },
    "/korea-e-wallets-v1/createMandate": {
      "post": {
        "tags": ["payment_integrator_e_wallets_api"],
        "operationId": "CreateMandate",
        "description": "Initiates a mandate creation on the user's account with the integrator. The `requestId` within the header is the idempotency key and uniquely identifies this transaction. All subsequent operations on this mandate will populate the `mandateId` field from the request. 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, \"minor\": 0, \"revision\": 0 }, \"requestId\": \"GWVyY2hhbnQgdHJhbnNhY3Rpb24gaWQ\", \"requestTimestamp\": \"1502220196077\" }, \"paymentIntegratorAccountId\": \"InvisiCashIN_INR\", \"googlePaymentToken\": \"ZXhhbXBsZSB1bmlxdWUgcGF5bWVudCB0b2tlbiB2YWx1ZQ\", \"mandateId\": \"Gbsdfju4bnQgdHJXPFWSDhgdka4\", \"mandateName\": \"Google - Music\", \"mandateDescription\": \"Monthly subscription for Google - Music\", \"startDate\": { \"epochMillis\": \"1502220194077\" }, \"endDate\": { \"epochMillis\": \"1502220196000\" }, \"maximumAmount\": { \"amountMicros\": \"728000000\", \"currencyCode\": \"INR\" }, \"frequency\": \"MONTHLY\", \"otpVerification\": { \"sendOtpRequestId\" : \"G112YZH4bnQgdHJXPdV88J\", \"otp\": \"1234\" } } An example response looks like: { \"responseHeader\": { \"responseTimestamp\": \"1481900013178\" }, \"result\": \"SUCCESS\" } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/CreateMandateRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/CreateMandateResponse"
            }
          }
        }
      }
    },
    "/korea-e-wallets-v1/cancelMandate": {
      "post": {
        "tags": ["payment_integrator_e_wallets_api"],
        "operationId": "CancelMandate",
        "description": "Initiates a mandate cancellation on the user's account with the integrator. This cancels the existing mandate on the user's account. The `mandateId` identifies which mandate is being cancelled. This is the `requestId` of the `createMandate` or `asynchronousCreateMandate` call. If the mandate has expired or is already cancelled, consider it a successful cancel rather than an error. Therefore, return a `success` response code. The `requestId` within the header is the idempotency key and uniquely identifies this transaction. 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, \"minor\": 0, \"revision\": 0 }, \"requestId\": \"bWVyY2hhbnQgdHJhbnNhY3Rpb24gaWQ\", \"requestTimestamp\": \"1502220196078\" }, \"paymentIntegratorAccountId\": \"InvisiCashIN_INR\", \"mandateId\": \"Gbsdfju4bnQgdHJXPFWSDhgdka4\" } An example response looks like: { \"responseHeader\": { \"responseTimestamp\": \"1502220196079\" }, \"result\": \"SUCCESS\" } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/CancelMandateRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/CancelMandateResponse"
            }
          }
        }
      }
    },
    "/korea-e-wallets-v1/transferFunds": {
      "post": {
        "tags": ["payment_integrator_e_wallets_api"],
        "operationId": "TransferFunds",
        "description": "Initiates money movement between a customer's account held with Google and the payment processor. The `requestId` within the header is the idempotency key and uniquely identifies this transaction. An example request looks like: { \"requestHeader\": { \"protocolVersion\": { \"major\": 1, \"minor\": 0, \"revision\": 0 }, \"requestId\": \"liUrreQY233839dfFFb24gaQM\", \"requestTimestamp\": \"1502220434778\" }, \"paymentIntegratorAccountId\": \"InvisiCash\", \"googlePaymentToken\": \"ZXhhbXBsZSB1bmlxdWUgcGF5bWVudCB0b2tlbiB2YWx1ZQ\", \"transactionDescription\": \"Google - Music\", \"amount\": { \"amountMicros\": \"728000000\", \"currencyCode\": \"INR\" }, \"payeeProxy\": { \"payeeProxyKey\": { \"qrCode\": \"QrCode\", \"networkId\": \"PaymentNetwork1\" } } } An example response looks like: { \"responseHeader\": { \"responseTimestamp\": \"1481900013178\" }, \"result\": { \"success\": {} }, \"paymentIntegratorTransactionId\": \"aW50ZWdyYXRvciB0cmFuc2FjdGlvbiBpZA\" } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/TransferFundsRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/TransferFundsResponse"
            }
          }
        }
      }
    },
    "/korea-e-wallets-v1/getTransferFundsTransactionStatus": {
      "post": {
        "tags": ["payment_integrator_e_wallets_api"],
        "operationId": "GetTransferFundsTransactionStatus",
        "description": "This method fetches the status of a TransferFunds transaction. An example request looks like: { \"requestHeader\": { \"protocolVersion\": { \"major\": 1, \"minor\": 0, \"revision\": 0 }, \"requestId\": \"liUrreQY233839dfFFb24gaQM\", \"requestTimestamp\": \"1502220434778\" }, \"transferFundsRequestId\":\"bnAxdWTydDX==\", \"paymentIntegratorAccountId\": \"InvisiCash\" } An example response looks like: { \"responseHeader\": { \"responseTimestamp\": \"1481900013178\" }, \"result\": { \"success\": {} }, \"transferFundsResult\": { \"success\": {} } } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/GetTransferFundsTransactionStatusRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/GetTransferFundsTransactionStatusResponse"
            }
          }
        }
      }
    },
    "/korea-e-wallets-v1/sendOtp": {
      "post": {
        "tags": ["payment_integrator_e_wallets_api"],
        "operationId": "SendOtp",
        "description": "Requests the integrator send an OTP to the phone number. If the integrator returns `SUCCESS`, then Google expects an SMS sent to the phone number. Google provides only an `accountPhoneNumber` when a user initially associates their account with Google. Thereafter, only `associationId` would be sent for all subsequent calls. 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, \"minor\": 0, \"revision\": 0 }, \"requestId\": \"0123434-otp-abc\", \"requestTimestamp\": \"1502545413026\" }, \"accountPhoneNumber\": \"+918067218010\", \"smsMatchingToken\": \"AB12345678C\", \"otpContext\": { \"association\": {} } } An example response looks like: { \"responseHeader\": { \"responseTimestamp\": \"1502545413098\" }, \"paymentIntegratorSendOtpId\": \"99==ABC EF\", \"result\": \"SUCCESS\" } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/SendOtpRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/SendOtpResponse"
            }
          }
        }
      }
    },
    "/korea-e-wallets-v1/verifyOtp": {
      "post": {
        "tags": ["payment_integrator_e_wallets_api"],
        "operationId": "VerifyOtp",
        "description": "Verifies an OTP value was sent by the integrator for the account. 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, \"minor\": 0, \"revision\": 0 }, \"requestId\": \"0123434-otp-abc\", \"requestTimestamp\": \"1502545413098\" }, \"sendOtpRequestId\": \"0123434-otp-abc\", \"otp\": \"7754321\" } An example response looks like: { \"responseHeader\": { \"responseTimestamp\": \"1502545413132\" }, \"paymentIntegratorVerifyOtpId\": \"5539163\", \"result\": \"SUCCESS\" } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/VerifyOtpRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/VerifyOtpResponse"
            }
          }
        }
      }
    },
    "/korea-e-wallets-v1/refund": {
      "post": {
        "tags": ["payment_integrator_e_wallets_api"],
        "operationId": "Refund",
        "description": "Refunds a portion of or the entire transaction initiated through `capture`. The `requestId` within the header is the idempotency key, which uniquely identifies this transaction. 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, \"minor\": 0, \"revision\": 0 }, \"requestId\": \"liUrreQY233839dfFFb24gaQM\", \"requestTimestamp\": \"1502220434778\" }, \"paymentIntegratorAccountId\": \"InvisiCashUSA_USD\", \"captureRequestId\": \"bWVyY2hhbnQgdHJhbnNhY3Rpb24gaWQ\", \"currencyCode\": \"INR\", \"refundAmount\": \"208000000\" } An example response looks like: { \"responseHeader\": { \"responseTimestamp\": \"1481900013178\" }, \"result\": \"SUCCESS\", \"paymentIntegratorRefundId\": \"cmVmdW5kIGlkZW50aWZpZXINCg\" } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/RefundRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/RefundResponse"
            }
          }
        }
      }
    },
    "/korea-e-wallets-v1/reserveFunds": {
      "post": {
        "tags": ["payment_integrator_e_wallets_api"],
        "operationId": "ReserveFunds",
        "description": "Reserve funds on a token. This call synchronously attempts to reserve funds from a previously tokenized account. The response to this message will return the result of that attempt. No money is directly moved as the result of this call. The requested amount of funds should be reserved until a `captureFundsReservation`, a `cancelFundsReservation`, or until the reservation has reached the `reservationExpirationTimestamp` specified in the ReserveFundsResponse. The `requestId` within the header is the idempotency key and uniquely identifies this transaction. All mutations on this transaction (`cancelFundsReservation`, `captureFundsReservation`) populate the `requestId` value in their `reserveFundsRequestId` field. 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, \"minor\": 0, \"revision\": 0 }, \"requestId\": \"bWVyY2hhbnQgdHJhbnNhY3Rpb24gaWQ\", \"requestTimestamp\": \"1502220196077\" }, \"paymentIntegratorAccountId\": \"InvisiCashUSA_USD\", \"googlePaymentToken\": \"ZXhhbXBsZSB1bmlxdWUgcGF5bWVudCB0b2tlbiB2YWx1ZQ\", \"transactionDescription\": \"Google - Music\", \"currencyCode\": \"INR\", \"amount\": \"728000000\", \"reserveFundsContext\": { \"userIpAddress\":\"2001:4860:4860::8888\", \"shippingAddress\": { \"name\": \"Example Customer\", \"addressLine\": [\"123 Main St\"], \"localityName\": \"Springfield\", \"administrativeAreaName\": \"CO\", \"postalCodeNumber\": \"80309\", \"countryCode\": \"US\" } } } An example response looks like: { \"responseHeader\": { \"responseTimestamp\": \"1481900013178\" }, \"result\": \"SUCCESS\", \"paymentIntegratorTransactionId\": \"aW50ZWdyYXRvciB0cmFuc2FjdGlvbiBpZA\", \"expirationTimestamp\": \"1481900033178\", \"installmentPlan\": { \"installmentPlanType\": \"PAY_IN_3_INSTALLMENTS\" } } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/ReserveFundsRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/ReserveFundsResponse"
            }
          }
        }
      }
    },
    "/korea-e-wallets-v1/cancelFundsReservation": {
      "post": {
        "tags": ["payment_integrator_e_wallets_api"],
        "operationId": "CancelFundsReservation",
        "description": "Initiates canceling the funds that were reserved by a `reserveFunds` call. This cancels the pending transaction by freeing the reserved funds. The `reserveFundsRequestId` identifies which funds reservation is being canceled. When this is used, there is no money movement from a customer's account for this transaction. The `requestId` within the header is the idempotency key and uniquely identifies this transaction. If the reservation of funds has expired or the payment integrator has automatically canceled the reservation, consider it a successful cancel rather than an error. Therefore, return a success result. 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, \"minor\": 0, \"revision\": 0 }, \"requestId\": \"G1NMPDFX4AW395L\", \"requestTimestamp\": \"1481907920000\" }, \"paymentIntegratorAccountId\": \"SpeedyPaymentsIndia_INR\", \"reserveFundsRequestId\": \"G1MQ0YERJ0Q7LPM\" } An example response looks like: { \"responseHeader\": { \"responseTimestamp\": \"1481907920760\" }, \"result\": \"SUCCESS\" } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/CancelFundsReservationRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/CancelFundsReservationResponse"
            }
          }
        }
      }
    },
    "/korea-e-wallets-v1/captureFundsReservation": {
      "post": {
        "tags": ["payment_integrator_e_wallets_api"],
        "operationId": "CaptureFundsReservation",
        "description": "Initiates a capture of the funds reserved by a `reserveFunds` call. This initiates money movement by capturing funds that were previous reserved in a call to `reserveFunds`. The `reserveFundsRequestId` specifies which funds reservation is to be captured. The amount captured can be less than or equal to the amount reserved but each reservation may only be captured once. The `requestId` within the header is the idempotency key and uniquely identifies this transaction. All mutations on this transaction (`refund`) populate the `requestId` value in their `captureRequestId` field. 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, \"minor\": 0, \"revision\": 0 }, \"requestId\": \"G112YZH4XPDV88J\", \"requestTimestamp\": \"1481907920000\" }, \"paymentIntegratorAccountId\": \"SpeedyPaymentsIndia_INR\", \"reserveFundsRequestId\": \"G1MQ0YERJ0Q7LPM\", \"amount\": \"728000000\" } An example response looks like: { \"responseHeader\": { \"responseTimestamp\": \"1481907920760\" }, \"result\": \"SUCCESS\", \"paymentIntegratorCaptureId\": \"invicash\/ID::1323_abc\" } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/CaptureFundsReservationRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/CaptureFundsReservationResponse"
            }
          }
        }
      }
    },
    "/korea-e-wallets-v1/simulatePayment": {
      "post": {
        "tags": ["payment_integrator_e_wallets_api"],
        "operationId": "SimulatePayment",
        "description": "Initiates a request to simulate a payment from an account associated by the association ID for a given amount provided in the request. The return value contains the payment simulation result for the transaction. 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, \"minor\": 0, \"revision\": 0 }, \"requestId\": \"liUrreQY233839dfFFb24gaQM\", \"requestTimestamp\": \"1502220434778\" }, \"associationId\": \"LmddbXBsZSByZWZlcmVuY2UgdG9rZW4gdmFsdWU_\", \"amount\": { \"amountMicros\": \"728000000\", \"currencyCode\": \"INR\" }, \"payeeProxy\": { \"payeeProxyKey\": { \"qrCode\": \"QrCode\", \"networkId\": \"PaymentNetwork1\" } }, \"paymentIntegratorAccountId\": \"InvisiCash\" } An example response looks like: { \"responseHeader\": { \"responseTimestamp\": \"1481900013178\" }, \"result\": { \"successWithAlternateFunds\": { \"currentBalance\": { \"amountMicros\": 5000000, \"currencyCode\": \"MYR\" }, \"alternateFunds\": [ { \"description\": \"ChiliPoints\", \"value\": { \"value\": \"120\" }, \"equivalentMonetaryValue\": { \"amountMicros\": 1000, \"currencyCode\": \"MYR\" }, \"autoTopUpEnabled\": {}, \"autoPaymentEnabled\": {} } ] } } } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/SimulatePaymentRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/SimulatePaymentResponse"
            }
          }
        }
      }
    },
    "/korea-e-wallets-v1/upcomingTransactionNotification": {
      "post": {
        "tags": ["payment_integrator_e_wallets_api"],
        "operationId": "UpcomingTransactionNotification",
        "description": "Requests the integrator notify the user of an upcoming transaction for a recurring mandate. If the integrator returns `success`, then Google expects the user to be notified that an upcoming mandate transaction is impending. The notification may be delivered with some delay from the payment integrator, but this means that Google has notified the payment integrator. This notification must not have any monetary impact on the customer's account. There is no guarantee that a charge will be executed after a prenotification and one mandate may have multiple notifications. The `requestId` within the header is the idempotency key, which uniquely identifies this prenotification request. 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, \"minor\": 0, \"revision\": 0 }, \"requestId\": \"G112YZH4XPDV88J\", \"requestTimestamp\": \"1502220196077\" }, \"paymentIntegratorAccountId\": \"InvisiCashUSA_USD\", \"mandateId\": \"MA061B00045154\", \"upcomingTransactionNotBeforeTimestamp\": { \"epochMillis\": \"1521855969203\" }, \"transactionAmount\": { \"amountMicros\": \"728000000\", \"currencyCode\": \"INR\" }, \"transactionDescription\": \"Google TV subscription\" } An example response looks like: { \"responseHeader\": { \"responseTimestamp\": \"1481900013178\" }, \"result\": \"SUCCESS\" } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/UpcomingTransactionNotificationRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/UpcomingTransactionNotificationResponse"
            }
          }
        }
      }
    }
  },
  "definitions": {
    "EchoRequest": {
      "description": "Request object for the echo method.",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests.",
          "$ref": "#/definitions/RequestHeader"
        },
        "clientMessage": {
          "description": "**REQUIRED**: Message to echo in the response.",
          "type": "string"
        }
      }
    },
    "RequestHeader": {
      "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 represented as milliseconds since epoch. The receiver should verify that this timestamp is \u00B1 60s of 'now'. This request timestamp is not idempotent upon retries.",
          "type": "string",
          "format": "int64"
        },
        "userLocale": {
          "description": "**DEPRECATED**: A two- or three-letter ISO 639-2 Alpha 3 language code optionally followed by a hyphen and an ISO 3166-1 Alpha-2 country code, e.g.'pt', 'pt-BR', 'fil', or 'fil-PH'. Use this to help drive the `userMessage` fields in the response.",
          "type": "string"
        },
        "protocolVersion": {
          "description": "**REQUIRED**: The version of this request.",
          "$ref": "#/definitions/Version"
        }
      }
    },
    "Version": {
      "description": "Version object which is a structured form of the classic `a.b.c` version structure. Major versions of the same number are guaranteed to be compatible. Note that minor and revisions can change frequently and without notice. 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"
        },
        "minor": {
          "description": "**REQUIRED**: Minor version. This denotes significant bug fixes.",
          "type": "integer",
          "format": "int32"
        },
        "revision": {
          "description": "**REQUIRED**: Minor version. This denotes minor bug fixes.",
          "type": "integer",
          "format": "int32"
        }
      }
    },
    "EchoResponse": {
      "description": "Response object for the echo method.",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/ResponseHeader"
        },
        "clientMessage": {
          "description": "**REQUIRED**: Message received in the request.",
          "type": "string"
        },
        "serverMessage": {
          "description": "**OPTIONAL**: Server message, independent of the `clientMessage` being echoed.",
          "type": "string"
        }
      }
    },
    "ResponseHeader": {
      "description": "Header object that is defined on all responses sent from the server.",
      "type": "object",
      "properties": {
        "responseTimestamp": {
          "description": "**REQUIRED**: Timestamp of this response represented as milliseconds since epoch. The receiver should verify that this timestamp is \u00B1 60s of 'now'.",
          "type": "string",
          "format": "int64"
        }
      }
    },
    "ErrorResponse": {
      "description": "Error Response object for all methods.",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/ResponseHeader"
        },
        "errorResponseCode": {
          "description": "**OPTIONAL**: A code that captures the type of error that occurred.",
          "type": "string",
          "enum": [
            "UNKNOWN_ERROR_RESPONSE_CODE",
            "INVALID_API_VERSION",
            "INVALID_PAYLOAD_SIGNATURE",
            "INVALID_PAYLOAD_ENCRYPTION",
            "REQUEST_TIMESTAMP_OUT_OF_RANGE",
            "INVALID_IDENTIFIER",
            "IDEMPOTENCY_VIOLATION",
            "INVALID_FIELD_VALUE",
            "MISSING_REQUIRED_FIELD",
            "PRECONDITION_VIOLATION",
            "USER_ACTION_IN_PROGRESS",
            "INVALID_DECRYPTED_REQUEST",
            "FORBIDDEN"
          ]
        },
        "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. For example, `INVALID_IDENTIFIER` should be accompanied by information in this field as to which type of identifier was invalid. 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"
        }
      }
    },
    "RemittanceStatementNotificationRequest": {
      "description": "Request object for the remittance statement notification method.",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests.",
          "$ref": "#/definitions/RequestHeader"
        },
        "paymentIntegratorAccountId": {
          "description": "**REQUIRED**: This is the payment integrator account identifier that identifies contractual constraints around this statement.",
          "type": "string"
        },
        "remittanceStatementSummary": {
          "description": "**REQUIRED**: Summary of this remittance statement.",
          "$ref": "#/definitions/RemittanceStatementSummary"
        }
      }
    },
    "RemittanceStatementSummary": {
      "description": "Summary object about a remittance statement.",
      "type": "object",
      "properties": {
        "statementDate": {
          "description": "**REQUIRED**: Date (in America\/Los Angeles) that this statement was created.",
          "type": "string",
          "format": "int64"
        },
        "billingPeriod": {
          "description": "**REQUIRED**: The billing period this statement covers.",
          "$ref": "#/definitions/BillingPeriod"
        },
        "dateDue": {
          "description": "**OPTIONAL**: The date that the remittance is due. This is represented as milliseconds from epoch. It is a date (and therefore will always start at the first millisecond of the day in the billing timezone). This is set as long as the `totalDueByIntegrator` is greater than 0.",
          "type": "string",
          "format": "int64"
        },
        "currencyCode": {
          "description": "**REQUIRED**: ISO 4217 3-letter currency code.",
          "type": "string"
        },
        "totalDueByIntegrator": {
          "description": "**REQUIRED**: This value is in micros in the currency of `currencyCode`. This value is always positive.",
          "type": "string",
          "format": "int64"
        },
        "remittanceInstructions": {
          "description": "**REQUIRED**: Details on how to remit payment",
          "$ref": "#/definitions/RemittanceInstructions"
        },
        "totalPresentmentAmounts": {
          "description": "**REQUIRED**: This is the total amount presented to the customer. There will be one entry for each presentment currency.",
          "type": "array",
          "items": {
            "$ref": "#/definitions/Amount"
          }
        }
      }
    },
    "BillingPeriod": {
      "description": "Billing period of this statement.",
      "type": "object",
      "properties": {
        "startDate": {
          "description": "**REQUIRED**: The start date of the billing period. This is represented as milliseconds from epoch. It is a date (and therefore will always start at the first millisecond of the day in the billing timezone). This is the first millisecond of the day of the billing period, 00:00:00.000",
          "type": "string",
          "format": "int64"
        },
        "endDate": {
          "description": "**REQUIRED**: The end date of the billing period. This is represented as milliseconds from epoch. This is the last millisecond of the last day of the billing period, 23:59:59.999",
          "type": "string",
          "format": "int64"
        }
      }
    },
    "RemittanceInstructions": {
      "description": "Structure holding information about how to pay this remittance notification.",
      "type": "object",
      "properties": {
        "memoLineId": {
          "description": "**REQUIRED**: Identifier that is mandatory to be put on the memo line for the payment for remittance identification.",
          "type": "string"
        }
      }
    },
    "Amount": {
      "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"
        }
      }
    },
    "RemittanceStatementNotificationResponse": {
      "description": "Response object for the remittance statement notification method.",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/ResponseHeader"
        },
        "paymentIntegratorStatementId": {
          "description": "**REQUIRED**: Identifier the integrator knows this statement as. This is integrator generated.",
          "type": "string"
        },
        "result": {
          "description": "**REQUIRED**: Result of this statement notification.",
          "type": "string",
          "enum": [
            "UNKNOWN_RESULT",
            "ACCEPTED"
          ]
        }
      }
    },
    "AssociateAccountRequest": {
      "description": "Request object for the associate account method.",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests.",
          "$ref": "#/definitions/RequestHeader"
        },
        "authenticationRequestId": {
          "description": "**OPTIONAL**: `requestId` of the authentication request that preceded this call. This identifier was generated by Google during the authentication flow. This is only present if the user went through the Android app authentication, web authentication, or an asynchronous authentication method that uses `authenticationResultNotification`.",
          "type": "string"
        },
        "otpVerification": {
          "description": "**OPTIONAL**: Data necessary to verify an OTP generated from `sendOtp`. This is only present if the user went through the `sendOtp` path.",
          "$ref": "#/definitions/OtpVerification"
        },
        "aggregatorAccountLinkingId": {
          "description": "**OPTIONAL**: An ID representing an earlier Partner User Account Linking via `LinkUserAccount` action that linked the user\u2019s accounts. The ID is known to Google, the Partner (i.e. Account Issuer), and the Partner\u2019s aggregator (i.e. Payment Integrator). This ID will be passed to the Partner\u2019s aggregator instead of the `authenticationRequestId` because the authentication step was completed by the `LinkUserAccount` call. 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"
        },
        "provideUserInformation": {
          "description": "**REQUIRED**: True if we desire the integrator to provide the address associated with this account.",
          "type": "boolean"
        },
        "googlePaymentToken": {
          "description": "**REQUIRED**: The token that Google will use to initiate purchases with the payment processor. This is a string that has a maximum length of 100 characters.",
          "type": "string"
        },
        "associationId": {
          "description": "**REQUIRED**: The identifier of this association. This identifier is created by Google and is sent during re-authentication flows to identify which account should be authenticated. This is a string that has a maximum length of 100 characters.",
          "type": "string"
        }
      }
    },
    "OtpVerification": {
      "description": "Object that encapsulates the OTP verification response.",
      "type": "object",
      "properties": {
        "sendOtpRequestId": {
          "description": "**REQUIRED**: This is the `requestId` generated by Google during the `sendOtp` call which this request is associated with.",
          "type": "string"
        },
        "otp": {
          "description": "**REQUIRED**: This is the OTP the user provided if this call was preceded by a `sendOtp` call",
          "type": "string"
        }
      }
    },
    "AssociateAccountResponse": {
      "description": "Response object for the associate account method.",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/ResponseHeader"
        },
        "paymentIntegratorAssociateAccountId": {
          "description": "**REQUIRED**: 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"
        },
        "tokenExpirationTime": {
          "description": "**OPTIONAL**: Milliseconds since epoch when the token expires. Use `0` to signal the token does not expire.",
          "type": "string",
          "format": "int64"
        },
        "accountId": {
          "description": "**REQUIRED**: The account ID the user has with the integrator. This is used for Google risk to understand account re-use and account relationships and Google customer operation agents to help customers diagnose issues. This identifier should be user recognizable (for example the user knows this ID because it appears on their statement or appears on the website after they log into the account). This value must be immutable for the life of the account.",
          "type": "string"
        },
        "accountNickname": {
          "description": "String by which the user knows this account for display purposes. This is a suffix of the account nickname. For example last four digits of a phone number. Google will indicate in the user interface that this is only a suffix of the nickname. *Caution:* This value can be PII, but must never be SPII. This value will be displayed in UIs like the purchase flow to allow the user to distinguish between payment methods. *Note:* that either this value or the `fullAccountNickname` must be present, never both.",
          "type": "string"
        },
        "fullAccountNickname": {
          "description": "String by which the user knows this account for display purposes. Unlike `accountNickname` this is the full account nickname. For example `56565-56501` for a phone number or sally@sample-email.com for an email identity. *Caution:* This value can be PII, but must never be SPII. This value will be displayed in UIs like the purchase flow to allow the user to distinguish between payment methods. *Note:* that either this value or the `accountNickname` must be present, never both.",
          "type": "string"
        },
        "userMessage": {
          "description": "**DEPRECATED**: A description of the result to be displayed to the user if the result is not `SUCCESS`.",
          "type": "string"
        },
        "userInformation": {
          "description": "**OPTIONAL**: User information that the integrator knows and will share with Google about this customer. Used for risk information and address prepopulation. This value is required if the `provideUserInformation` field is set to `true` in the request.",
          "$ref": "#/definitions/UserInformation"
        },
        "result": {
          "description": "**REQUIRED**: Result of this association.",
          "type": "string",
          "enum": [
            "UNKNOWN_RESULT",
            "SUCCESS",
            "USER_AUTHENTICATION_FAILED",
            "NOT_ELIGIBLE",
            "OTP_NOT_MATCHED",
            "OTP_ALREADY_USED",
            "OTP_LIMIT_REACHED",
            "OTP_EXPIRED"
          ]
        }
      }
    },
    "UserInformation": {
      "description": "Structure holding information about a user.",
      "type": "object",
      "properties": {
        "name": {
          "description": "**OPTIONAL**: Customer's full name.",
          "type": "string"
        },
        "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"
        },
        "phone": {
          "description": "**OPTIONAL**: Customer's phone number.",
          "type": "string"
        },
        "emailAddress": {
          "description": "**OPTIONAL**: Customer's email address.",
          "type": "string"
        }
      }
    },
    "RefreshTokenRequest": {
      "description": "Request object for the refresh token method.",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests.",
          "$ref": "#/definitions/RequestHeader"
        },
        "authenticationRequestId": {
          "description": "The `requestId` of the authentication request that preceded this call. This is only present if the user went through the Android app or web authentication paths.",
          "type": "string"
        },
        "otpVerification": {
          "description": "Data necessary to verify an OTP generated from `sendOtp`. This is only present if the user went through the `sendOtp` path.",
          "$ref": "#/definitions/OtpVerification"
        },
        "googlePaymentToken": {
          "description": "**REQUIRED**: This is the token to be refreshed. This will not be a new token, but an existing token that has already been established via associateAccount. If the token is unknown a status of `FAILED_PRECONDITION` should be returned.",
          "type": "string"
        }
      }
    },
    "RefreshTokenResponse": {
      "description": "Response object for the refresh token method.",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/ResponseHeader"
        },
        "paymentIntegratorRefreshTokenId": {
          "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"
        },
        "tokenExpirationTime": {
          "description": "**OPTIONAL**: Milliseconds since epoch when the token expires. Use `0` to signal the token does not expire.",
          "type": "string",
          "format": "int64"
        },
        "userMessage": {
          "description": "**DEPRECATED**: A description of the result to be displayed to the user if the result is not `SUCCESS`.",
          "type": "string"
        },
        "result": {
          "description": "**REQUIRED**: Result of this call.",
          "type": "string",
          "enum": [
            "UNKNOWN_RESULT",
            "SUCCESS",
            "USER_AUTHENTICATION_FAILED",
            "OTP_NOT_MATCHED",
            "OTP_ALREADY_USED",
            "ACCOUNT_CLOSED",
            "ACCOUNT_CLOSED_ACCOUNT_TAKEN_OVER",
            "ACCOUNT_CLOSED_FRAUD"
          ]
        }
      }
    },
    "AsynchronousCaptureRequest": {
      "description": "Request object for the capture method.",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests.",
          "$ref": "#/definitions/RequestHeader"
        },
        "paymentIntegratorAccountId": {
          "description": "**REQUIRED**: This is the payment integrator account identifier that identifies contractual constraints around this transaction.",
          "type": "string"
        },
        "upiDetails": {
          "description": "Payment details specific to UPI instruments.",
          "$ref": "#/definitions/AsynchronousCaptureRequestUpiDetails"
        },
        "tokenizedInstrumentDetails": {
          "description": "Payment details specific to Tokenized instruments.",
          "$ref": "#/definitions/AsynchronousCaptureRequestTokenizedInstrumentDetails"
        },
        "transactionDescription": {
          "description": "**REQUIRED**: This is the description of the transaction that can be put on the customer's statement. Localized to the userLocale found in the `requestHeader`. This format can be changed without notice and must never be parsed.",
          "type": "string"
        },
        "currencyCode": {
          "description": "**REQUIRED**: ISO 4217 3-letter currency code",
          "type": "string"
        },
        "amount": {
          "description": "**REQUIRED**: The amount of the purchase, in micros of the currency unit.",
          "type": "string",
          "format": "int64"
        }
      }
    },
    "AsynchronousCaptureRequestUpiDetails": {
      "description": "Details about the UPI account to capture from.",
      "type": "object",
      "properties": {
        "vpa": {
          "description": "**REQUIRED**: The user's Virtual Payment Address (VPA) used for moving money using the UPI protocol. For example foo@icici.",
          "type": "string"
        }
      }
    },
    "AsynchronousCaptureRequestTokenizedInstrumentDetails": {
      "description": "Details about the account to capture from.",
      "type": "object",
      "properties": {
        "googlePaymentToken": {
          "description": "**REQUIRED**: This is the token that both companies will use to identify the account for purchases between each other.",
          "type": "string"
        }
      }
    },
    "AsynchronousCaptureResponse": {
      "description": "Response object for the capture method.",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/ResponseHeader"
        },
        "paymentIntegratorTransactionId": {
          "description": "**REQUIRED**: This identifier is specific to the integrator and is generated by the integrator. This is the identifier that the integrator knows this transaction by. For convenience, this identifier is included with in the remittance details",
          "type": "string"
        },
        "result": {
          "description": "**REQUIRED**: The result of the asynchronous capture call.",
          "type": "string",
          "enum": [
            "UNKNOWN_RESULT",
            "ACKNOWLEDGED",
            "ACCOUNT_CLOSED",
            "ACCOUNT_CLOSED_ACCOUNT_TAKEN_OVER",
            "ACCOUNT_ON_HOLD",
            "ACCOUNT_CLOSED_FRAUD"
          ]
        }
      }
    },
    "AuthenticateIdentityRequest": {
      "description": "Request object for the authenticate identity method.",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests.",
          "$ref": "#/definitions/RequestHeader"
        },
        "authenticationRequestId": {
          "description": "**REQUIRED**: Identifier for this user authentication session. This value will appear in follow-up methods as proof of authentication.",
          "type": "string"
        },
        "associationId": {
          "description": "**OPTIONAL**: This is the association identifier used to reference a user's account. If this is populated then it is expected that the integrator verify the values in `googleAccountAssertions` are not just correct for any user account, but are correct for the particular user account identified by this `associationId`. This is populated whenever Google is performing a re-authentication of an already associated account.",
          "type": "string"
        },
        "googleAccountAssertions": {
          "description": "**DEPRECATED**: This is information about the user's Google account that Google has verified somehow.",
          "$ref": "#/definitions/GoogleAccountAssertions"
        }
      }
    },
    "GoogleAccountAssertions": {
      "deprecated": true,
      "type": "object",
      "properties": {
        "verifiedPhoneNumber": {
          "description": "**OPTIONAL**: The phone number tied to the user's Google account and verified by Google using one of a number of possible verification methods.",
          "$ref": "#/definitions/GoogleAccountAssertionsVerifiedPhoneNumber"
        }
      }
    },
    "GoogleAccountAssertionsVerifiedPhoneNumber": {
      "deprecated": true,
      "description": "A phone number verified by Google as belonging to the user's Google account",
      "type": "object",
      "properties": {
        "phoneNumber": {
          "description": "**REQUIRED**: This is a E.164 formatted phone number. Examples include +14035551111 and +918067218000. This will always lead with a + and include only numbers afterwards (no dashes).",
          "type": "string"
        },
        "lastVerificationTimestamp": {
          "description": "**OPTIONAL**: Timestamp of the last time that this phone number was verified by Google, expressed as milliseconds since epoch.",
          "type": "string",
          "format": "int64"
        },
        "verificationMethod": {
          "description": "**OPTIONAL**: The verification method that Google used to verify the phone number.",
          "type": "string",
          "enum": [
            "UNKNOWN_VERIFICATION_METHOD",
            "CARRIER_API",
            "SMS_MT_GOOGLE_ORIGINATED",
            "SMS_MO_GOOGLE_TERMINATED"
          ]
        }
      }
    },
    "AuthenticateIdentityResponse": {
      "description": "Response object for the authenticate identity method.",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/ResponseHeader"
        },
        "paymentIntegratorAuthenticateIdentityId": {
          "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"
        },
        "result": {
          "description": "**REQUIRED**: Result of the authenticate identity call.",
          "type": "string",
          "enum": [
            "UNKNOWN_RESULT",
            "SUCCESS",
            "ADDITIONAL_USER_AUTHENTICATION_NEEDED"
          ]
        }
      }
    },
    "CaptureRequest": {
      "description": "Request object for the capture method.",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests.",
          "$ref": "#/definitions/RequestHeader"
        },
        "paymentIntegratorAccountId": {
          "description": "**REQUIRED**: This is the payment integrator account identifier that identifies contractual constraints around this transaction.",
          "type": "string"
        },
        "googlePaymentToken": {
          "description": "Token that both companies will use to identify the account for purchases between each other.",
          "type": "string"
        },
        "mandateDetails": {
          "description": "Payment details specific to mandates.",
          "$ref": "#/definitions/CaptureRequestMandateDetails"
        },
        "mandateWithNotificationDetails": {
          "description": "Payment details specific to mandates, where an `upcomingTransactionNotification` is required.",
          "$ref": "#/definitions/CaptureRequestMandateWithNotificationDetails"
        },
        "transactionDescription": {
          "description": "**REQUIRED**: This is the description of the transaction that can be put on the customer's statement. Localized to the userLocale found in the `requestHeader`. This format can be changed without notice and must never be parsed.",
          "type": "string"
        },
        "currencyCode": {
          "description": "**REQUIRED**: ISO 4217 3-letter currency code",
          "type": "string"
        },
        "amount": {
          "description": "**REQUIRED**: The amount of the purchase, in [micros]({{glossary_path}}#micros \"What are micros?\") of the currency unit.",
          "type": "string",
          "format": "int64"
        },
        "authenticationRequestId": {
          "description": "The `requestId` of the associated authentication request. If this is not present then no authentication can be tied to this capture. If this is present then the user was authenticated immediately preceding this call, or was authenticated when an automated payment schedule was set up.",
          "type": "string"
        },
        "otpVerification": {
          "description": "Data necessary to verify an OTP generated from `sendOtp`. This is only present if the user went through the `sendOtp` path.",
          "$ref": "#/definitions/OtpVerification"
        },
        "captureContext": {
          "description": "**REQUIRED**: Context about this capture.",
          "$ref": "#/definitions/CaptureContext"
        },
        "transactionInitiator": {
          "description": "**OPTIONAL**: Indicates whether this transaction was initiated by Google or the customer. *Note:* Expected to become a required field by July 31, 2024 after testing and ramp-up. ",
          "$ref": "#/definitions/TransactionInitiator"
        }
      }
    },
    "CaptureRequestMandateDetails": {
      "description": "Details about the mandate to capture from.",
      "type": "object",
      "properties": {
        "mandateId": {
          "description": "**REQUIRED**: The Google generated mandate ID that was sent during the `createMandate` call.",
          "type": "string"
        }
      }
    },
    "CaptureRequestMandateWithNotificationDetails": {
      "description": "Details about the mandate to capture from, along with required notifications details.",
      "type": "object",
      "properties": {
        "mandateId": {
          "description": "**REQUIRED**: The Google generated mandate ID that was sent during the `createMandate` call.",
          "type": "string"
        },
        "upcomingTransactionNotificationId": {
          "description": "**REQUIRED**: The `requestId` of the `upcomingTransactionNotification` call, that was made to pre notify about this transaction.",
          "type": "string"
        }
      }
    },
    "CaptureContext": {
      "description": "This object provides context about how the capture was requested.",
      "type": "object",
      "properties": {
        "userIpAddress": {
          "description": "**OPTIONAL**: This is the IP address of the user's device if the purchase was made by a user in session. If the user was not in session this will empty. If the particular contract doesn't stipulate the need for this field it will always be empty.",
          "type": "string"
        },
        "merchantIdentifier": {
          "description": "**REQUIRED**: Merchant details for the transaction.",
          "$ref": "#/definitions/MerchantIdentifier"
        }
      }
    },
    "MerchantIdentifier": {
      "description": "Merchant details for the transaction.",
      "type": "object",
      "properties": {
        "merchantName": {
          "description": "**OPTIONAL**: The merchant name for this transaction.",
          "type": "string"
        },
        "businessIdentifier": {
          "description": "**OPTIONAL**: The business identifier that should be associated with the account.",
          "type": "string"
        }
      }
    },
    "TransactionInitiator": {
      "description": "Indicates whether a transaction was initiated by Google or the customer.",
      "type": "object",
      "properties": {
        "google": {
          "description": "Indicates that this transaction is initiated by Google System on behalf of the customer.",
          "$ref": "#/definitions/Empty"
        },
        "customer": {
          "description": "Indicates that this transaction is initiated by the customer.",
          "$ref": "#/definitions/Empty"
        }
      }
    },
    "Empty": {
      "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": {
      }
    },
    "CaptureResponse": {
      "description": "Response object for the capture method.",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/ResponseHeader"
        },
        "paymentIntegratorTransactionId": {
          "description": "**OPTIONAL**: This identifier is specific to the integrator and is generated by the integrator. This is the identifier that the integrator knows this transaction by. For convenience, this identifier is included with in the remittance details",
          "type": "string"
        },
        "userMessage": {
          "description": "**DEPRECATED**: A description of the result to be displayed to the user if the result is not `SUCCESS`.",
          "type": "string"
        },
        "result": {
          "description": "**REQUIRED**: Result of this capture.",
          "type": "string",
          "enum": [
            "UNKNOWN_RESULT",
            "SUCCESS",
            "CHARGE_EXCEEDS_TRANSACTION_LIMIT",
            "CHARGE_EXCEEDS_DAILY_LIMIT",
            "CHARGE_EXCEEDS_MONTHLY_LIMIT",
            "CHARGE_UNDER_LIMIT",
            "INSUFFICIENT_FUNDS",
            "ACCOUNT_DOES_NOT_SUPPORT_CURRENCY",
            "ACCOUNT_CLOSED",
            "ACCOUNT_CLOSED_ACCOUNT_TAKEN_OVER",
            "ACCOUNT_ON_HOLD",
            "ACCOUNT_CLOSED_FRAUD",
            "GOOGLE_PAYMENT_TOKEN_INVALIDATED_BY_USER",
            "TOKEN_REFRESH_REQUIRED",
            "OTP_NOT_MATCHED",
            "OTP_ALREADY_USED",
            "RISK_DECLINED",
            "NO_GOOD_FUNDING_SOURCE_AVAILABLE",
            "FUNDING_SOURCE_UNAVAILABLE",
            "MANDATE_NOT_ACTIVE",
            "UPCOMING_TRANSACTION_NOTIFICATION_EXPIRED"
          ]
        },
        "rawResult": {
          "description": "**OPTIONAL**: Raw result of this capture. Used to help inform Google's risk engine and analytics. In decline code\u2013mapping situations, data is sometimes lost. The integrator can choose to give Google a raw code. For example, a credit card gateway (the integrator) may use this field to communicate to Google the exact decline code that was received from the VISA network. In that case, the `scope` would be \"visa\" and the `rawCode` would be whatever the VISA network returned. This value is **required** if the `result` is not `SUCCESS`.",
          "$ref": "#/definitions/RawResult"
        },
        "transactionLimit": {
          "description": "**OPTIONAL**: If Result is `CHARGE_EXCEEDS_TRANSACTION_LIMIT`, then this is the maximum amount the user could spend on a transaction (in [micros]({{glossary_path}}#micros \"What are micros?\")). This is used for structured, user facing messaging and decline rate analysis. This must be a limit relative to the `currencyCode` on the request.",
          "type": "string",
          "format": "int64"
        },
        "currentBalance": {
          "description": "**OPTIONAL**: If Result is `INSUFFICIENT_FUNDS`, then this is the current available balance in the user's account (in [micros]({{glossary_path}}#micros \"What are micros?\")). This is used for structured, user facing messaging. This value must be in the same currency as the `currencyCode` on the request.",
          "type": "string",
          "format": "int64"
        }
      }
    },
    "RawResult": {
      "description": "Raw result object.",
      "type": "object",
      "properties": {
        "scope": {
          "description": "**OPTIONAL**: Scope of the raw_code, can be empty.",
          "type": "string"
        },
        "rawCode": {
          "description": "**REQUIRED**: Raw code from the integrator or subsystems within it.",
          "type": "string"
        }
      }
    },
    "GetBalanceAndLimitsRequest": {
      "description": "Request object for the get balance and limits method.",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests.",
          "$ref": "#/definitions/RequestHeader"
        },
        "associationId": {
          "description": "**REQUIRED**: The associationId of the user's account, originally provided in the `associateAccount()` call during account linking.",
          "type": "string"
        }
      }
    },
    "GetBalanceAndLimitsResponse": {
      "description": "Response object for the get balance and limits method.",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/ResponseHeader"
        },
        "result": {
          "description": "**REQUIRED**: The result of the GetBalanceAndLimits call.",
          "$ref": "#/definitions/GetBalanceAndLimitsResult"
        }
      }
    },
    "GetBalanceAndLimitsResult": {
      "description": "Result codes for `GetBalanceAndLimits`.",
      "type": "object",
      "properties": {
        "success": {
          "description": "Details if the request completed successfully.",
          "$ref": "#/definitions/GetBalanceAndLimitsSuccess"
        },
        "accountClosed": {
          "description": "User's account held with the integrator has been closed.",
          "$ref": "#/definitions/Empty"
        },
        "accountClosedAccountTakenOver": {
          "description": "User's account with the integrator has been closed, suspected account take over.",
          "$ref": "#/definitions/Empty"
        },
        "accountClosedFraud": {
          "description": "User's account held with the integrator has been closed because of fraud.",
          "$ref": "#/definitions/Empty"
        }
      }
    },
    "GetBalanceAndLimitsSuccess": {
      "description": "Details of a successful api call.",
      "type": "object",
      "properties": {
        "currentBalance": {
          "description": "**REQUIRED**: The user's current balance, in micros.",
          "$ref": "#/definitions/Amount"
        },
        "transactionMaxLimit": {
          "description": "**OPTIONAL**: The user's limit per transaction, in micros.",
          "$ref": "#/definitions/Amount"
        },
        "transactionMinLimit": {
          "description": "**OPTIONAL**: The minimum allowable transaction amount, in micros.",
          "$ref": "#/definitions/Amount"
        },
        "remainingDailyLimit": {
          "description": "**OPTIONAL**: The amount available to the user before reaching daily transaction limits, in micros.",
          "$ref": "#/definitions/Amount"
        },
        "remainingMonthlyLimit": {
          "description": "**OPTIONAL**: The amount available to the user before reaching monthly transaction limits, in micros.",
          "$ref": "#/definitions/Amount"
        }
      }
    },
    "CreateMandateRequest": {
      "description": "Request object for the create mandate method.",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests.",
          "$ref": "#/definitions/RequestHeader"
        },
        "paymentIntegratorAccountId": {
          "description": "**REQUIRED**: This is the payment integrator account identifier that identifies contractual constraints around this transaction.",
          "type": "string"
        },
        "googlePaymentToken": {
          "description": "This is the token that both companies will use to identify the account for purchases between each other.",
          "type": "string"
        },
        "mandateId": {
          "description": "**REQUIRED**: The mandate id that will represent this mandate for all future operations.",
          "type": "string"
        },
        "mandateName": {
          "description": "**REQUIRED**: The name of the mandate to be displayed to the user. This could be treated like a title of the mandate for the user. This format can be changed without notice and must never be parsed.",
          "type": "string"
        },
        "mandateDescription": {
          "description": "**REQUIRED**: A description of the mandate that can be displayed to the user. This would be an informative explanation of the mandate for the user. This format can be changed without notice and must never be parsed.",
          "type": "string"
        },
        "startDate": {
          "description": "**REQUIRED**: The start date of the mandate to be created. This is represented as a Timestamp. This is the first millisecond of the day (in UTC) of the mandate start, 00:00:00.000",
          "$ref": "#/definitions/Timestamp"
        },
        "endDate": {
          "description": "**REQUIRED**: The end date of the mandate to be created. This is represented as a Timestamp. This is the first millisecond of the day (in UTC) of the mandate end, 00:00:00.000",
          "$ref": "#/definitions/Timestamp"
        },
        "fixedAmount": {
          "description": "A fixed amount that would be deducted on every recurrence. Every subsequent transaction on this mandate will be for this amount.",
          "$ref": "#/definitions/Amount"
        },
        "maximumAmount": {
          "description": "A maximum amount up to which can be deducted on every recurrence. Subsequent transactions on this mandate could be of any amount less than or equal to this amount.",
          "$ref": "#/definitions/Amount"
        },
        "frequency": {
          "description": "**REQUIRED**: The frequency at which the mandate will be executed.",
          "type": "string",
          "enum": [
            "FREQUENCY_UNSPECIFIED",
            "DAILY",
            "WEEKLY",
            "BIWEEKLY",
            "MONTHLY",
            "BIMONTHLY",
            "QUARTERLY",
            "HALF_YEARLY",
            "YEARLY",
            "AD_HOC"
          ]
        },
        "otpVerification": {
          "description": "Data necessary to verify an OTP generated from `sendOtp`. This is only present if the user went through the `sendOtp` path.",
          "$ref": "#/definitions/OtpVerification"
        }
      }
    },
    "Timestamp": {
      "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"
        }
      }
    },
    "CreateMandateResponse": {
      "description": "Response object for the create mandate method.",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/ResponseHeader"
        },
        "result": {
          "description": "**REQUIRED**: The result of the create mandate call.",
          "type": "string",
          "enum": [
            "CREATE_MANDATE_RESULT_CODE_UNSPECIFIED",
            "SUCCESS",
            "ACCOUNT_DOES_NOT_SUPPORT_MANDATE",
            "OTP_NOT_MATCHED",
            "OTP_ALREADY_USED",
            "OTP_LIMIT_REACHED",
            "OTP_EXPIRED",
            "SUSPECTED_FRAUD",
            "ACCOUNT_CLOSED",
            "ACCOUNT_CLOSED_ACCOUNT_TAKEN_OVER",
            "ACCOUNT_CLOSED_FRAUD",
            "ACCOUNT_ON_HOLD",
            "GOOGLE_PAYMENT_TOKEN_INVALIDATED_BY_USER"
          ]
        }
      }
    },
    "CancelMandateRequest": {
      "description": "Request object for the `cancelMandate` method call.",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests.",
          "$ref": "#/definitions/RequestHeader"
        },
        "paymentIntegratorAccountId": {
          "description": "**REQUIRED**: This is the payment integrator account identifier that identifies contractual constraints around this transaction.",
          "type": "string"
        },
        "mandateId": {
          "description": "**REQUIRED**: The Google generated ID of the mandate to cancel.",
          "type": "string"
        }
      }
    },
    "CancelMandateResponse": {
      "description": "Response object for the `cancelMandate` method call.",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/ResponseHeader"
        },
        "result": {
          "description": "**REQUIRED**: The result of the cancel mandate call.",
          "type": "string",
          "enum": [
            "CANCEL_MANDATE_RESULT_CODE_UNSPECIFIED",
            "SUCCESS"
          ]
        }
      }
    },
    "TransferFundsRequest": {
      "description": "Request object for the TransferFunds method.",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests.",
          "$ref": "#/definitions/RequestHeader"
        },
        "paymentIntegratorAccountId": {
          "description": "**REQUIRED**: This is the payment integrator account identifier that identifies contractual constraints around this transaction.",
          "type": "string"
        },
        "googlePaymentToken": {
          "type": "string"
        },
        "transactionDescription": {
          "description": "**REQUIRED**: This is the description of the transaction that can be put on the customer's statement. Localized to the userLocale found in the `requestHeader`. This format can be changed without notice and must never be parsed.",
          "type": "string"
        },
        "amount": {
          "description": "**REQUIRED**: The amount of the transfer",
          "$ref": "#/definitions/Amount"
        },
        "payeeProxy": {
          "description": "Payee that is referenced by a PayeeProxyKey",
          "$ref": "#/definitions/PayeeProxyDestination"
        }
      }
    },
    "PayeeProxyDestination": {
      "description": "Destination for Payee that uses a PayeeProxy key to reference a payee.",
      "type": "object",
      "properties": {
        "payeeProxyKey": {
          "description": "**REQUIRED**: Proxy Key that will be used for the Payee.",
          "$ref": "#/definitions/PayeeProxyKey"
        },
        "payeeProxyLookupRequestId": {
          "description": "**OPTIONAL**: `requestId` from a lookup for this PayeeProxyKey (if applicable). This value will be set when there was a DisplayInfo lookup done for this PayeeProxyKey in the context of this transfer.",
          "type": "string"
        }
      }
    },
    "PayeeProxyKey": {
      "description": "ProxyKey that may be used as a Payee if the proxy key is registered with a PayeeProxy directory and may be used to query the registration status or to retrieve display information from the directory.",
      "type": "object",
      "properties": {
        "phoneNumber": {
          "description": "A proxy key that is a phone number.",
          "type": "string"
        },
        "nationalId": {
          "description": "A proxy key that is a national ID number.",
          "$ref": "#/definitions/ProxyKeyNationalId"
        },
        "businessId": {
          "description": "A proxy key that is a business ID number.",
          "type": "string"
        },
        "virtualPaymentAddress": {
          "description": "A proxy key that is a virtual payment address.",
          "type": "string"
        },
        "qrCode": {
          "description": "A proxy key that is a QR code. For example, an EMVCo QR.",
          "type": "string"
        },
        "networkId": {
          "description": "**REQUIRED**: Network Id for the payee proxy. For example, 'PaymentNetwork1', 'PaymentNetwork2', etc.",
          "type": "string"
        }
      }
    },
    "ProxyKeyNationalId": {
      "description": "A proxy key that is a national ID number.",
      "type": "object",
      "properties": {
        "nationalId": {
          "description": "**REQUIRED**: The value of the national ID number.",
          "type": "string"
        },
        "issuingCountryCode": {
          "description": "**REQUIRED**: ID issuing country's country code, expected to be ISO-3166-1 Alpha-2.",
          "type": "string"
        }
      }
    },
    "TransferFundsResponse": {
      "description": "Response object for the funds transfer method.",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/ResponseHeader"
        },
        "paymentIntegratorTransactionId": {
          "description": "**OPTIONAL**: This identifier is specific to the integrator and is generated by the integrator. This is the identifier that the integrator knows this transaction by. For convenience, this identifier is included with in the remittance details",
          "type": "string"
        },
        "result": {
          "description": "Result of the FundsTransfer operation.",
          "$ref": "#/definitions/TransferFundsResponseTransferFundsResult"
        },
        "resultNotKnownYet": {
          "description": "Captures the scenario where the integrator itself doesn't have a definite status, maybe because they have not received it from the underlying payment network.",
          "$ref": "#/definitions/TransactionResultNotKnownYet"
        }
      }
    },
    "TransferFundsResponseTransferFundsResult": {
      "description": "Results for transfer",
      "type": "object",
      "properties": {
        "success": {
          "description": "Successful transfer.",
          "$ref": "#/definitions/Empty"
        },
        "chargeExceedsTransactionLimit": {
          "description": "This transfer request's `amount` exceeds per-transaction limit. If this code is used populate the transaction_limit field for user messaging purposes.",
          "$ref": "#/definitions/ChargeExceedsTransactionLimit"
        },
        "chargeExceedsDailyLimit": {
          "description": "This account cannot be used for transfers right now as it has exceeded its daily limits.",
          "$ref": "#/definitions/ChargeExceedsDailyLimit"
        },
        "chargeExceedsMonthlyLimit": {
          "description": "This account cannot be used for transfers right now as it has exceeded its monthly limits.",
          "$ref": "#/definitions/ChargeExceedsMonthlyLimit"
        },
        "chargeUnderLimit": {
          "description": "This transfer request's `amount` does not meet the minimum transaction amount.",
          "$ref": "#/definitions/ChargeUnderLimit"
        },
        "insufficientFunds": {
          "description": "This account does not have sufficient funds to guarantee this transfer.",
          "$ref": "#/definitions/InsufficientFunds"
        },
        "accountDoesNotSupportCurrency": {
          "description": "This account does not support the requested currency.",
          "$ref": "#/definitions/AccountDoesNotSupportCurrency"
        },
        "accountClosed": {
          "description": "The user's account held with the integrator has been closed. Returning this value will cause the user's instrument to be closed with Google. The user will be forced to add a new instrument by going through the association flow again.",
          "$ref": "#/definitions/AccountClosed"
        },
        "accountClosedAccountTakenOver": {
          "description": "The user's account with the integrator has been closed, suspected account take over. Returning this value will cause the user's instrument to be closed with Google. The user will be forced to add a new instrument by going through the association flow again.",
          "$ref": "#/definitions/AccountClosedAccountTakenOver"
        },
        "accountOnHold": {
          "description": "The account is on hold.",
          "$ref": "#/definitions/AccountOnHold"
        },
        "accountClosedFraud": {
          "description": "The user's account held with the integrator has been closed because of fraud. Returning this value will cause the user's instrument to be closed with Google. The user will be forced to add a new instrument by going through the association flow again.",
          "$ref": "#/definitions/AccountClosedFraud"
        },
        "googlePaymentTokenInvalidatedByUser": {
          "description": "The account is active, but the GPT has been invalidated by the user on the integrator's side. Returning this value will cause the user's instrument to be closed with Google. The user will be forced to add a new instrument by going through the association flow again.",
          "$ref": "#/definitions/GooglePaymentTokenInvalidatedByUser"
        },
        "tokenRefreshRequired": {
          "description": "Returning this requires the user to go through a refresh flow.",
          "$ref": "#/definitions/TokenRefreshRequired"
        },
        "payeeProxyNotRegistered": {
          "description": "The payee proxy is not registered.",
          "$ref": "#/definitions/PayeeProxyNotRegistered"
        },
        "declinedByBusinessRule": {
          "description": "The transaction was declined due to business rule violations on the integrator's side. This is a permanent failure for this payment, but does not cause the user's instrument to be closed at Google.",
          "$ref": "#/definitions/DeclinedByBusinessRule"
        },
        "riskDeclined": {
          "description": "The transaction was declined due to a risk check on the integrator's side. This is a permanent failure for this payment, but does not cause the user's instrument to be closed at Google.",
          "$ref": "#/definitions/RiskDeclined"
        }
      }
    },
    "ChargeExceedsTransactionLimit": {
      "description": "This payment request's `amount` exceeds per-transaction limit. If this code is used populate the transaction_limit field for user messaging purposes.",
      "type": "object",
      "properties": {
        "rawResult": {
          "description": "**OPTIONAL**: Raw result of this event. Used to help inform Google's risk engine and analytics. In decline code\u2013mapping situations, data is sometimes lost. The integrator can choose to give Google a raw code. For example, a credit card gateway (the integrator) may use this field to communicate to Google the exact decline code that was received from the VISA network. In that case, the `scope` would be \"visa\" and the `rawCode` would be whatever the VISA network returned.",
          "$ref": "#/definitions/RawResult"
        },
        "transactionLimit": {
          "description": "**REQUIRED**: This is the maximum amount the user could spend on a transaction. The `currencyCode` of `transactionLimit` must match the `currencyCode` of the request.",
          "$ref": "#/definitions/Amount"
        }
      }
    },
    "ChargeExceedsDailyLimit": {
      "description": "This account cannot be used for purchases right now as it has exceeded its daily `amount` limits.",
      "type": "object",
      "properties": {
        "rawResult": {
          "description": "**OPTIONAL**: Raw result of this event. Used to help inform Google's risk engine and analytics. In decline code\u2013mapping situations, data is sometimes lost. The integrator can choose to give Google a raw code. For example, a credit card gateway (the integrator) may use this field to communicate to Google the exact decline code that was received from the VISA network. In that case, the `scope` would be \"visa\" and the `rawCode` would be whatever the VISA network returned.",
          "$ref": "#/definitions/RawResult"
        }
      }
    },
    "ChargeExceedsMonthlyLimit": {
      "description": "This account cannot be used for purchases right now as it has exceeded its monthly `amount` limits.",
      "type": "object",
      "properties": {
        "rawResult": {
          "description": "**OPTIONAL**: Raw result of this event. Used to help inform Google's risk engine and analytics. In decline code\u2013mapping situations, data is sometimes lost. The integrator can choose to give Google a raw code. For example, a credit card gateway (the integrator) may use this field to communicate to Google the exact decline code that was received from the VISA network. In that case, the `scope` would be \"visa\" and the `rawCode` would be whatever the VISA network returned.",
          "$ref": "#/definitions/RawResult"
        }
      }
    },
    "ChargeUnderLimit": {
      "description": "This request's `amount` does not meet the minimum transaction amount.",
      "type": "object",
      "properties": {
        "rawResult": {
          "description": "**OPTIONAL**: Raw result of this event. Used to help inform Google's risk engine and analytics. In decline code\u2013mapping situations, data is sometimes lost. The integrator can choose to give Google a raw code. For example, a credit card gateway (the integrator) may use this field to communicate to Google the exact decline code that was received from the VISA network. In that case, the `scope` would be \"visa\" and the `rawCode` would be whatever the VISA network returned.",
          "$ref": "#/definitions/RawResult"
        },
        "minimumTransactionLimit": {
          "description": "**OPTIONAL**: This is the minimum amount the user could spend on a transaction. Note: this field will transition to REQUIRED in a future version of the API.",
          "$ref": "#/definitions/Amount"
        }
      }
    },
    "InsufficientFunds": {
      "description": "This account does not have sufficient funds to guarantee this capture.",
      "type": "object",
      "properties": {
        "rawResult": {
          "description": "**OPTIONAL**: Raw result of this event. Used to help inform Google's risk engine and analytics. In decline code\u2013mapping situations, data is sometimes lost. The integrator can choose to give Google a raw code. For example, a credit card gateway (the integrator) may use this field to communicate to Google the exact decline code that was received from the VISA network. In that case, the `scope` would be \"visa\" and the `rawCode` would be whatever the VISA network returned.",
          "$ref": "#/definitions/RawResult"
        },
        "currentBalance": {
          "description": "**OPTIONAL**: This is the current available balance for the account. If provided, this value will be included in user-facing messaging.",
          "$ref": "#/definitions/Amount"
        },
        "remedyMethod": {
          "description": "**OPTIONAL**: This is the remedy method to be applied for the user to help with the insufficient funds issue.",
          "$ref": "#/definitions/InsufficientFundsRemedyMethod"
        }
      }
    },
    "InsufficientFundsRemedyMethod": {
      "description": "Remedy method for `InsufficientFunds`.",
      "type": "object",
      "properties": {
        "topUp": {
          "description": "This account does not have sufficient funds to guarantee this transfer. The user should be recommended to top-up.",
          "$ref": "#/definitions/Empty"
        }
      }
    },
    "AccountDoesNotSupportCurrency": {
      "description": "This account does not support the requested currency.",
      "type": "object",
      "properties": {
        "rawResult": {
          "description": "**OPTIONAL**: Raw result of this event. Used to help inform Google's risk engine and analytics. In decline code\u2013mapping situations, data is sometimes lost. The integrator can choose to give Google a raw code. For example, a credit card gateway (the integrator) may use this field to communicate to Google the exact decline code that was received from the VISA network. In that case, the `scope` would be \"visa\" and the `rawCode` would be whatever the VISA network returned.",
          "$ref": "#/definitions/RawResult"
        }
      }
    },
    "AccountClosed": {
      "description": "The user's account held with the integrator has been closed.",
      "type": "object",
      "properties": {
        "rawResult": {
          "description": "**OPTIONAL**: Raw result of this event. Used to help inform Google's risk engine and analytics. In decline code\u2013mapping situations, data is sometimes lost. The integrator can choose to give Google a raw code. For example, a credit card gateway (the integrator) may use this field to communicate to Google the exact decline code that was received from the VISA network. In that case, the `scope` would be \"visa\" and the `rawCode` would be whatever the VISA network returned.",
          "$ref": "#/definitions/RawResult"
        }
      }
    },
    "AccountClosedAccountTakenOver": {
      "description": "The user's account with the integrator has been closed, suspected account take over.",
      "type": "object",
      "properties": {
        "rawResult": {
          "description": "**OPTIONAL**: Raw result of this event. Used to help inform Google's risk engine and analytics. In decline code\u2013mapping situations, data is sometimes lost. The integrator can choose to give Google a raw code. For example, a credit card gateway (the integrator) may use this field to communicate to Google the exact decline code that was received from the VISA network. In that case, the `scope` would be \"visa\" and the `rawCode` would be whatever the VISA network returned.",
          "$ref": "#/definitions/RawResult"
        }
      }
    },
    "AccountOnHold": {
      "description": "The account is on hold.",
      "type": "object",
      "properties": {
        "rawResult": {
          "description": "**OPTIONAL**: Raw result of this event. Used to help inform Google's risk engine and analytics. In decline code\u2013mapping situations, data is sometimes lost. The integrator can choose to give Google a raw code. For example, a credit card gateway (the integrator) may use this field to communicate to Google the exact decline code that was received from the VISA network. In that case, the `scope` would be \"visa\" and the `rawCode` would be whatever the VISA network returned.",
          "$ref": "#/definitions/RawResult"
        }
      }
    },
    "AccountClosedFraud": {
      "description": "The user's account held with the integrator has been closed because of fraud.",
      "type": "object",
      "properties": {
        "rawResult": {
          "description": "**OPTIONAL**: Raw result of this event. Used to help inform Google's risk engine and analytics. In decline code\u2013mapping situations, data is sometimes lost. The integrator can choose to give Google a raw code. For example, a credit card gateway (the integrator) may use this field to communicate to Google the exact decline code that was received from the VISA network. In that case, the `scope` would be \"visa\" and the `rawCode` would be whatever the VISA network returned.",
          "$ref": "#/definitions/RawResult"
        }
      }
    },
    "GooglePaymentTokenInvalidatedByUser": {
      "description": "The account is active, but the GPT has been invalidated by the user on the integrator's side.",
      "type": "object",
      "properties": {
        "rawResult": {
          "description": "**OPTIONAL**: Raw result of this event. Used to help inform Google's risk engine and analytics. In decline code\u2013mapping situations, data is sometimes lost. The integrator can choose to give Google a raw code. For example, a credit card gateway (the integrator) may use this field to communicate to Google the exact decline code that was received from the VISA network. In that case, the `scope` would be \"visa\" and the `rawCode` would be whatever the VISA network returned.",
          "$ref": "#/definitions/RawResult"
        }
      }
    },
    "TokenRefreshRequired": {
      "description": "Returning this requires the user to go through a refresh flow.",
      "type": "object",
      "properties": {
        "rawResult": {
          "description": "**OPTIONAL**: Raw result of this event. Used to help inform Google's risk engine and analytics. In decline code\u2013mapping situations, data is sometimes lost. The integrator can choose to give Google a raw code. For example, a credit card gateway (the integrator) may use this field to communicate to Google the exact decline code that was received from the VISA network. In that case, the `scope` would be \"visa\" and the `rawCode` would be whatever the VISA network returned.",
          "$ref": "#/definitions/RawResult"
        }
      }
    },
    "PayeeProxyNotRegistered": {
      "description": "The payee proxy is not registered.",
      "type": "object",
      "properties": {
        "rawResult": {
          "description": "**OPTIONAL**: Raw result of this event. Used to help inform Google's risk engine and analytics. In decline code\u2013mapping situations, data is sometimes lost. The integrator can choose to give Google a raw code. For example, a credit card gateway (the integrator) may use this field to communicate to Google the exact decline code that was received from the VISA network. In that case, the `scope` would be \"visa\" and the `rawCode` would be whatever the VISA network returned.",
          "$ref": "#/definitions/RawResult"
        }
      }
    },
    "DeclinedByBusinessRule": {
      "description": "The transaction was declined due to internal business rule violations on the integrator's side. This should only be used if the integrator cannot provide a specific reason, such as black-box decisions.",
      "type": "object",
      "properties": {
        "rawResult": {
          "description": "**OPTIONAL**: Raw result of this event. Used to help inform Google's risk engine and analytics. In decline code\u2013mapping situations, data is sometimes lost. The integrator can choose to give Google a raw code. For example, a credit card gateway (the integrator) may use this field to communicate to Google the exact decline code that was received from the VISA network. In that case, the `scope` would be \"visa\" and the `rawCode` would be whatever the VISA network returned.",
          "$ref": "#/definitions/RawResult"
        }
      }
    },
    "RiskDeclined": {
      "description": "The transaction was declined due to a risk check on the integrator's side.",
      "type": "object",
      "properties": {
        "rawResult": {
          "description": "**OPTIONAL**: Raw result of this event. Used to help inform Google's risk engine and analytics. In decline code\u2013mapping situations, data is sometimes lost. The integrator can choose to give Google a raw code. For example, a credit card gateway (the integrator) may use this field to communicate to Google the exact decline code that was received from the VISA network. In that case, the `scope` would be \"visa\" and the `rawCode` would be whatever the VISA network returned.",
          "$ref": "#/definitions/RawResult"
        }
      }
    },
    "TransactionResultNotKnownYet": {
      "description": "Transaction result not known yet.",
      "type": "object",
      "properties": {
        "creditStatusUnknown": {
          "description": "Credit status unknown. This is one of the common scenarios where a transaction is unknown in a real time payment system when debit leg is successful but the credit leg is unknown.",
          "$ref": "#/definitions/Empty"
        }
      }
    },
    "GetTransferFundsTransactionStatusRequest": {
      "description": "Request object for GetTransferFundsTransactionStatus.",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests.",
          "$ref": "#/definitions/RequestHeader"
        },
        "transferFundsRequestId": {
          "description": "**REQUIRED**: The request_id of the original TransferFunds transaction.",
          "type": "string"
        },
        "paymentIntegratorAccountId": {
          "description": "**OPTIONAL**: This is the payment integrator account identifier that identifies contractual constraints around this transaction.",
          "type": "string"
        }
      }
    },
    "GetTransferFundsTransactionStatusResponse": {
      "description": "Response object for GetTransferFundsTransactionStatus.",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/ResponseHeader"
        },
        "result": {
          "description": "**REQUIRED**: Result of this GetTransactionStatus call.",
          "$ref": "#/definitions/GetTransactionStatusResult"
        },
        "transferFundsResult": {
          "description": "Result of the FundsTransfer operation.",
          "$ref": "#/definitions/TransferFundsResponseTransferFundsResult"
        },
        "transactionDoesNotExist": {
          "description": "The transaction was not found in the system. This can happen if the call from Google to partner got dropped and the partner never received the original transaction. Now when Google tries to lookup the status, partner should return this error code to indicate that the transaction doesn't exist in the system. Google should mark the transaction as failed in that case. It is different than a Http 404 where the URL of GetTransactionStatus was not found in which case Google can't update the status of the transaction.",
          "$ref": "#/definitions/Empty"
        },
        "resultNotKnownYet": {
          "description": "Captures the scenario where the integrator itself doesn't have a definite status, maybe because they have not received it from the underlying payment network.",
          "$ref": "#/definitions/TransactionResultNotKnownYet"
        }
      }
    },
    "GetTransactionStatusResult": {
      "description": "Result codes for GetTransactionStatus. This indicates the status of the lookup operation and not the actual transaction. If the transaction look up failed due to some internal error, the partner should return a non 200 Http error code.",
      "type": "object",
      "properties": {
        "success": {
          "description": "Successful lookup.",
          "$ref": "#/definitions/Empty"
        }
      }
    },
    "SendOtpRequest": {
      "description": "Request object for the `sendOtp` method.",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests.",
          "$ref": "#/definitions/RequestHeader"
        },
        "accountPhoneNumber": {
          "description": "This is a E.164 formatted phone number. Examples include +14035551111 and +918067218000. This will always lead with a + and include only numbers afterwards (no dashes). This is populated when a user initially associates their account with Google and during reassociation.",
          "type": "string"
        },
        "associationId": {
          "description": "This is the association identifier used to reference a user's account. This is populated for all subsequent calls after initial association.",
          "type": "string"
        },
        "smsMatchingToken": {
          "description": "**REQUIRED**: This value is provided by Google and must be included in the SMS delivered to the user. This allows Google to auto-match the SMS on the device for Android O devices (see reference ). This will be 11 characters. So for example, if the SMS normally looks like: Here's the OTP you requested: &LT;OTP&GT; And Google sends \"0123456789A\" for this field, then the SMS should look like: 0123456789A Here's the OTP you requested: YYXXZZ Alternatively it could look like: Here's the OTP you requested: YYXXZZ 0123456789A ",
          "type": "string"
        },
        "otpContext": {
          "description": "**OPTIONAL**: This is the context in which an OTP is being requested. *Note:* This field will be made REQUIRED in Q3 of 2022. ",
          "$ref": "#/definitions/SendOtpRequestOtpContext"
        }
      }
    },
    "SendOtpRequestOtpContext": {
      "description": "Context in which an OTP is being requested.",
      "type": "object",
      "properties": {
        "association": {
          "description": "OTP is being requested in the context of association\/re-association.",
          "$ref": "#/definitions/Empty"
        },
        "mandateCreation": {
          "description": "OTP is being requested in the context of mandate creation.",
          "$ref": "#/definitions/Empty"
        },
        "associationWithMandateCreation": {
          "description": "OTP is being requested for association along with mandate creation.",
          "$ref": "#/definitions/Empty"
        }
      }
    },
    "SendOtpResponse": {
      "description": "Response object for the sendOtp method.",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/ResponseHeader"
        },
        "paymentIntegratorSendOtpId": {
          "description": "**OPTIONAL**: Identifier the integrator knows this send OTP request as. This is integrator generated.",
          "type": "string"
        },
        "result": {
          "description": "**REQUIRED**: Result of this request",
          "type": "string",
          "enum": [
            "UNKNOWN_RESULT",
            "SUCCESS",
            "PHONE_NUMBER_NOT_ASSOCIATED_WITH_ACCOUNT",
            "UNKNOWN_PHONE_NUMBER",
            "MESSAGE_UNABLE_TO_BE_SENT",
            "INVALID_PHONE_NUMBER",
            "NOT_ELIGIBLE",
            "OTP_LIMIT_REACHED",
            "ACCOUNT_CLOSED",
            "ACCOUNT_CLOSED_ACCOUNT_TAKEN_OVER",
            "ACCOUNT_CLOSED_FRAUD"
          ]
        }
      }
    },
    "VerifyOtpRequest": {
      "description": "Request object for the verifyOtp method.",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests.",
          "$ref": "#/definitions/RequestHeader"
        },
        "sendOtpRequestId": {
          "description": "**REQUIRED**: `requestId` from the `sendOtp` request that preceded this call.",
          "type": "string"
        },
        "otp": {
          "description": "**REQUIRED**: This is the OTP the user provided, which this call is verifying",
          "type": "string"
        }
      }
    },
    "VerifyOtpResponse": {
      "description": "Response object for the verifyOtp method.",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/ResponseHeader"
        },
        "paymentIntegratorVerifyOtpId": {
          "description": "**OPTIONAL**: Identifier the integrator knows this verify OTP request as. This is integrator generated.",
          "type": "string"
        },
        "result": {
          "description": "**REQUIRED**: Result of this request",
          "type": "string",
          "enum": [
            "UNKNOWN_RESULT",
            "SUCCESS",
            "OTP_NOT_MATCHED",
            "OTP_ALREADY_USED"
          ]
        }
      }
    },
    "RefundRequest": {
      "description": "Request object for the refund method.",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests.",
          "$ref": "#/definitions/RequestHeader"
        },
        "paymentIntegratorAccountId": {
          "description": "**REQUIRED**: This is the payment integrator account ID that defines contractual constraints around this transaction.",
          "type": "string"
        },
        "captureRequestId": {
          "description": "**REQUIRED**: A unique identifier for this transaction. This is the `requestId` generated by Google during the `capture` call which this request is associated with.",
          "type": "string"
        },
        "currencyCode": {
          "description": "**REQUIRED**: ISO 4217 3-letter currency code",
          "type": "string"
        },
        "refundAmount": {
          "description": "**REQUIRED**: The amount of the refund, a positive number of [micros]({{glossary_path}}#micros \"What are micros?\") of the currency unit.",
          "type": "string",
          "format": "int64"
        }
      }
    },
    "RefundResponse": {
      "description": "Response object for the refund method.",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/ResponseHeader"
        },
        "paymentIntegratorRefundId": {
          "description": "**OPTIONAL**: This identifier is specific to the integrator and is generated by the integrator. This is the identifier that the integrator knows this refund by. For convenience, this identifier is included with in the remittance details",
          "type": "string"
        },
        "result": {
          "description": "**REQUIRED**: Result of this refund.",
          "type": "string",
          "enum": [
            "UNKNOWN_RESULT",
            "SUCCESS",
            "NO_MONEY_LEFT_ON_TRANSACTION",
            "ACCOUNT_CLOSED",
            "ACCOUNT_CLOSED_ACCOUNT_TAKEN_OVER",
            "ACCOUNT_CLOSED_FRAUD",
            "ACCOUNT_ON_HOLD",
            "REFUND_EXCEEDS_MAXIMUM_BALANCE",
            "REFUND_WINDOW_EXCEEDED",
            "CAPTURE_USED_PROMOTIONAL_BALANCE",
            "ISSUER_DOES_NOT_SUPPORT_REFUND",
            "GOOGLE_PAYMENT_TOKEN_INVALIDATED_BY_USER"
          ]
        },
        "rawResult": {
          "description": "**OPTIONAL**: Raw result of this refund. Used to help inform Google's risk engine and analytics. In decline code\u2013mapping situations, data is sometimes lost. The integrator can choose to give Google a raw code. For example, a credit card gateway (the integrator) may use this field to communicate to Google the exact decline code that was received from the VISA network. In that case, the `scope` would be \"visa\" and the `rawCode` would be whatever the VISA network returned. This value is **required** if the `result` is not `SUCCESS`.",
          "$ref": "#/definitions/RawResult"
        }
      }
    },
    "ReserveFundsRequest": {
      "description": "Request object for the reserve funds method.",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests.",
          "$ref": "#/definitions/RequestHeader"
        },
        "paymentIntegratorAccountId": {
          "description": "**REQUIRED**: This is the payment integrator account identifier that identifies contractual constraints around this transaction.",
          "type": "string"
        },
        "googlePaymentToken": {
          "description": "**REQUIRED**: This is the token that both companies will use to identify the account for purchases between each other.",
          "type": "string"
        },
        "transactionDescription": {
          "description": "**REQUIRED**: This is the description of the transaction that can be put on the customer's statement. Localized to the userLocale found in the `request_header`. This format can be changed without notice and must never be parsed.",
          "type": "string"
        },
        "currencyCode": {
          "description": "**REQUIRED**: ISO 4217 3-letter currency code",
          "type": "string"
        },
        "amount": {
          "description": "**REQUIRED**: The amount of the purchase, in micros of the currency unit.",
          "type": "string",
          "format": "int64"
        },
        "reserveFundsContext": {
          "description": "**REQUIRED**: Context about this funds reservation.",
          "$ref": "#/definitions/ReserveFundsContext"
        }
      }
    },
    "ReserveFundsContext": {
      "description": "This object provides context about how the funds reservation was requested.",
      "type": "object",
      "properties": {
        "userIpAddress": {
          "description": "**OPTIONAL**: This is the IP address of the user's device if the purchase was made by a user in session. If the user was not in session this will empty. If the particular contract doesn't stipulate the need for this field it will always be empty.",
          "type": "string"
        },
        "shippingAddress": {
          "description": "**OPTIONAL**: This is the shipping address for a physical goods order. If the particular contract doesn't stipulate the need for this field it will always be empty.",
          "$ref": "#/definitions/Address"
        }
      }
    },
    "Address": {
      "description": "Structure holding information about an address.",
      "type": "object",
      "properties": {
        "name": {
          "description": "**OPTIONAL**: Customer's full name.",
          "type": "string"
        },
        "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"
        }
      }
    },
    "ReserveFundsResponse": {
      "description": "Response object for the funds reservation method.",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/ResponseHeader"
        },
        "paymentIntegratorTransactionId": {
          "description": "**REQUIRED**: This identifier is specific to the integrator and is generated by the integrator. This is the identifier that the integrator knows this transaction by.",
          "type": "string"
        },
        "result": {
          "description": "**REQUIRED**: Result of this funds reservation.",
          "type": "string",
          "enum": [
            "RESERVE_FUNDS_RESULT_CODE_UNSPECIFIED",
            "SUCCESS",
            "CHARGE_EXCEEDS_TRANSACTION_LIMIT",
            "CHARGE_EXCEEDS_DAILY_LIMIT",
            "CHARGE_EXCEEDS_MONTHLY_LIMIT",
            "CHARGE_UNDER_LIMIT",
            "INSUFFICIENT_FUNDS",
            "ACCOUNT_DOES_NOT_SUPPORT_CURRENCY",
            "ACCOUNT_CLOSED",
            "ACCOUNT_CLOSED_ACCOUNT_TAKEN_OVER",
            "ACCOUNT_ON_HOLD",
            "ACCOUNT_CLOSED_FRAUD",
            "GOOGLE_PAYMENT_TOKEN_INVALIDATED_BY_USER",
            "TOKEN_REFRESH_REQUIRED",
            "RISK_DECLINED"
          ]
        },
        "rawResult": {
          "description": "**OPTIONAL**: Raw result of this reservation. Used to help inform Google's risk engine and analytics. In decline code\u2013mapping situations, data is sometimes lost. The integrator can choose to give Google a raw code. For example, a credit card gateway (the integrator) may use this field to communicate to Google the exact decline code that was received from the VISA network. In that case, the `scope` would be \"visa\" and the `raw_code` would be whatever the VISA network returned. This value is **required** if the `result` is not `SUCCESS`.",
          "$ref": "#/definitions/RawResult"
        },
        "transactionLimit": {
          "description": "**OPTIONAL**: If Result is `CHARGE_EXCEEDS_TRANSACTION_LIMIT`, then this is the maximum amount the user could spend on a transaction (in micros). This is used for structured, user facing messaging and decline rate analysis. This must be a limit relative to the `currencyCode` on the request.",
          "type": "string",
          "format": "int64"
        },
        "expirationTimestamp": {
          "description": "**OPTIONAL**: The expiration timestamp for this funds reservation represented as milliseconds since epoch. This value is **required** if the `result` is `SUCCESS`.",
          "type": "string",
          "format": "int64"
        },
        "installmentPlan": {
          "description": "**OPTIONAL**: Information about the installment plan that this funds reservation is associated with. This field is **required** if the funds reservation is associated with an installment or financing plan. This information may be used to calculate processor fees.",
          "$ref": "#/definitions/ReserveFundsResponseInstallmentPlan"
        }
      }
    },
    "ReserveFundsResponseInstallmentPlan": {
      "description": "Information about an installment plan.",
      "type": "object",
      "properties": {
        "installmentPlanType": {
          "description": "**REQUIRED**: The installment plan type.",
          "type": "string",
          "enum": [
            "INSTALLMENT_PLAN_TYPE_UNSPECIFIED",
            "TERM_LOAN_24_MONTHS",
            "PAY_IN_3_INSTALLMENTS",
            "PAY_IN_4_INSTALLMENTS",
            "PAY_IN_6_INSTALLMENTS",
            "PAY_IN_9_INSTALLMENTS",
            "PAY_IN_12_INSTALLMENTS",
            "PAY_IN_18_INSTALLMENTS",
            "PAY_IN_36_INSTALLMENTS",
            "PAY_NOW",
            "PAY_30_DAYS_LATER"
          ]
        }
      }
    },
    "CancelFundsReservationRequest": {
      "description": "Request object for the cancel funds reservation method.",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests.",
          "$ref": "#/definitions/RequestHeader"
        },
        "paymentIntegratorAccountId": {
          "description": "**REQUIRED**: This is the payment integrator account identifier that identifies contractual constraints around this transaction.",
          "type": "string"
        },
        "reserveFundsRequestId": {
          "description": "**REQUIRED**: `requestId` of the reserve funds call for this transaction.",
          "type": "string"
        }
      }
    },
    "CancelFundsReservationResponse": {
      "description": "Response object for the cancel method.",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/ResponseHeader"
        },
        "result": {
          "description": "**REQUIRED**: Result of this cancel.",
          "type": "string",
          "enum": [
            "CANCEL_RESERVED_FUNDS_RESULT_CODE_UNSPECIFIED",
            "SUCCESS"
          ]
        }
      }
    },
    "CaptureFundsReservationRequest": {
      "description": "Request object for the capture funds reservation method.",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests.",
          "$ref": "#/definitions/RequestHeader"
        },
        "paymentIntegratorAccountId": {
          "description": "**REQUIRED**: This is the payment integrator account identifier that identifies contractual constraints around this transaction.",
          "type": "string"
        },
        "reserveFundsRequestId": {
          "description": "**REQUIRED**: `requestId` of the reserve funds call for this transaction.",
          "type": "string"
        },
        "amount": {
          "description": "**REQUIRED**: The amount of the purchase, in micros of the currency unit specified in the prior funds reservation. This amount can be less than or equal to the amount specified in the prior funds reservation. An example situation when this would occur would be, if Google runs out of stock for one item in a an order with multiple items.",
          "type": "string",
          "format": "int64"
        }
      }
    },
    "CaptureFundsReservationResponse": {
      "description": "Response object for the capture method.",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/ResponseHeader"
        },
        "paymentIntegratorCaptureId": {
          "description": "**REQUIRED**: This identifier is specific to the integrator and is generated by the integrator. This is the identifier that the integrator knows this capture by. For convenience, this identifier is included with in the remittance details",
          "type": "string"
        },
        "result": {
          "description": "**REQUIRED**: Result of this capture.",
          "type": "string",
          "enum": [
            "CAPTURE_RESERVED_FUNDS_RESULT_CODE_UNSPECIFIED",
            "SUCCESS",
            "FUNDS_RESERVATION_EXPIRED"
          ]
        },
        "rawResult": {
          "description": "**OPTIONAL**: Raw result of this capture. Used to help inform Google's risk engine and analytics. In decline code\u2013mapping situations, data is sometimes lost. The integrator can choose to give Google a raw code. For example, a credit card gateway (the integrator) may use this field to communicate to Google the exact decline code that was received from the VISA network. In that case, the `scope` would be \"visa\" and the `rawCode` would be whatever the VISA network returned. This value is **required** if the `result` is not `SUCCESS`.",
          "$ref": "#/definitions/RawResult"
        }
      }
    },
    "SimulatePaymentRequest": {
      "description": "Request object for SimulatePayment method.",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests.",
          "$ref": "#/definitions/RequestHeader"
        },
        "associationId": {
          "description": "**REQUIRED**: The associationId of the user's account, originally provided in the `associateAccount()` call during account linking.",
          "type": "string"
        },
        "amount": {
          "description": "**REQUIRED**: The transaction amount to evaluate.",
          "$ref": "#/definitions/Amount"
        },
        "payeeProxy": {
          "description": "Payee that is referenced by a PayeeProxyKey",
          "$ref": "#/definitions/PayeeProxyDestination"
        },
        "fundsDestinationNotApplicable": {
          "description": "Funds destination information is not applicable for this payment.",
          "$ref": "#/definitions/Empty"
        },
        "paymentIntegratorAccountId": {
          "description": "**REQUIRED**: This is the payment integrator account identifier that identifies contractual constraints around this transaction.",
          "type": "string"
        }
      }
    },
    "SimulatePaymentResponse": {
      "description": "Response object for the payment integrator hosted SimulatePayment method.",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/ResponseHeader"
        },
        "result": {
          "description": "**REQUIRED**: The result of the SimulatePayment call.",
          "$ref": "#/definitions/SimulatePaymentResult"
        }
      }
    },
    "SimulatePaymentResult": {
      "description": "Result codes for `SimulatePayment`.",
      "type": "object",
      "properties": {
        "success": {
          "description": "Successful payment.",
          "$ref": "#/definitions/SuccessDetails"
        },
        "successWithAlternateFunds": {
          "description": "Successful payment with alternate funding sources.",
          "$ref": "#/definitions/SuccessDetails"
        },
        "insufficientFunds": {
          "description": "This account does not have sufficient funds to guarantee this payment. Based on the remedyMethod user will be recommended for top-up.",
          "$ref": "#/definitions/InsufficientFunds"
        },
        "chargeExceedsTransactionLimit": {
          "description": "This payment request's `amount` exceeds per-transaction limit. If this code is used populate the transaction_limit field for user messaging purposes.",
          "$ref": "#/definitions/ChargeExceedsTransactionLimit"
        },
        "chargeExceedsDailyLimit": {
          "description": "This account cannot be used for payments right now as it has exceeded its daily limits.",
          "$ref": "#/definitions/ChargeExceedsDailyLimit"
        },
        "chargeExceedsMonthlyLimit": {
          "description": "This account cannot be used for payments right now as it has exceeded its monthly limits.",
          "$ref": "#/definitions/ChargeExceedsMonthlyLimit"
        },
        "chargeUnderLimit": {
          "description": "This payment request's `amount` does not meet the minimum transaction amount.",
          "$ref": "#/definitions/ChargeUnderLimit"
        },
        "accountDoesNotSupportCurrency": {
          "description": "This account does not support the requested currency.",
          "$ref": "#/definitions/AccountDoesNotSupportCurrency"
        },
        "accountClosed": {
          "description": "The user's account held with the integrator has been closed. Returning this value will cause the user's instrument to be closed with Google. The user will be forced to add a new instrument by going through the association flow again.",
          "$ref": "#/definitions/AccountClosed"
        },
        "accountClosedAccountTakenOver": {
          "description": "The user's account with the integrator has been closed, suspected account take over. Returning this value will cause the user's instrument to be closed with Google. The user will be forced to add a new instrument by going through the association flow again.",
          "$ref": "#/definitions/AccountClosedAccountTakenOver"
        },
        "accountOnHold": {
          "description": "The account is on hold.",
          "$ref": "#/definitions/AccountOnHold"
        },
        "accountClosedFraud": {
          "description": "The user's account held with the integrator has been closed because of fraud. Returning this value will cause the user's instrument to be closed with Google. The user will be forced to add a new instrument by going through the association flow again.",
          "$ref": "#/definitions/AccountClosedFraud"
        },
        "googlePaymentTokenInvalidatedByUser": {
          "description": "The account is active, but the GPT has been invalidated by the user on the integrator's side. Returning this value will cause the user's instrument to be closed with Google. The user will be forced to add a new instrument by going through the association flow again.",
          "$ref": "#/definitions/GooglePaymentTokenInvalidatedByUser"
        },
        "payeeProxyNotRegistered": {
          "description": "The payee proxy is not registered.",
          "$ref": "#/definitions/PayeeProxyNotRegistered"
        },
        "declinedByBusinessRule": {
          "description": "The transaction was declined due to business rule violations on the integrator's side.",
          "$ref": "#/definitions/DeclinedByBusinessRule"
        }
      }
    },
    "SuccessDetails": {
      "description": "Success details for `SimulatePayment`.",
      "type": "object",
      "properties": {
        "currentBalance": {
          "description": "**OPTIONAL**: This is the current available balance for the account. If provided, this value will be included in user-facing messaging.",
          "$ref": "#/definitions/Amount"
        },
        "alternateFunds": {
          "description": "**OPTIONAL**: Funding source information provided by the integrator, for example if or how the transaction could be partially funded by alternate sources.",
          "type": "array",
          "items": {
            "$ref": "#/definitions/SuccessDetailsAlternateFunds"
          }
        }
      }
    },
    "SuccessDetailsAlternateFunds": {
      "description": "Alternate funding source information.",
      "type": "object",
      "properties": {
        "description": {
          "description": "**REQUIRED**: This is the label that describes the funding source, for example \"Auto top-up\" or \"InvisiPoints\".",
          "type": "string"
        },
        "value": {
          "description": "**OPTIONAL**: This is the value of the funding source.",
          "$ref": "#/definitions/Decimal"
        },
        "equivalentMonetaryValue": {
          "description": "**OPTIONAL**: This is the monetary value equivalent to the alternate funds used.",
          "$ref": "#/definitions/Amount"
        },
        "autoTopUpEnabled": {
          "description": "**OPTIONAL**: This is to indicate that this funding source can be used to top up a user's eWallet balance.",
          "$ref": "#/definitions/Empty"
        },
        "autoPaymentEnabled": {
          "description": "**OPTIONAL**: This is to indicate that this funding source can be used to complete the payment when the balance amount is below a threshold.",
          "$ref": "#/definitions/Empty"
        }
      }
    },
    "Decimal": {
      "description": "A representation of a decimal value, such as 2.5. Clients may convert values into language-native decimal formats, such as Java's BigDecimal or Python's decimal.Decimal. [BigDecimal]: https:\/\/docs.oracle.com\/en\/java\/javase\/11\/docs\/api\/java.base\/java\/math\/BigDecimal.html [decimal.Decimal]: https:\/\/docs.python.org\/3\/library\/decimal.html",
      "type": "object",
      "properties": {
        "value": {
          "description": "**REQUIRED**: The decimal value, as a string. The string representation consists of an optional sign, `+` (`U+002B`) or `-` (`U+002D`), followed by a sequence of zero or more decimal digits (\"the integer\"), optionally followed by a fraction, optionally followed by an exponent. The fraction consists of a decimal point followed by zero or more decimal digits. The string must contain at least one digit in either the integer or the fraction. The number formed by the sign, the integer and the fraction is referred to as the significand. The exponent consists of the character `e` (`U+0065`) or `E` (`U+0045`) followed by one or more decimal digits. Services **should** normalize decimal values before storing them by: - Removing an explicitly-provided `+` sign (`+2.5` -> `2.5`). - Replacing a zero-length integer value with `0` (`.5` -> `0.5`). - Coercing the exponent character to lower-case (`2.5E8` -> `2.5e8`). - Removing an explicitly-provided zero exponent (`2.5e0` -> `2.5`). Services **may** perform additional normalization based on its own needs and the internal decimal implementation selected, such as shifting the decimal point and exponent value together (example: `2.5e-1` <-> `0.25`). Additionally, services **may** preserve trailing zeroes in the fraction to indicate increased precision, but are not required to do so. Note that only the `.` character is supported to divide the integer and the fraction; `,` **should not** be supported regardless of locale. Additionally, thousand separators **should not** be supported. If a service does support them, values **must** be normalized. The ENBF grammar is: DecimalString = [Sign] Significand [Exponent]; Sign = '+' | '-'; Significand = Digits '.' | [Digits] '.' Digits; Exponent = ('e' | 'E') [Sign] Digits; Digits = { '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' }; Services **should** clearly document the range of supported values, the maximum supported precision (total number of digits), and, if applicable, the scale (number of digits after the decimal point), as well as how it behaves when receiving out-of-bounds values. Services **may** choose to accept values passed as input even when the value has a higher precision or scale than the service supports, and **should** round the value to fit the supported scale. Alternatively, the service **may** error with `400 Bad Request` (`INVALID_ARGUMENT` in gRPC) if precision would be lost. Services **should** error with `400 Bad Request` (`INVALID_ARGUMENT` in gRPC) if the service receives a value outside of the supported range.",
          "type": "string"
        }
      }
    },
    "UpcomingTransactionNotificationRequest": {
      "description": "Request object for the `upcomingTransactionNotification` method.",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests.",
          "$ref": "#/definitions/RequestHeader"
        },
        "paymentIntegratorAccountId": {
          "description": "**REQUIRED**: This is the payment integrator account identifier that identifies contractual constraints around this transaction.",
          "type": "string"
        },
        "mandateId": {
          "description": "**REQUIRED**: The Google generated ID that uniquely identifies the mandate for this recurring payment. This is provided in the `CreateMandateRequest` by Google during the `createMandate` method.",
          "type": "string"
        },
        "upcomingTransactionNotBeforeTimestamp": {
          "description": "**REQUIRED**: Timestamp of when the upcoming transaction will be excecuted. The timestamp represents the exact time before which a transaction should not occur, but delay in the transaction beyond the timestamp should be expected.",
          "$ref": "#/definitions/Timestamp"
        },
        "transactionAmount": {
          "description": "**REQUIRED**: The amount of the upcoming transaction.",
          "$ref": "#/definitions/Amount"
        },
        "transactionDescription": {
          "description": "**REQUIRED**: A brief description of the upcoming transaction. This format can be changed without notice and must never be parsed.",
          "type": "string"
        }
      }
    },
    "UpcomingTransactionNotificationResponse": {
      "description": "Response object for the `upcomingTransactionNotification` method.",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/ResponseHeader"
        },
        "result": {
          "description": "**REQUIRED**: Result of this `UpcomingTransactionNotification` call.",
          "type": "string",
          "enum": [
            "UPCOMING_TRANSACTION_NOTIFICATION_RESULT_CODE_UNSPECIFIED",
            "SUCCESS",
            "MANDATE_NOT_ACTIVE",
            "MANDATE_PAUSED",
            "CHARGE_EXCEEDS_TRANSACTION_LIMIT",
            "ACCOUNT_ON_HOLD"
          ]
        },
        "rawResult": {
          "description": "**OPTIONAL**: Raw result of this transaction. Used to help inform Google's risk engine and analytics. In decline code\u2013mapping situations, data is sometimes lost. The integrator can choose to give Google a raw code. For example, a credit card gateway (the integrator) may use this field to communicate to Google the exact decline code that was received from the VISA network. In that case, the `scope` would be \"visa\" and the `rawCode` would be whatever the VISA network returned. This value is **required** if the `result` is not `SUCCESS`.",
          "$ref": "#/definitions/RawResult"
        }
      }
    },
    "AuthenticationRequest": {
      "description": "Object sent during authentication request. Here's an example of a clear text JSON request: {\"requestId\": \"375dhjf9-Uydd=\"} The `AuthenticationRequest` is encrypted and signed using PGP or JWE+JWS. Further, this value is web-safe base64 encoded. This encoding is referred to below as `Base64UrlEncode`. In other words, the clear text JSON version of the `AuthenticationRequest` must be passed through the following functions: Base64UrlEncode( PGPSignAndEncrypt( {\"requestId\": \"375dhjf9-Uydd=\"} ) ) or Base64UrlEncode( JWSignAndEncrypt( {\"requestId\": \"375dhjf9-Uydd=\"} ) ) ",
      "type": "object",
      "properties": {
        "requestId": {
          "description": "**REQUIRED**: Identifier for this request.",
          "type": "string"
        },
        "associationId": {
          "description": "**OPTIONAL**: The ID that represents the association between a customer's Google Account and a customer's account with the vendor. If this authentication flow is being used to re-authenticate a user that has already gone through an Association flow, this field identifies the specific account with the vendor that the user must authenticate. This allows to ensure that the user does not (e.g.) accidentally authenticate using some other account. If this field is provided, the Payment Integrator must ensure that that the account being authenticated is tied to this `associationId`, and otherwise must return a failure.",
          "type": "string"
        },
        "paymentIntegratorAccountId": {
          "description": "**OPTIONAL**: This is the payment integrator account identifier that identifies contractual constraints around this transaction.",
          "type": "string"
        }
      }
    },
    "AuthenticationResponse": {
      "description": "Object sent during authentication response. Here's an example of a clear text JSON response: { \"associationId\": \"88ydEE-ioiwe==\", \"requestId\": \"375dhjf9-Uydd=\" } The `AuthenticationResponse` is encrypted and signed using PGP or JWE+JWS. Further, this value is web-safe base64 encoded. This encoding is referred to below as `Base64UrlEncode`. In other words, the clear text JSON version of the `AuthenticationRequest` must be passed through the following functions: Base64UrlEncode( PGPSignAndEncrypt( { \"associationId\": \"88ydEE-ioiwe==\", \"requestId\": \"375dhjf9-Uydd=\" } ) ) or Base64UrlEncode( JWSignAndEncrypt( { \"associationId\": \"88ydEE-ioiwe==\", \"requestId\": \"375dhjf9-Uydd=\" } ) ) ",
      "type": "object",
      "properties": {
        "associationId": {
          "description": "**OPTIONAL**: Reflected back by the payment integrator to Google. This allows Google to check that the associationId passed back is the same associationId passed in. This is required if it is present on the request.",
          "type": "string"
        },
        "requestId": {
          "description": "**REQUIRED**: Reflected back by the payment integrator to Google. This allows Google to prevent replay attacks.",
          "type": "string"
        },
        "authenticationResult": {
          "description": "**OPTIONAL**: The result of the authentication. For flows where there is no subsequent call to the Payment Integrator after the authentication has taken place, the result must be included in the response to ensure the integrity of the result.",
          "$ref": "#/definitions/AuthenticationResponseAuthenticationResult"
        }
      }
    },
    "AuthenticationResponseAuthenticationResult": {
      "description": "The result of the authentication.",
      "type": "object",
      "properties": {
        "success": {
          "description": "Authentication was successful.",
          "$ref": "#/definitions/Empty"
        },
        "cancelled": {
          "description": "User canceled the flow manually and the flow should be aborted.",
          "$ref": "#/definitions/Empty"
        },
        "fatalError": {
          "description": "Authentication failed for a fatal reason and the flow should be aborted.",
          "$ref": "#/definitions/Empty"
        }
      }
    },
    "TopUpRedirectRequest": {
      "description": "Request object for the Top-Up Redirect flow. Here's an example of a clear text JSON request: { \"requestHeader\": { \"protocolVersion\": { \"major\": 1, \"minor\": 1, \"revision\": 0 }, \"requestId\": \"G112YZH4XPDV88J\", \"requestTimestamp\": \"1481907920000\" }, \"associationId\": \"LmddbXBsZSByZWZlcmVuY2UgdG9rZW4gdmFsdWU_\" } The `TopUpRedirectRequest` is encrypted and signed using PGP or JWE+JWS. Further, this value is web-safe `base64` encoded. This encoding is referred to below as `Base64UrlEncode`. In other words, the clear text JSON version of the `TopUpRedirectRequest` must be passed through the following functions: Base64UrlEncode( PGPSignAndEncrypt( { \"requestHeader\": { \"protocolVersion\": { \"major\": 1, \"minor\": 1, \"revision\": 0 }, \"requestId\": \"G112YZH4XPDV88J\", \"requestTimestamp\": \"1481907920000\" }, \"associationId\": \"LmddbXBsZSByZWZlcmVuY2UgdG9rZW4gdmFsdWU_\" } ) ) or Base64UrlEncode( JWSignAndEncrypt( { \"requestHeader\": { \"protocolVersion\": { \"major\": 1, \"minor\": 1, \"revision\": 0 }, \"requestId\": \"G112YZH4XPDV88J\", \"requestTimestamp\": \"1481907920000\" }, \"associationId\": \"LmddbXBsZSByZWZlcmVuY2UgdG9rZW4gdmFsdWU_\" } ) ) ",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests.",
          "$ref": "#/definitions/RequestHeader"
        },
        "associationId": {
          "description": "**REQUIRED**: The `associationId` that represents the user's account. This is public-facing ID for the user's account that was provided by Google during the `associateAccount` call.",
          "type": "string"
        },
        "targetBalance": {
          "description": "**OPTIONAL**: The target balance to reach, in micros.",
          "$ref": "#/definitions/Amount"
        }
      }
    }
  }
}
