abstract api out completely