{
  "swagger": "2.0",
  "info": {
    "title": "Google Standard Payments Payment Integrator Hosted Banking FOP API",
    "description": "This includes services hosted by Payment Integrators for Banking FOP.",
    "version": "v2"
  },
  "host": "www.integratorhost.example.com",
  "basePath": "/integrator-base-path",
  "schemes": ["https"],
  "paths": {
    "/v2/getPayeeProxyRegistrationStatus": {
      "post": {
        "tags": ["payment_integrator_banking_fop_api"],
        "operationId": "GetPayeeProxyRegistrationStatus",
        "description": "Checks whether or not a mapping to a Payee has been registered for the specified proxy key. An example request looks like: { \"requestHeader\": { \"protocolVersion\": { \"major\": 2 }, \"requestId\": \"bWVyY2hhbnQgdHJhbnNhY3Rpb24gaWQ\", \"requestTimestamp\": { \"epochMillis\": \"1502220196077\" }, \"paymentIntegratorAccountId\": \"InvisiCashUSA_USD\" }, \"proxyKey\": { \"phoneNumber\": \"+001234567890\" } } An example response looks like: { \"responseHeader\": { \"responseTimestamp\": { \"epochMillis\": \"1481900013178\" } }, \"registrationStatus\": \"REGISTERED\" } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/GetPayeeProxyRegistrationStatusRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/GetPayeeProxyRegistrationStatusResponse"
            }
          }
        }
      }
    },
    "/v2/getPayeeProxyDisplayInfo": {
      "post": {
        "tags": ["payment_integrator_banking_fop_api"],
        "operationId": "GetPayeeProxyDisplayInfo",
        "description": "Returns the display data that has been registered for the specified proxy key (e.g. display name to be shown before payment) An example request looks like: { \"requestHeader\": { \"protocolVersion\": { \"major\": 2 }, \"requestId\": \"bWVyY2hhbnQgdHJhbnNhY3Rpb24gaWQ\", \"requestTimestamp\": { \"epochMillis\": \"1502220196077\" }, \"paymentIntegratorAccountId\": \"InvisiCashUSA_USD\" }, \"proxyKey\": { \"phoneNumber\": \"+001234567890\" } } An example response looks like: { \"responseHeader\": { \"responseTimestamp\": { \"epochMillis\": \"1481900013178\" } }, \"displayInfoResult\": { \"success\": { \"displayInfo\": { \"displayName\": \"Sam Payee\" } } } } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/GetPayeeProxyDisplayInfoRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/GetPayeeProxyDisplayInfoResponse"
            }
          }
        }
      }
    },
    "/v2/transferFunds": {
      "post": {
        "tags": ["payment_integrator_banking_fop_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. All mutations on this transaction (refunds) populate the `requestId` value in the `captureRequestId` field. An example request looks like: { \"requestHeader\": { \"protocolVersion\": { \"major\": 2 }, \"requestId\": \"bWVyY2hhbnQgdHJhbnNhY3Rpb24gaWQ\", \"requestTimestamp\": { \"epochMillis\": \"1502220196077\" }, \"paymentIntegratorAccountId\": \"InvisiCashUSA_USD\" }, \"googlePaymentToken\": { \"issuerId\": { \"value\": \"InvisiCash\" }, \"token\": \"ZXhhbXBsZSB1bmlxdWUgcGF5bWVudCB0b2tlbiB2YWx1ZQ\" }, \"transactionDescription\": \"Google - Music\", \"amount\": { \"amountMicros\": \"728000000\", \"currencyCode\": \"INR\" }, \"destinationBankAccount\": { \"bankAccountId\": { \"usBankAccount\": { \"accountNumber\": { \"number\": \"1234-5678-91\" }, \"bankIdentifier\": { \"swiftBic\": { \"value\": \"XXXXSGS0XXX\" }, \"usAbaRoutingNumber\":{ \"value\": \"206764189\" } } } }, \"bankAccountOwner\": { \"name\": \"Sam User\" } } } An example response looks like: { \"responseHeader\": { \"responseTimestamp\": { \"epochMillis\": \"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"
            }
          }
        }
      }
    },
    "/v2/getTransferFundsTransactionStatus": {
      "post": {
        "tags": ["payment_integrator_banking_fop_api"],
        "operationId": "GetTransferFundsTransactionStatus",
        "description": "This method fetches the status of a TransferFunds transaction. An example request looks like: { \"requestHeader\": { \"protocolVersion\": { \"major\": 2 }, \"requestId\": \"bWVyY2hhbnQgdHJhbnNhY3Rpb24gaWQ\", \"requestTimestamp\": { \"epochMillis\": \"1502220196077\" }, \"paymentIntegratorAccountId\": \"InvisiCashUSA_USD\" }, \"transferFundsRequestId\":\"bnAxdWTydDX==\" } An example response looks like: { \"responseHeader\": { \"responseTimestamp\": { \"epochMillis\": \"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"
            }
          }
        }
      }
    },
    "/v2/disburse": {
      "post": {
        "tags": ["payment_integrator_banking_fop_api"],
        "operationId": "Disburse",
        "description": "This method performs a disburse from a Google-owned bank account to an account specified in the request. An example request looks like: { \"requestHeader\": { \"protocolVersion\": { \"major\": 2 }, \"requestId\": \"bWVyY2hhbnQgdHJhbnNhY3Rpb24gaWQ\", \"requestTimestamp\": { \"epochMillis\": \"1502220196077\" }, \"paymentIntegratorAccountId\": \"InvisiCashUSA_USD\" }, \"sourceGoogleBankAccount\": { \"bankAccountId\": { \"usBankAccount\": { \"accountNumber\": { \"number\": \"9876-5432-19\" }, \"bankIdentifier\": { \"swiftBic\": { \"value\": \"12ABDEFF478\" }, \"usAbaRoutingNumber\": { \"value\": \"874383657\" } } } } }, \"amount\": { \"amountMicros\": \"728000000\", \"currencyCode\": \"INR\" }, \"transactionDescription\": \"Google - Music\", \"destinationBankAccount\": { \"bankAccountId\": { \"usBankAccount\": { \"accountNumber\": { \"number\": \"1234-5678-91\" }, \"bankIdentifier\": { \"swiftBic\": { \"value\": \"XXXXSGS0XXX\" }, \"usAbaRoutingNumber\":{ \"value\": \"206764189\" } } } }, \"bankAccountOwner\": { \"name\": \"Sam User\" } } } An example response looks like: { \"responseHeader\": { \"responseTimestamp\": { \"epochMillis\": \"1481900013178\" } }, \"result\": { \"success\": {} }, \"paymentIntegratorTransactionId\": \"aW50ZWdyYXRvciB0cmFuc2FjdGlvbiBpZA\" } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/DisburseRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/DisburseResponse"
            }
          }
        }
      }
    },
    "/v2/getDisburseTransactionStatus": {
      "post": {
        "tags": ["payment_integrator_banking_fop_api"],
        "operationId": "GetDisburseTransactionStatus",
        "description": "This method fetches the status of a disburse transaction. An example request looks like: { \"requestHeader\": { \"protocolVersion\": { \"major\": 2 }, \"requestId\": \"bWVyY2hhbnQgdHJhbnNhY3Rpb24gaWQ\", \"requestTimestamp\": { \"epochMillis\": \"1502220196077\" }, \"paymentIntegratorAccountId\": \"InvisiCashUSA_USD\" }, \"disburseRequestId\": \"bnAxdWTydDX==\", \"paymentIntegratorAccountId\": \"InvisiCashUSA\" } An example response looks like: { \"responseHeader\": { \"responseTimestamp\": { \"epochMillis\": \"1481900013178\" } }, \"result\": { \"success\": {} }, \"disburseResult\": { \"success\": {} } } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/GetDisburseTransactionStatusRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/GetDisburseTransactionStatusResponse"
            }
          }
        }
      }
    },
    "/v2/echo": {
      "post": {
        "tags": ["payment_integrator_banking_fop_api"],
        "operationId": "Echo",
        "description": "Echos back a string sent from the client. If the endpoint encounters an error while processing the request, the response body from this endpoint should be of type `ErrorResponse`. An example request looks like: { \"requestHeader\": { \"protocolVersion\": { \"major\": 2 }, \"requestId\": \"G1MQ0YERJ0Q7LPM\", \"requestTimestamp\": { \"epochMillis\": \"1481899949606\" }, \"paymentIntegratorAccountId\": \"InvisiCashUSA_USD\" }, \"clientMessage\": \"Client echo message\" } An example success response looks like: { \"responseHeader\": { \"responseTimestamp\": { \"epochMillis\":\"1481899950236\" } }, \"clientMessage\": \"Client echo message\", \"serverMessage\": \"Debug ID 12345\" } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/EchoRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/EchoResponse"
            }
          }
        }
      }
    },
    "/v2/associateAccount": {
      "post": {
        "tags": ["payment_integrator_banking_fop_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 through 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. The GPT is used to initiate payments. The `requestId` within the header is the idempotency key and uniquely identifies this association attempt. If Google sends an `associationId` or a `googlePaymentToken` that the integrator has already seen during a different association attempt (different idempotency key), the expectation is this would throw an HTTP 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\": 2 }, \"requestId\": \"cmVxdWVzdDE\", \"requestTimestamp\": { \"epochMillis\": \"1481899949606\" }, \"paymentIntegratorAccountId\": \"InvisiCashUSA_USD\" }, \"googlePaymentToken\": { \"issuerId\": { \"value\": \"InvisiCashUSA\" }, \"token\": \"ZXhhbXBsZSB1bmlxdWUgcGF5bWVudCB0b2tlbiB2YWx1ZQ\" }, \"authenticationRequestId\": \"bnAxdWTydDX==\", \"associationId\": \"LmddbXBsZSByZWZlcmVuY2UgdG9rZW4gdmFsdWU_\", \"provideUserInformation\": true } An example response looks like: { \"responseHeader\": { \"responseTimestamp\": { \"epochMillis\": \"1481899949611\" } }, \"result\": { \"success\": { \"transactionLimits\": { \"transactionMaxLimit\": { \"limitAmount\": { \"amountMicros\": \"100000000\", \"currencyCode\": \"JPY\" } } }, \"associatedAccountIdentifier\": { \"accountId\": \"1234-5678-91\" }, \"associatedAccountDetails\": { \"accountNickname\" : { \"partialAccountNickname\": \"***-91\" }, \"accountAlias\": { \"phoneNumber\": { \"value\": \"+15555555555\" } } }, \"userInformation\": { \"name\": \"Example Customer\", \"addressLine\": [\"123 Main St\"], \"localityName\": \"Springfield\", \"administrativeAreaName\": \"CO\", \"postalCodeNumber\": \"80309\", \"countryCode\": \"US\" } } } } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/AssociateAccountRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/AssociateAccountResponse"
            }
          }
        }
      }
    },
    "/v2/associateAccountWithVendorGeneratedToken": {
      "post": {
        "tags": ["payment_integrator_banking_fop_api"],
        "operationId": "AssociateAccountWithVendorGeneratedToken",
        "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 through a server-to-server call that contains the `requestId` for the associated authentication flow (`authenticationRequestId`) and an `associationId`.The payment processor should associate the `associationId` to the customer's account. The `associationId` is used during re-authentication calls to identify the account for authentication. If Google sends an `associationId` that the integrator has already seen during a different association, then it throws an error. In the response, the payment processor generates a 'vendorPaymentToken' which is bound to the customer's account and is used for authorizing subsequent payments. 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\": 2 }, \"requestId\": \"bWVyY2hhbnQgdHJhbnNhY3Rpb24gaWQ\", \"requestTimestamp\": { \"epochMillis\": \"1502220196077\" }, \"paymentIntegratorAccountId\": \"InvisiCashUSD\" }, \"authenticationRequestId\": \"bnAxdWTydDX==\", \"associationId\": \"LmddbXBsZSByZWZlcmVuY2UgdG9rZW4gdmFsdWU_\", \"provideUserInformation\": true } An example response looks like: { \"responseHeader\": { \"responseTimestamp\": { \"epochMillis\": \"1481900013178\" } }, \"result\": { \"success\": { \"vendorPaymentToken\": \"ZXhhbXBsZSB1bmlxdWUgcGF5bWVudCB0b2tlbiB2YWx1ZQ\", \"tokenExpirationTime\": { \"epochMillis\": \"1481919332394\" }, \"bankAccountIdentifier\": { \"singaporeBankAccount\": { \"sgFastBankAccount\": { \"localAccountNumber\": \"113A\", \"swiftBic\": { \"value\": \"COBADEFF478\" } }, \"localBankIdentifier\":{ \"localBankCode\": \"7171\", \"localBranchCode\": \"060\" } } }, \"bankAccountDetails\" : { \"accountNumberSuffix\": \"1234\", \"bankAccountType\": { \"type\": \"SAVINGS\" }, \"bankAccountMetadata\": { } }, \"transactionLimits\": { \"transactionMaxLimit\": { \"noLimit\": {} } }, \"userInformation\": { \"name\": \"Example Customer\", \"addressLine\": [\"70 Pasir Panjang Rd\"], \"localityName\": \"#03-71\", \"postalCodeNumber\": \"117371\", \"countryCode\": \"SG\" } } } } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/AssociateAccountWithVendorGeneratedTokenRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/AssociateAccountWithVendorGeneratedTokenResponse"
            }
          }
        }
      }
    },
    "/v2/disassociateAccount": {
      "post": {
        "tags": ["payment_integrator_banking_fop_api"],
        "operationId": "DisassociateAccount",
        "description": "Deletes the association between the customer's account with the payment processor and the Google instrument. This disassociation should be processed idempotently, so if the same requestId is used as a previously processed request, the previous result should be idempotently returned. Otherwise if Google sends a `googlePaymentToken` that has already been disassociated, an error should be returned. 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\": 2 }, \"requestId\": \"bWVyY2hhbnQgdHJhbnNhY3Rpb24gaWQ\", \"requestTimestamp\": { \"epochMillis\": \"0\" }, \"paymentIntegratorAccountId\": \"InvisiCashUSD\" }, \"googlePaymentToken\": { \"issuerId\": { \"value\": \"InvisiCashUSA\" }, \"token\": \"ZXhhbXBsZSB1bmlxdWUgcGF5bWVudCB0b2tlbiB2YWx1ZQ\" } } An example response looks like: { \"responseHeader\": { \"responseTimestamp\": { \"epochMillis\": \"1481900013178\" } }, \"result\": {\"success\": {}} } ",
        "parameters": [
          {
            "name": "body",
            "description": "The request body.",
            "in": "body",
            "schema": {
              "$ref": "#/definitions/DisassociateAccountRequest"
            }
          }
        ],
        "responses": {
          "default": {
            "description": "Successful operation",
            "schema": {
              "$ref": "#/definitions/DisassociateAccountResponse"
            }
          }
        }
      }
    }
  },
  "definitions": {
    "GetPayeeProxyRegistrationStatusRequest": {
      "description": "Request object for the GetPayeeProxyRegistrationStatus method.",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests.",
          "$ref": "#/definitions/RequestHeader"
        },
        "proxyKey": {
          "description": "**REQUIRED**: The proxy key for which the registration status is being queried.",
          "$ref": "#/definitions/PayeeProxyKey"
        }
      }
    },
    "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. The receiver must verify that this timestamp is \u00B1 60s of 'now', and reject the request if it is not. This request timestamp is not idempotent upon retries.",
          "$ref": "#/definitions/V2Timestamp"
        },
        "protocolVersion": {
          "description": "**REQUIRED**: The version of this request.",
          "$ref": "#/definitions/Version"
        },
        "paymentIntegratorAccountId": {
          "description": "**REQUIRED**: Identifies a unique account with contractual constraints.",
          "type": "string"
        }
      }
    },
    "V2Timestamp": {
      "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"
        }
      }
    },
    "Version": {
      "description": "Version object contains the major version of the API. Versions of the same major version are guaranteed to be compatible. The integrator must support all requests for the same major version.",
      "type": "object",
      "properties": {
        "major": {
          "description": "**REQUIRED**: Major version. This is marked for compatibility requests with different versions are not guaranteed to be compatible.",
          "type": "integer",
          "format": "int32"
        }
      }
    },
    "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"
        }
      }
    },
    "GetPayeeProxyRegistrationStatusResponse": {
      "description": "Response object for the GetPayeeProxyRegistrationStatus method",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/ResponseHeader"
        },
        "registrationStatus": {
          "description": "**REQUIRED**: Registration status of the Proxy Key.",
          "type": "string",
          "enum": [
            "PAYEE_PROXY_REGISTRATION_STATUS_UNSPECIFIED",
            "REGISTERED",
            "NOT_REGISTERED"
          ]
        }
      }
    },
    "ResponseHeader": {
      "description": "Header object that is defined on all responses sent from the server.",
      "type": "object",
      "properties": {
        "responseTimestamp": {
          "description": "**REQUIRED**: Timestamp of this response. The receiver must verify that this timestamp is \u00B1 60s of 'now', and reject the response if it is not.",
          "$ref": "#/definitions/V2Timestamp"
        }
      }
    },
    "ErrorResponse": {
      "description": "Error Response object for all methods.",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/ResponseHeader"
        },
        "errorDescription": {
          "description": "**OPTIONAL**: Provide a description of this status for support reps to debug errors. Note that this is never shown to users. It can contain descriptive, non-sensitive text used for debugging. Note that some values for errorResponseCode should be accompanied by additional detail in this field. Warning: Do not include any tokens in this message unless they are defined as public.",
          "type": "string"
        },
        "paymentIntegratorErrorIdentifier": {
          "description": "**OPTIONAL**: This identifier is specific to the integrator and is generated by the integrator. It is used for debugging purposes only in order to identify this call. This is the identifier that the integrator knows this call by.",
          "type": "string"
        },
        "errorResponseResult": {
          "description": "**OPTIONAL**: A code that captures the type of error that occurred.",
          "$ref": "#/definitions/ErrorResponseErrorResponseResult"
        }
      }
    },
    "ErrorResponseErrorResponseResult": {
      "description": "Error Codes",
      "type": "object",
      "properties": {
        "invalidApiVersion": {
          "description": "Used if the request's API version is unsupported. Advised HTTP Code: 400",
          "$ref": "#/definitions/ErrorResponseInvalidApiVersion"
        },
        "invalidPayloadSignature": {
          "description": "Used if the signature of the payload is to an unknown or inactive key. Advised HTTP Code: 401",
          "$ref": "#/definitions/ErrorResponseInvalidPayloadSignature"
        },
        "invalidPayloadEncryption": {
          "description": "Used if the encryption of the payload is to an unknown or inactive key. Advised HTTP Code: 400",
          "$ref": "#/definitions/ErrorResponseInvalidPayloadEncryption"
        },
        "requestTimestampOutOfRange": {
          "description": "Used if the request_timestamp is not \u00B1 60s of now. Advised HTTP Code: 400",
          "$ref": "#/definitions/ErrorResponseRequestTimestampOutOfRange"
        },
        "invalidIdentifier": {
          "description": "Used if an identifier sent in the request was invalid or unknown. This may include PIAID, captureRequestId, Google Payment Token, etc. Advised HTTP Code: 404",
          "$ref": "#/definitions/ErrorResponseInvalidIdentifier"
        },
        "idempotencyViolation": {
          "description": "Used if the request violates the idempotency requirements for the request. Advised HTTP Code: 412",
          "$ref": "#/definitions/ErrorResponseIdempotencyViolation"
        },
        "invalidFieldValue": {
          "description": "Used if the request contains a value for a field that isn't in the set of supported values. Advised HTTP Code: 400",
          "$ref": "#/definitions/ErrorResponseInvalidFieldValue"
        },
        "missingRequiredField": {
          "description": "Used if a field that is required is unset in the request. Advised HTTP Code: 400",
          "$ref": "#/definitions/ErrorResponseMissingRequiredField"
        },
        "preconditionViolation": {
          "description": "Used if a constraint on the operation is violated (e.g. when a request for a refund amount exceeds the amount remaining on the transaction). Advised HTTP Code: 400",
          "$ref": "#/definitions/ErrorResponsePreconditionViolation"
        },
        "userActionInProgress": {
          "description": "Used if the request cannot be processed at this time because it would interrupt an in-process user action which effectively acts as a system lock. This code must *not* be used to indicate failures due to implementation-specific internal concurrency errors. Advised HTTP Code: 423",
          "$ref": "#/definitions/ErrorResponseUserActionInProgress"
        },
        "invalidDecryptedRequest": {
          "description": "Used if the request payload could be decrypted, but the resulting message could not be parsed. Advised HTTP Code: 400",
          "$ref": "#/definitions/ErrorResponseInvalidDecryptedRequest"
        },
        "forbidden": {
          "description": "Access to the requested resource is forbidden. Advised Http Code: 403",
          "$ref": "#/definitions/ErrorResponseForbidden"
        }
      }
    },
    "ErrorResponseInvalidApiVersion": {
      "description": "Used if the request's API version is unsupported.",
      "type": "object",
      "properties": {
        "requestVersion": {
          "description": "**REQUIRED**: The invalid version that was specified on the request.",
          "$ref": "#/definitions/Version"
        },
        "expectedVersion": {
          "description": "**REQUIRED**: The expected version.",
          "$ref": "#/definitions/Version"
        }
      }
    },
    "ErrorResponseInvalidPayloadSignature": {
      "description": "This message is intentionally empty right now. New fields could be added in the future.",
      "type": "object",
      "properties": {
      }
    },
    "ErrorResponseInvalidPayloadEncryption": {
      "description": "This message is intentionally empty right now. New fields could be added in the future.",
      "type": "object",
      "properties": {
      }
    },
    "ErrorResponseRequestTimestampOutOfRange": {
      "description": "Used if the request_timestamp is not \u00B1 60s of now.",
      "type": "object",
      "properties": {
        "requestTimestamp": {
          "description": "**REQUIRED**: The timestamp provided in the request",
          "$ref": "#/definitions/V2Timestamp"
        },
        "serverTimestampAtReceipt": {
          "description": "**REQUIRED**: The server time at receipt, used for comparison",
          "$ref": "#/definitions/V2Timestamp"
        }
      }
    },
    "ErrorResponseInvalidIdentifier": {
      "description": "Used if an identifier sent in the request was invalid or unknown. This may include PIAID, captureRequestId, Google Payment Token, etc.",
      "type": "object",
      "properties": {
        "invalidIdentifierType": {
          "description": "**REQUIRED**: The type of identifier that was invalid, e.g. PIAID, captureRequestId, etc.",
          "type": "string"
        }
      }
    },
    "ErrorResponseIdempotencyViolation": {
      "description": "This message is intentionally empty right now. New fields could be added in the future.",
      "type": "object",
      "properties": {
      }
    },
    "ErrorResponseInvalidFieldValue": {
      "description": "Used if the request contains a value for a field that isn't in the set of supported values.",
      "type": "object",
      "properties": {
        "invalidFieldName": {
          "description": "**REQUIRED**: The name of the field that was found to be invalid.",
          "type": "string"
        }
      }
    },
    "ErrorResponseMissingRequiredField": {
      "description": "Used if a field that is required is unset in the request.",
      "type": "object",
      "properties": {
        "missingFieldNames": {
          "description": "**REQUIRED**: The names of the missing fields.",
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      }
    },
    "ErrorResponsePreconditionViolation": {
      "description": "This message is intentionally empty right now. New fields could be added in the future.",
      "type": "object",
      "properties": {
      }
    },
    "ErrorResponseUserActionInProgress": {
      "description": "This message is intentionally empty right now. New fields could be added in the future.",
      "type": "object",
      "properties": {
      }
    },
    "ErrorResponseInvalidDecryptedRequest": {
      "description": "This message is intentionally empty right now. New fields could be added in the future.",
      "type": "object",
      "properties": {
      }
    },
    "ErrorResponseForbidden": {
      "description": "This message is intentionally empty right now. New fields could be added in the future.",
      "type": "object",
      "properties": {
      }
    },
    "GetPayeeProxyDisplayInfoRequest": {
      "description": "Request object for the GetPayeeProxyDisplayInfo method.",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests.",
          "$ref": "#/definitions/RequestHeader"
        },
        "proxyKey": {
          "description": "**REQUIRED**: The proxy key for which the display information is being requested.",
          "$ref": "#/definitions/PayeeProxyKey"
        },
        "associationId": {
          "description": "**OPTIONAL**: The ID that represents the association between a customer's Google Account and a customer's account with the vendor. Only present if the request is initiated by a user in-session.",
          "type": "string"
        }
      }
    },
    "GetPayeeProxyDisplayInfoResponse": {
      "description": "Response object for the GetPayeeProxyDisplayInfo method",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/ResponseHeader"
        },
        "displayInfoResult": {
          "description": "**REQUIRED**: Success\/failure result of GetPayeeProxyDisplayInfoResponse.",
          "$ref": "#/definitions/GetPayeeProxyDisplayInfoResponseGetPayeeProxyDisplayInfoResult"
        }
      }
    },
    "GetPayeeProxyDisplayInfoResponseGetPayeeProxyDisplayInfoResult": {
      "description": "The result codes for the GetPayeeProxyDisplayInfo call.",
      "type": "object",
      "properties": {
        "success": {
          "description": "The display info was found for the PayeeProxyKey.",
          "$ref": "#/definitions/PayeeProxyDisplayInfoSuccess"
        },
        "failure": {
          "description": "The display info lookup failed.",
          "$ref": "#/definitions/PayeeProxyDisplayInfoFailure"
        }
      }
    },
    "PayeeProxyDisplayInfoSuccess": {
      "description": "Message that contains the details of a successful display information query.",
      "type": "object",
      "properties": {
        "displayInfo": {
          "description": "**REQUIRED**: Display information for the Proxy Key.",
          "$ref": "#/definitions/PayeeProxyDisplayInfo"
        }
      }
    },
    "PayeeProxyDisplayInfo": {
      "description": "Data that is meant for display and has been registered for a given PayeeProxyKey.",
      "type": "object",
      "properties": {
        "displayName": {
          "description": "Name that has been registered for display with the PayeeProxy.",
          "type": "string"
        }
      }
    },
    "PayeeProxyDisplayInfoFailure": {
      "description": "Message that contains the details of a failed display information query.",
      "type": "object",
      "properties": {
        "failureReason": {
          "description": "**REQUIRED**: The reason for the failure.",
          "type": "string",
          "enum": [
            "PAYEE_PROXY_DISPLAY_INFO_FAILURE_REASON_UNSPECIFIED",
            "PROXY_KEY_NOT_REGISTERED"
          ]
        }
      }
    },
    "TransferFundsRequest": {
      "description": "Request object for the TransferFunds method.",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests.",
          "$ref": "#/definitions/RequestHeader"
        },
        "googlePaymentToken": {
          "description": "The Google Payment Token identifying the payer bank account.",
          "$ref": "#/definitions/V1GooglePaymentToken"
        },
        "vendorPaymentToken": {
          "description": "The vendor payment token identifying the payer bank account.",
          "$ref": "#/definitions/VendorPaymentToken"
        },
        "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/V1Amount"
        },
        "googleBankAccount": {
          "description": "A bank account that is owned by Google (as opposed to a user).",
          "$ref": "#/definitions/GoogleBankAccount"
        },
        "destinationBankAccount": {
          "description": "Destination account that is not held by Google.",
          "$ref": "#/definitions/DestinationBankAccount"
        },
        "payeeProxy": {
          "description": "Payee that is referenced by a PayeeProxyKey",
          "$ref": "#/definitions/PayeeProxyDestination"
        },
        "googlePaymentTokenPayee": {
          "description": "The Google Payment Token identifying the payee bank account.",
          "$ref": "#/definitions/V1GooglePaymentToken"
        },
        "vendorPaymentTokenPayee": {
          "description": "The vendor payment token identifying the payee bank account.",
          "$ref": "#/definitions/VendorPaymentToken"
        }
      }
    },
    "V1GooglePaymentToken": {
      "description": "Describes a GooglePaymentToken (GPT), including the token and the issuer of the backing user account.",
      "type": "object",
      "properties": {
        "issuerId": {
          "description": "**REQUIRED**: The identifier of the issuer of the backing user account.",
          "$ref": "#/definitions/V1IssuerId"
        },
        "token": {
          "description": "**REQUIRED**: This is the token that both companies will use to identify the account for purchases between each other.",
          "type": "string"
        }
      }
    },
    "V1IssuerId": {
      "description": "A unique identifier for an issuer of user accounts.",
      "type": "object",
      "properties": {
        "value": {
          "description": "**REQUIRED**: The string value of the identifier. This unique identifier is defined by Google. Google will share a list with the identifiers for all external issuers available through the payment integrator.",
          "type": "string"
        }
      }
    },
    "VendorPaymentToken": {
      "description": "Describes a VendorPaymentToken (VPT), including the token and the issuer of the backing user account.",
      "type": "object",
      "properties": {
        "issuerId": {
          "description": "**REQUIRED**: The identifier of the issuer of the backing user account.",
          "$ref": "#/definitions/V1IssuerId"
        },
        "token": {
          "description": "**REQUIRED**: This is the token that both companies will use to identify the account for purchases between each other.",
          "type": "string"
        }
      }
    },
    "V1Amount": {
      "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"
        }
      }
    },
    "GoogleBankAccount": {
      "description": "This object represents a bank account that is owned by Google and may receive funds as part of a transfer.",
      "type": "object",
      "properties": {
        "bankAccountId": {
          "description": "**REQUIRED**: The ID of a specific Google-owned bank account.",
          "$ref": "#/definitions/BankAccountIdentifier"
        }
      }
    },
    "BankAccountIdentifier": {
      "description": "Unique identifier of a bank account.",
      "type": "object",
      "properties": {
        "singaporeBankAccount": {
          "description": "An account with a bank in Singapore.",
          "$ref": "#/definitions/SgBankAccount"
        },
        "usBankAccount": {
          "description": "An account with a bank in the United States.",
          "$ref": "#/definitions/UsBankAccount"
        },
        "japanBankAccount": {
          "description": "An account with a bank in Japan.",
          "$ref": "#/definitions/JapanBankAccount"
        }
      }
    },
    "SgBankAccount": {
      "description": "Details of a user's bank account in SG.",
      "type": "object",
      "properties": {
        "sgFastBankAccount": {
          "description": "**REQUIRED**: FAST-related bank account details.",
          "$ref": "#/definitions/SgFastBankAccount"
        },
        "localBankIdentifier": {
          "description": "**REQUIRED**: Bank Id with local identifiers.",
          "$ref": "#/definitions/SgLocalBankIdentifier"
        }
      }
    },
    "SgFastBankAccount": {
      "description": "Details of a customer's bank account in SG that are relevant for operations that involve the FAST payment network.",
      "type": "object",
      "properties": {
        "localAccountNumber": {
          "description": "**REQUIRED**: The local account number for this account.",
          "type": "string"
        },
        "swiftBic": {
          "description": "**REQUIRED**: SWIFT Business Identifier Code as defined in ISO 9362.",
          "$ref": "#/definitions/SwiftBusinessIdentifierCode"
        }
      }
    },
    "SwiftBusinessIdentifierCode": {
      "description": "SWIFT Business Identifier Code as defined in ISO 9362.",
      "type": "object",
      "properties": {
        "value": {
          "description": "**REQUIRED**: An 8-character code, defined as 'business party identifier', consisting of the business party prefix (4 alphanumeric), the country code as defnied in ISO 3166-1 (2 alphabetic), and the business party suffix (2 alphanumeric). The branch identifier is a 3-character optional element that can supplement the 8-character BIC, used to identify specific location, departments, services or units of the same business party.",
          "type": "string"
        }
      }
    },
    "SgLocalBankIdentifier": {
      "description": "Local Ids for a bank in Singapore.",
      "type": "object",
      "properties": {
        "localBankCode": {
          "description": "**REQUIRED**: Bank code of the customer bank.",
          "type": "string"
        },
        "localBranchCode": {
          "description": "**REQUIRED**: Code of the branch where the customer account is located.",
          "type": "string"
        }
      }
    },
    "UsBankAccount": {
      "description": "Details of a user's bank account in the US.",
      "type": "object",
      "properties": {
        "accountNumber": {
          "description": "**REQUIRED**: Account number for the bank account.",
          "$ref": "#/definitions/DomesticBankAccountNumber"
        },
        "bankIdentifier": {
          "description": "**REQUIRED**: Globally identifies the bank where this account is held.",
          "$ref": "#/definitions/UsBankIdentifier"
        }
      }
    },
    "DomesticBankAccountNumber": {
      "description": "Local representation of a bank account number for domestic transfers.",
      "type": "object",
      "properties": {
        "number": {
          "description": "**REQUIRED**: The local bank account number.",
          "type": "string"
        }
      }
    },
    "UsBankIdentifier": {
      "description": "Identifiers for a Bank in the United States.",
      "type": "object",
      "properties": {
        "swiftBic": {
          "description": "**OPTIONAL**: SWIFT Business Identifier Code as defined in ISO 9362.",
          "$ref": "#/definitions/SwiftBusinessIdentifierCode"
        },
        "usAbaRoutingNumber": {
          "description": "**REQUIRED**: US ABA routing number (ABA RTN).",
          "$ref": "#/definitions/AbaRoutingTransitNumber"
        }
      }
    },
    "AbaRoutingTransitNumber": {
      "description": "An American Bankers Association (ABA) routing transit number (ABA RTN).",
      "type": "object",
      "properties": {
        "value": {
          "description": "**REQUIRED**: ABA routing transit number.",
          "type": "string"
        }
      }
    },
    "JapanBankAccount": {
      "description": "Details of a user's bank account in Japan.",
      "type": "object",
      "properties": {
        "localAccountNumber": {
          "description": "**REQUIRED**: Local account number for the bank account.",
          "type": "string"
        },
        "localBankIdentifier": {
          "description": "**REQUIRED**: Bank ID with local identifiers.",
          "$ref": "#/definitions/JapanLocalBankIdentifier"
        }
      }
    },
    "JapanLocalBankIdentifier": {
      "description": "Local IDs for a bank in Japan.",
      "type": "object",
      "properties": {
        "localBankCode": {
          "description": "**REQUIRED**: Bank code of the customer bank.",
          "type": "string"
        },
        "localBranchCode": {
          "description": "**REQUIRED**: Code of the branch where the customer account is located.",
          "type": "string"
        }
      }
    },
    "DestinationBankAccount": {
      "description": "This object represents a bank account that is not owned by Google.",
      "type": "object",
      "properties": {
        "bankAccountId": {
          "description": "**REQUIRED**: The ID of the non-Google-owned bank account.",
          "$ref": "#/definitions/BankAccountIdentifier"
        },
        "bankAccountOwner": {
          "description": "**REQUIRED**: Information about the owner of the destination bank account.",
          "$ref": "#/definitions/BankAccountOwner"
        }
      }
    },
    "BankAccountOwner": {
      "description": "This object holds information about the owner of the account that is the destination of a funds transfer.",
      "type": "object",
      "properties": {
        "name": {
          "description": "**OPTIONAL**: Name of the account holder (if present).",
          "type": "string"
        }
      }
    },
    "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"
        }
      }
    },
    "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/V2Empty"
        },
        "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"
        },
        "payeeProxyUnreachable": {
          "description": "The payee proxy is registered, but the underlying account is invalid, cannot be processed, or rejected the transfer.",
          "$ref": "#/definitions/PayeeProxyUnreachable"
        }
      }
    },
    "V2Empty": {
      "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": {
      }
    },
    "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/V2Amount"
        }
      }
    },
    "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"
        }
      }
    },
    "V2Amount": {
      "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"
        }
      }
    },
    "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/V2Amount"
        }
      }
    },
    "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/V2Amount"
        }
      }
    },
    "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"
        }
      }
    },
    "PayeeProxyUnreachable": {
      "description": "The payee proxy is registered, but the underlying account is invalid, cannot be processed, or rejected the transfer.",
      "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/V2Empty"
        }
      }
    },
    "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"
        }
      }
    },
    "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/V2Empty"
        },
        "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/V2Empty"
        }
      }
    },
    "DisburseRequest": {
      "description": "Request object for the Disburse method.",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests.",
          "$ref": "#/definitions/RequestHeader"
        },
        "sourceGoogleBankAccount": {
          "description": "**REQUIRED**: The Google-owned bank account that will be used to fund this disburse.",
          "$ref": "#/definitions/GoogleBankAccount"
        },
        "destinationBankAccount": {
          "description": "The non-Google account that is the destination for this disburse.",
          "$ref": "#/definitions/DestinationBankAccount"
        },
        "payeeProxyKey": {
          "description": "Proxy Key that will be used for the Payee.",
          "$ref": "#/definitions/PayeeProxyKey"
        },
        "amount": {
          "description": "**REQUIRED**: The amount of the transfer",
          "$ref": "#/definitions/V1Amount"
        },
        "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"
        }
      }
    },
    "DisburseResponse": {
      "description": "Response object for the disburse 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 Disburse operation.",
          "$ref": "#/definitions/DisburseResult"
        },
        "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"
        }
      }
    },
    "DisburseResult": {
      "description": "Result for disburse.",
      "type": "object",
      "properties": {
        "success": {
          "description": "Successful transfer.",
          "$ref": "#/definitions/V2Empty"
        },
        "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"
        },
        "payeeProxyNotRegistered": {
          "description": "The payee proxy is not registered.",
          "$ref": "#/definitions/PayeeProxyNotRegistered"
        }
      }
    },
    "GetDisburseTransactionStatusRequest": {
      "description": "Request object for GetDisburseTransactionStatus.",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests.",
          "$ref": "#/definitions/RequestHeader"
        },
        "disburseRequestId": {
          "description": "**REQUIRED**: The request_id of the original disburse transaction.",
          "type": "string"
        },
        "paymentIntegratorAccountId": {
          "description": "**REQUIRED**: The payment integrator account identifier that identifies the caller and associated contractual constraints for this interaction.",
          "type": "string"
        }
      }
    },
    "GetDisburseTransactionStatusResponse": {
      "description": "Response object for GetDisburseTransactionStatus.",
      "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"
        },
        "disburseResult": {
          "description": "The result of the disburse transaction whose status is looked up.",
          "$ref": "#/definitions/DisburseResult"
        },
        "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/V2Empty"
        },
        "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"
        }
      }
    },
    "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"
        }
      }
    },
    "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"
        }
      }
    },
    "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": "`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"
        },
        "provideUserInformation": {
          "description": "**REQUIRED**: True if we want 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.",
          "$ref": "#/definitions/V2GooglePaymentToken"
        },
        "associationId": {
          "description": "**REQUIRED**: The identifier of this association, created by Google. This is a string that has a maximum length of 100 characters.",
          "type": "string"
        }
      }
    },
    "V2GooglePaymentToken": {
      "description": "Describes a GooglePaymentToken (GPT), including the token and the issuer of the backing user account.",
      "type": "object",
      "properties": {
        "issuerId": {
          "description": "**REQUIRED**: The identifier of the issuer of the backing user account.",
          "$ref": "#/definitions/V2IssuerId"
        },
        "token": {
          "description": "**REQUIRED**: This is the token that both companies will use to identify the account for purchases between each other.",
          "type": "string"
        }
      }
    },
    "V2IssuerId": {
      "description": "A unique identifier for an issuer of user accounts.",
      "type": "object",
      "properties": {
        "value": {
          "description": "**REQUIRED**: The string value of the identifier. This unique identifier is defined by Google. Google will share a list with the identifiers for all external issuers available through the payment integrator.",
          "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"
        },
        "result": {
          "description": "**REQUIRED**: Result of this association.",
          "$ref": "#/definitions/AssociateAccountResponseAssociateAccountResult"
        }
      }
    },
    "AssociateAccountResponseAssociateAccountResult": {
      "description": "The result of the account association.",
      "type": "object",
      "properties": {
        "success": {
          "description": "The account association was successful.",
          "$ref": "#/definitions/AssociateAccountResponseAssociateAccountResultSuccessDetails"
        },
        "userAuthenticationFailed": {
          "description": "Even though the account authentication bundle was returned, the user authentication failed.",
          "$ref": "#/definitions/V2Empty"
        },
        "notEligible": {
          "description": "User's account is not eligible for this service.",
          "$ref": "#/definitions/V2Empty"
        },
        "otpNotMatched": {
          "description": "OTP did not match what the integrator sent.",
          "$ref": "#/definitions/V2Empty"
        },
        "otpAlreadyUsed": {
          "description": "OTP was already used.",
          "$ref": "#/definitions/V2Empty"
        },
        "otpLimitReached": {
          "description": "User has requested or tried to verify too many OTPs.",
          "$ref": "#/definitions/V2Empty"
        }
      }
    },
    "AssociateAccountResponseAssociateAccountResultSuccessDetails": {
      "description": "Details about a successful account association.",
      "type": "object",
      "properties": {
        "associatedAccountIdentifier": {
          "description": "The account ID the user has with the integrator.",
          "$ref": "#/definitions/AssociatedAccountIdentifier"
        },
        "bankAccountIdentifier": {
          "description": "The account ID the user has with a bank.",
          "$ref": "#/definitions/BankAccountIdentifier"
        },
        "associatedAccountDetails": {
          "description": "Details about the account that was associated.",
          "$ref": "#/definitions/AssociatedAccountDetails"
        },
        "bankAccountDetails": {
          "description": "Details about the bank account that was associated.",
          "$ref": "#/definitions/MaskedBankAccountDetails"
        },
        "transactionLimits": {
          "description": "**REQUIRED**: Defines user scoped transaction limits.",
          "$ref": "#/definitions/TransactionLimits"
        },
        "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/V2UserInformation"
        }
      }
    },
    "AssociatedAccountIdentifier": {
      "description": "The account ID the user has with the integrator.",
      "type": "object",
      "properties": {
        "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 value must be immutable for the life of the account.",
          "type": "string"
        }
      }
    },
    "AssociatedAccountDetails": {
      "description": "Details about the account that was associated.",
      "type": "object",
      "properties": {
        "accountNickname": {
          "description": "**REQUIRED**: Nickname by which the user knows this account for display purposes.",
          "$ref": "#/definitions/AssociatedAccountNickname"
        },
        "accountAlias": {
          "description": "**OPTIONAL**: An additional account alias the user might use to identify their vendor account. These are used by Google customer operation agents to help customers diagnose issues. These aliases should be user recognizable (for example the user knows this alias because it appears on their statement or appears on the website after they log into the account).",
          "$ref": "#/definitions/AccountAlias"
        }
      }
    },
    "AssociatedAccountNickname": {
      "description": "The nickname of the associated account.",
      "type": "object",
      "properties": {
        "partialAccountNickname": {
          "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"
        }
      }
    },
    "AccountAlias": {
      "description": "Defines the type and value of an alias that a user associates with their vendor account.",
      "type": "object",
      "properties": {
        "phoneNumber": {
          "description": "The phone number the user has on file with the integrator.",
          "$ref": "#/definitions/PhoneNumber"
        },
        "emailAddress": {
          "description": "The email address the user has on file with the integrator.",
          "type": "string"
        }
      }
    },
    "PhoneNumber": {
      "description": "An E.164 formatted phone number. Examples include +14035551111 and +918067218000. This will always lead with a + and include only numbers afterwards (no dashes).",
      "type": "object",
      "properties": {
        "value": {
          "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"
        }
      }
    },
    "MaskedBankAccountDetails": {
      "description": "Masked account details of a bank account.",
      "type": "object",
      "properties": {
        "accountNumberSuffix": {
          "description": "**REQUIRED**: Suffix of the account number.",
          "type": "string"
        },
        "bankAccountType": {
          "description": "**OPTIONAL**: Account type of the bank account.",
          "$ref": "#/definitions/BankAccountType"
        },
        "bankAccountMetadata": {
          "description": "**OPTIONAL**: Metadata about this account.",
          "$ref": "#/definitions/BankAccountMetadata"
        }
      }
    },
    "BankAccountType": {
      "description": "Account type of a bank account.",
      "type": "object",
      "properties": {
        "type": {
          "description": "**REQUIRED**: The account type of a bank account.",
          "type": "string",
          "enum": [
            "TYPE_UNSPECIFIED",
            "SAVINGS",
            "CHECKING",
            "CURRENT"
          ]
        }
      }
    },
    "BankAccountMetadata": {
      "description": "Metadata about the bank account.",
      "type": "object",
      "properties": {
        "bankingProductName": {
          "description": "**OPTIONAL**: The banking product name of this account.",
          "type": "string"
        }
      }
    },
    "TransactionLimits": {
      "description": "Defines transaction limits for the enclosing entity.",
      "type": "object",
      "properties": {
        "transactionMaxLimit": {
          "description": "**REQUIRED**: Defines the value and currency of a maximum per transaction limit for the enclosing type, or states that no maximum per transaction limit exists.",
          "$ref": "#/definitions/TransactionLimit"
        }
      }
    },
    "TransactionLimit": {
      "description": "Defines a transaction limit amount or the absence of a limit.",
      "type": "object",
      "properties": {
        "limitAmount": {
          "description": "The value of the allowable transaction. This is used to determine whether or not the user should be given this integrator as an option to process a specific transaction. *Note:* that either this value or the `noLimit` can be present, never both.",
          "$ref": "#/definitions/V2Amount"
        },
        "noLimit": {
          "description": "Indicates that there is no transaction limit. This is used to determine whether or not the user should be given this integrator as an option to process a specific transaction. *Note:* that either this value or the `limitAmount` can be present, never both.",
          "$ref": "#/definitions/V2Empty"
        }
      }
    },
    "V2UserInformation": {
      "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"
        }
      }
    },
    "AssociateAccountWithVendorGeneratedTokenRequest": {
      "description": "Request object for the AssociateAccountWithVendorGeneratedToken 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 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": "Data necessary to verify an OTP generated from `sendOtp`. This is only present if the user went through the `sendOtp` path.",
          "$ref": "#/definitions/OtpVerification"
        },
        "provideUserInformation": {
          "description": "**REQUIRED**: True if we want the Integrator to provide the address associated with this account.",
          "type": "boolean"
        },
        "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"
        }
      }
    },
    "AssociateAccountWithVendorGeneratedTokenResponse": {
      "description": "Response object for the AssociateAccountWithVendorGeneratedToken method.",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/ResponseHeader"
        },
        "paymentIntegratorAssociateAccountId": {
          "description": "**DEPRECATED**: 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 this association.",
          "$ref": "#/definitions/AssociateAccountWithVendorGeneratedTokenResponseAssociateAccountResult"
        }
      }
    },
    "AssociateAccountWithVendorGeneratedTokenResponseAssociateAccountResult": {
      "description": "The result of the association.",
      "type": "object",
      "properties": {
        "success": {
          "description": "The account association was successful.",
          "$ref": "#/definitions/AssociateAccountWithVendorGeneratedTokenResponseAssociateAccountResultSuccessDetails"
        },
        "userAuthenticationFailed": {
          "description": "Even though the account authentication bundle was returned, the user authentication failed.",
          "$ref": "#/definitions/UserAuthenticationFailed"
        },
        "notEligible": {
          "description": "User's account is not eligible for this service.",
          "$ref": "#/definitions/AccountNotEligible"
        },
        "otpNotMatched": {
          "description": "OTP did not match what the integrator sent.",
          "$ref": "#/definitions/OtpNotMatched"
        },
        "otpAlreadyUsed": {
          "description": "OTP was already used.",
          "$ref": "#/definitions/OtpAlreadyUsed"
        },
        "otpLimitReached": {
          "description": "User has requested or tried to verify too many OTPs.",
          "$ref": "#/definitions/OtpLimitReached"
        }
      }
    },
    "AssociateAccountWithVendorGeneratedTokenResponseAssociateAccountResultSuccessDetails": {
      "description": "Details about a successful account association.",
      "type": "object",
      "properties": {
        "vendorPaymentToken": {
          "description": "**REQUIRED**: This is the token that both companies will use to identify the bank account that is associated during this method. This identifies the payer bank account in `transferFunds` calls. This is a string that has a maximum length of 100 characters.",
          "type": "string"
        },
        "tokenExpirationTime": {
          "description": "**OPTIONAL**: Timestamp when the token expires. Use `0` to signal the token does not expire.",
          "$ref": "#/definitions/V1Timestamp"
        },
        "accountDetails": {
          "description": "**DEPRECATED**: Details about the account that was associated during the call.",
          "$ref": "#/definitions/AssociatedAccountDetails"
        },
        "accountId": {
          "description": "**DEPRECATED**: The account ID the user has with the integrator.",
          "$ref": "#/definitions/AssociatedAccountIdentifier"
        },
        "associatedAccountIdentifier": {
          "description": "The account ID the user has with the integrator.",
          "$ref": "#/definitions/AssociatedAccountIdentifier"
        },
        "bankAccountIdentifier": {
          "description": "The account ID the user has with a bank.",
          "$ref": "#/definitions/BankAccountIdentifier"
        },
        "associatedAccountDetails": {
          "description": "Details about the account that was associated.",
          "$ref": "#/definitions/AssociatedAccountDetails"
        },
        "bankAccountDetails": {
          "description": "Details about the bank account that was associated.",
          "$ref": "#/definitions/MaskedBankAccountDetails"
        },
        "transactionLimits": {
          "description": "**REQUIRED**: Defines user scoped transaction limits.",
          "$ref": "#/definitions/TransactionLimits"
        },
        "userInformation": {
          "description": "**REQUIRED**: User information that the integrator knows and will share with Google about this customer. Used for risk information and address prepopulation.",
          "$ref": "#/definitions/V1UserInformation"
        }
      }
    },
    "V1Timestamp": {
      "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"
        }
      }
    },
    "V1UserInformation": {
      "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"
        }
      }
    },
    "UserAuthenticationFailed": {
      "description": "The user failed to authenticate with the integrator.",
      "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"
        }
      }
    },
    "AccountNotEligible": {
      "description": "User's account is not eligible for this service.",
      "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"
        }
      }
    },
    "OtpNotMatched": {
      "description": "OTP did not match what the integrator sent.",
      "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"
        }
      }
    },
    "OtpAlreadyUsed": {
      "description": "OTP was already used.",
      "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"
        }
      }
    },
    "OtpLimitReached": {
      "description": "User has requested or tried to verify too many OTPs.",
      "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"
        }
      }
    },
    "DisassociateAccountRequest": {
      "description": "Request object for the disassociate account method.",
      "type": "object",
      "properties": {
        "requestHeader": {
          "description": "**REQUIRED**: Common header for all requests.",
          "$ref": "#/definitions/RequestHeader"
        },
        "googlePaymentToken": {
          "description": "The Google Payment Token that should be disassociated.",
          "$ref": "#/definitions/V1GooglePaymentToken"
        },
        "vendorPaymentToken": {
          "description": "The vendor payment token that should be disassociated.",
          "$ref": "#/definitions/VendorPaymentToken"
        }
      }
    },
    "DisassociateAccountResponse": {
      "description": "Response object for the disassociate account method.",
      "type": "object",
      "properties": {
        "responseHeader": {
          "description": "**REQUIRED**: Common header for all responses.",
          "$ref": "#/definitions/ResponseHeader"
        },
        "result": {
          "description": "**REQUIRED**: Result of this disassociation.",
          "$ref": "#/definitions/DisassociateAccountResponseDisassociateAccountResult"
        }
      }
    },
    "DisassociateAccountResponseDisassociateAccountResult": {
      "description": "Result for disassociate account.",
      "type": "object",
      "properties": {
        "success": {
          "description": "The account disassociation was successful.",
          "$ref": "#/definitions/V2Empty"
        }
      }
    },
    "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/V1Empty"
        },
        "cancelled": {
          "description": "User canceled the flow manually and the flow should be aborted.",
          "$ref": "#/definitions/V1Empty"
        },
        "fatalError": {
          "description": "Authentication failed for a fatal reason and the flow should be aborted.",
          "$ref": "#/definitions/V1Empty"
        }
      }
    },
    "V1Empty": {
      "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": {
      }
    }
  }
}
