No marketing copy here — just the facts about what Permitly stores and how the system protects your users.
| Field | What it is | Why we store it |
|---|---|---|
| end_user_ref | Opaque string you provide — we recommend using a non-PII internal ID | Match consents back to your users without us knowing who they are |
| end_user_email | Optional. Only stored if you send it in the API request | Allow email notifications if you opt in |
| Consent metadata | Scope keys, status (pending/approved/declined/revoked), timestamps | Core product function — the consent record itself |
| API key hash | bcrypt hash of your key — never the key itself | Authenticate your API requests |
| Audit events | Event type, agent, actor, IP address, user-agent, timestamp | Compliance record and dashboard activity feed |
exp claim is set at issuance. Expired tokens are rejected.POST /v1/consent/verify before granting agent access.exp.Before any builder's agent can send a consent request to a real end user, the builder's account must complete two one-time checks:
Once verified, the builder's domain is displayed on every consent page their agents send — so as an end user, you have something concrete to check an agent's claimed identity against, not just a name and logo the builder typed in. Verification doesn't guarantee an agent is who it claims to be, but it raises the cost of impersonation and gives you, and us, a real account to act on if something looks wrong.
Every approval email contains a /manage/{token} link. The user can revoke any consent without needing a Permitly account.
DELETE /v1/consent/{id} revokes immediately. Both paths fire the consent.revoked webhook instantly.
| Plan | Audit log retention |
|---|---|
| Free | 30 days |
| Starter | 1 year |
| Pro | 3 years |
Active consents and the core consent record are retained until revoked or the account is deleted, regardless of plan.
Security questions or vulnerability reports: security@permitly.dev
Privacy policy: permitly.dev/trust