code: def send(self,
               data: Object,
               retries: int = Session.MAX_RETRIES,
               timeout: float = Session.WAIT_TIMEOUT):
          
          if not self.is_started:
              raise ConnectionError("Client has not been started")
  
          if self.no_updates:
              data = functions.InvokeWithoutUpdates(query=data)
  
          if self.takeout_id:
              data = functions.InvokeWithTakeout(takeout_id=self.takeout_id, query=data)
  
          r = self.session.send(data, retries, timeout)
  
          self.fetch_peers(getattr(r, "users", []))
          self.fetch_peers(getattr(r, "chats", []))
  
          return r
docs: Use this method to send Raw Function queries.
  
          This method makes possible to manually call every single Telegram API method in a low-level manner.
          Available functions are listed in the :obj:`functions <pyrogram.api.functions>` package and may accept compound
          data types from :obj:`types <pyrogram.api.types>` as well as bare types such as ``int``, ``str``, etc...
  
          Args:
              data (``Object``):
                  The API Schema function filled with proper arguments.
  
              retries (``int``):
                  Number of retries.
  
              timeout (``float``):
                  Timeout in seconds.
  
          Raises:
              :class:`RPCError <pyrogram.RPCError>` in case of a Telegram RPC error.