# 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