# CHAPI integration 1Keep Following this [guide](https://chapi.io/developers/wallets) I turned 1keep into a CHAPI digital credential wallet. The total process took approximately 4 hours. ## 1. Import the CHAPI Polyfill into your wallet app - the following packages appear to be modules however don't have the `"type": "module"` property in their package.json. Needed to patch that in - credential-handler-polyfill - web-request-rpc - web-credential-handler - had to import like this: `import { loadOnce } from 'credential-handler-polyfill'` instead of like this: `import * as polyfill from 'credential-handler-polyfill';` ## 2. Add a credential_handler to your app’s manifest.json - pretty straight forward. docs showed extra metadata to include. ## 3. Allow your users to register their wallet’s credential handler with the browser polyfill - need to `loadOnce()` from the polyfill ## 4. Setup Listeners for CHAPI Events - didn't know where to activate these listeners but quickly realized this goes in the service worker ## ~~5. Get Credentials Events~~ - skipped this for now as I'm just working on storage first ## 6. Store Credentials Events - got this to work fairly easily but all of the VCs in the playground have millisecond precision which blew up in my VC library.. Not sure why I added a requirement to not include milliseconds as I can't seem to find that text in the VC data model. - after relaxing this validation credentials were saving.. after I added another context of course because that's life in LD Land