docs: def scan(self, thing, thing_type=None, blocking=False):
          """
          \nScan a single or list of URLs, or Domains\n
          NOTE: URLs must include the scheme (http:// or https://)\n
          NOTE: For a single domain or list of domains this method will automatically append an 'http://' to the \n
          beginningof the domain(s)\n
  
          :param thing: a URL or list of URLs,
                        a domain or list of domains
          :param thing_type: Optional, a hint to the function as to what you are sending it
          :param blocking: Default is False, it set to True will cause the function to block until all scan results can be
                          retrieved from virus total and the results returned
          :return: If blocking is False will return a dictionary with the thing as key and the ScanID as the value.
                   These scan results can be later retrieved with the the API's retrieve method by providing the ScanID(s).
                   If blocking if True will return a dictionary with the thing as key and the Scan result as the value.
          :raises TypeError: if it gets something other than a URL or domain or list of either
          :raises TypeError: if VirusTotal returns something we can't parse.
          """
          thing_id = self._whatis(thing)
          if thing_type is None:
              thing_type = thing_id
  
          query_parameters = {}
          result = {}
  
          if thing_type == API_Constants.URL:  # Get the scan results for a given URL or list of URLs.
              query = API_Constants.CONST_API_URL + API_Constants.API_ACTION_SUBMIT_URL_SCAN
              if not isinstance(thing, list):
                  thing = [thing]
  
              pending_results = {}
              for url in thing:
                  query_parameters["url"] = url
                  self._limit_call_handler()
                  try:
                      response = self._post_query(query, query_parameters)
                      pending_results[url] = response['scan_id']
                  except:
                      raise TypeError
  
              result = pending_results
              if blocking:
                  results = {}
                  done = 0
                  pending = len(pending_results)
                  while done < pending:
                      url, scan_id = pending_results.popitem()
                      response = self.retrieve(scan_id)
                      if response[scan_id]['response_code'] == 1:
                          results[url] = response[scan_id]
                          done += 1
                      else:
                          pending_results[url] = scan_id
                  result = results
  
          elif thing_type == API_Constants.DOMAIN:
              query = API_Constants.CONST_API_URL + API_Constants.API_ACTION_SUBMIT_URL_SCAN
              if not isinstance(thing, list):
                  thing = [thing]
  
              thing = ['http://%s' % a for a in thing]
              pending_results = {}
  
              for url in thing:
                  query_parameters["url"] = url
                  self._limit_call_handler()
                  try:
                      response = self._post_query(query, query_parameters)
                      pending_results[url] = response['scan_id']
                  except:
                      raise TypeError
  
              result = pending_results
              if blocking:
                  results = {}
                  done = 0
                  pending = len(pending_results)
                  while done < pending:
                      url, scan_id = pending_results.popitem()
                      response = self.retrieve(scan_id)
                      if response[scan_id]['response_code'] == 1:
                          results[url] = response[scan_id]
                          done += 1
                      else:
                          pending_results[url] = scan_id
                  result = results
  
          else:
              raise TypeError("Unimplemented! for '%s'." % thing_type)
          return result