What 1Password guarantees
Items stay end-to-end encrypted. Every item in a 1Password account is encrypted with keys that only the person’s 1Password apps hold. 1Password’s servers can’t decrypt a stored item on their own. Your integration’s keys are created in the person’s browser. At consent, the person’s browser creates your integration keyset and the key that unlocks it. The unlock key goes to you, once, in the URL fragment of your callback. It never reaches a 1Password server. Only the person can create a grant. Approving a login is cryptographic work that needs the person’s vault key, and only their 1Password app holds it. Nothing you hold can create a grant: not your tokens, not your integration key, not a reference. A compromise of your platform can’t add a login the person didn’t approve. OAuth tokens are limited to your integration’s permissions. An OAuth token for your integration can create access requests, check their status, and fetch the logins the person granted. It can’t list the person’s items or approve requests. Granted logins are decrypted only inside an attested enclave. When the extension fills a login, it first verifies an AWS Nitro Enclaves attestation for 1Password’s credential broker, including a check that the enclave runs code 1Password released. It then opens an encrypted session with the enclave using the Noise Protocol Framework. The enclave decrypts the one granted login and returns it inside that session. The 1Password services that relay the session can’t read it.What your integration must protect
Account for these responsibilities when you design and describe your integration.Your security requirements
Every integration must meet these. Secrets- Never send OAuth tokens, integration keys, approval links, or credential values to a model.
- Never put them in logs, error messages, analytics events, or query strings.
- Keep the client secret, refresh token, and code verifier in your backend. Never expose them to browser code.
- Keep the integration key in a per-user secret store, at least as protected as the refresh token, keyed on its connection path. Never put it in a browser image, extension storage, or your agent VM’s file system.
- Give each session a current access token and the integration key, in memory, and drop both when the task ends.
- Run one person per browser environment.
- Prevent the model from reading the page until
fillCredentialreturns. - Don’t load extensions you don’t trust alongside 1Password.
- Use a credential reference only with the connection and access request that produced it.
- Use a login only for the goal and reason the person approved.
- If your product promises approval per session, create a new access request each session and don’t reuse old references.
- Get the approval link in code, never through the model.
- Validate
stateon every callback. Use PKCE withS256. - Store the integration key before anything else that can fail, then clear it from the URL.
- Offer a Disconnect 1Password action that revokes the connection, and delete stored secrets only after revocation succeeds.
- If you suspect your stored keys or tokens were exposed, revoke the affected connections and ask those people to connect again.