for consistency, return empty lists (not dicts) on failure