add api and some impl