Data model — wat we wel/niet bewaren
openai_users
Section titled “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
Section titled “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
Section titled “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
Section titled “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
Section titled “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
Section titled “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
Section titled “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.