public ArrayList<MArchive> search()
            throws SDKException, APIException, SignInException{
        ArrayList<MArchive> archiveList = new ArrayList<>();

        if (query != null && !query.isEmpty()) {
            data.put("q", query);
        }
        if (!data.containsKey("location")) {
            data.remove("radius");
        }
        if (data.isEmpty()) {
            return null;
        }
        LGR.log(Level.INFO, "search hash has {0} entries", data.size());
        if (performOperation(URI, data)) {
            ArrayList al = getArrayPayload();
            if (al.isEmpty()) {
                LGR.info("empty list returned");
                return archiveList;
            }
            LGR.log(Level.INFO, "found {0} items", al.size());
            ArrayList<HashMap<String, String>> ret = SpreadSheet.parse(al);
            LGR.log(Level.INFO,
                    "Turned spreadsheet into array of hashes of size {0}",
                    ret.size());
            for (final HashMap<String, String> h: ret) {
                final String r = h.get("region");
                MVault vm = new MVault(h.get("vault"), r);
                MArchive a = new MArchive(vm, h.get("archive"))
                        .withDeletedFlag(h.get("deleted").equals("t"))
                        .withDescription(h.get("description"))
                        .withSize(Long.parseLong(h.get("size")));
                
                LGR.log(Level.FINE, "archive {0} from region {1}", 
                        new Object[]{a.getArchiveId(), r});
                archiveList.add(a);
            }
            LGR.log(Level.INFO, "found {0} archives", archiveList.size());
        }
        return archiveList;
    }