---
# System prepended metadata

title: CHAPI integration 1Keep

---

# 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



