Data model — wat we wel/niet bewaren
openai_users
Per pull-cycle vervangen we de hele snapshot van een org.
| Veld | Bron | Hashed? |
|---|---|---|
openai_user_id | user_... (OpenAI ID) | nee |
email_hash | SHA256(lowercase email) | ✓ |
email_prefix | Eerste 4 chars vóór @ + ’…‘ | partial |
role | ”owner” / “reader” | nee |
added_at | Unix → TIMESTAMPTZ | nee |
openai_projects
| Veld | Bron | Hashed? |
|---|---|---|
openai_project_id | proj_... | nee |
name | Operator-supplied label | nee |
status | ”active” / “archived” | nee |
created_at_openai | Unix → TIMESTAMPTZ | nee |
archived_at | Unix → TIMESTAMPTZ | nee |
openai_api_keys
| Veld | Bron | Hashed? |
|---|---|---|
openai_key_id | key_... | nee |
name | Operator label | nee |
type | ”user” / “service_account” | nee |
redacted_value | sk-...xxxx (laatste 4 chars) | partial |
owner_user_id | Voor user-keys: user_... | nee |
created_at_openai | Unix → TIMESTAMPTZ | nee |
last_used_at | Unix → TIMESTAMPTZ of NULL | nee |
openai_events
Append-only. Idempotent op (connection_id, openai_event_id).
| Veld | Bron | Hashed? |
|---|---|---|
openai_event_id | OpenAI’s id (audit_log_…) | nee |
event_type | OpenAI’s type field | nee |
actor_email_hash | SHA256(lowercase actor.session.user.email) | ✓ |
actor_email_prefix | Eerste 4 chars + ’…‘ | partial |
target_id | project.id (als event over project gaat) | nee |
occurred_at | OpenAI’s effective_at (Unix) | nee |
payload_json | Rest van de payload, PII-velden gedropt | partial |
Gefilterde payload-velden
Volgende keys worden uit de raw payload gedropt voor opslag (isOpenAIPIIField in openai_worker.go):
actor,user,email,actor_email,session— al opgeslagen als hashname,full_name— display-namen
Wat we NIET hebben
- Volledige e-mailadressen — gedropt bij ingest
- De volledige API-key value — alleen
sk-...4-char-redacted(de echte value heeft alleen OpenAI; wij krijgen die NIET via de API) - Wat een API-key heeft aangeroepen —
last_used_atis het enige usage signal; OpenAI exposeert geen per-key request log - Prompt/completion content — niet in admin API
- ChatGPT browser-conversaties — vereist Compliance API (Q4 2026)
Hoe een hash terugvinden naar een persoon
Het email_prefix veld toont jan… voor jan.peeters@company.be. Match
dit prefix met je HR-systeem of LDAP/Azure AD om te weten wie het is.
Wij hebben de mapping niet en willen die niet hebben.