How audit reconciliation works

ComplyEdge keeps proof that your controls ran. It does not keep your prompts or your model's answers. You keep the text, we keep the proof, and the event_id joins the two.

1. What the record holds

ComplyEdge does not store prompts or outputs. Each check writes one record, and it holds:

So the record on its own proves the control ran: which rule, which law, what decision, and when. It does not hold the text, so it cannot show what was said.

One detail, so nothing surprises you: the /v1/check response sends back up to 200 characters of your own text in violations[].text_excerpt, so you can see what matched. That excerpt goes back to you only. It is not written to the record.

2. The one step: keep the event_id next to your copy

Every /v1/check returns an event_id. Save it wherever you already keep the prompt and the answer: your chat history, your own application logs, or your cloud provider's model invocation logs.

Python

result = ce.check(prompt, direction="prompt")
answer = call_your_model(prompt)
# your own log line, with the ComplyEdge event_id beside the text
chat_log.save(prompt=prompt, answer=answer, complyedge_event_id=result.event_id)

TypeScript

const result = await ce.check(prompt, { direction: 'prompt' });
const answer = await callYourModel(prompt);
// your own log line, with the ComplyEdge eventId beside the text
await chatLog.save({ prompt, answer, complyedgeEventId: result.eventId });

Check the model's answer too (direction output) and it gets its own event_id; save that one next to the answer the same way.

3. In an audit or a complaint

Take your copy of the text and its event_id, and ask ComplyEdge whether they match. The answer is yes or no. The text is used for that request only: it is not stored and not logged.

POST /v1/audit/verify
{ "event_id": "uuid-v4", "text": "the prompt from your own log" }

200
{ "event_id": "uuid-v4", "match": true, "text_hash_alg": "hmac-sha256-1" }

The SDKs wrap the same call: ce.verify_input(event_id, text) in Python and ce.verifyInput(eventId, text) in TypeScript, both returning true or false.

That is the reconciliation. Your copy says what was said. The record says which rule ran, under which law, with what decision, and when. A yes from verify ties the two together: the text you hold is the exact text whose fingerprint was stored when the check ran. Change one character and the answer is no.

4. If you delete your text early

You can delete your copy of the text whenever your own retention policy says to, for example to keep personal data to a minimum. The ComplyEdge record is kept for its own retention period: 184 days by default, which covers the six months Article 26(6) of the EU AI Act asks for where it applies, from any start date. Enterprise accounts can keep it for 7 or 11 years.

The trade-off is plain. After you delete the text, the record still proves the control ran: which rule, which law, what decision, when. What can no longer be shown is what the text said, because nobody holds it any more, us included.

5. Where to read more