Conversation data export
Freeday can export conversation data to your storage bucket as it happens: messages, CSAT ratings, classification labels, and skill executions. Use it to feed your data warehouse, BI tooling, or quality monitoring without calling the API.
File format
Exports are written as NDJSON: one JSON object per line, one line per event. Validate each line against the JSON Schema (Draft 2020-12) published at:
https://async-api-docs.freeday.ai/export/export-event.v1.schema.json
Fetch it directly or $ref it from your own schemas — the file's $id is this
URL, so a downloaded copy stays self-identifying. Every field carries a
description in the schema, so validators and code generators surface
field-level documentation automatically.
Event types
A line's event_type selects which shape applies (a oneOf discriminated
union in the schema):
event_type |
extra fields |
|---|---|
message_sent |
role, text |
csat_received |
rating (1–5), feedback (nullable), rating_source |
message_classified |
classification_label |
skill_executed |
name, end_state |
Every event also carries the shared envelope: schema_version ("v1"),
event_id, company_id, digital_employee_id, conversation_id,
message_id, occurred_at.
Example records
One line per record, exactly as written to the bucket (formatting added here for readability — in the file each object is on a single line):
{"schema_version":"v1","event_type":"message_sent","event_id":"44f2…:message","company_id":"8e93b6ae-…","digital_employee_id":"9ec14f36-…","conversation_id":"39d60872-…","message_id":"44f2…","occurred_at":"2026-07-02T16:23:01.488680Z","role":"digital_employee","text":"Hoi! Kan ik je ergens mee helpen?"}
{"schema_version":"v1","event_type":"skill_executed","event_id":"44f2…:skill:4465…","company_id":"8e93b6ae-…","digital_employee_id":"9ec14f36-…","conversation_id":"39d60872-…","message_id":"44f2…","occurred_at":"2026-07-02T16:23:01.488680Z","name":"Small talk","end_state":"success"}
{"schema_version":"v1","event_type":"message_classified","event_id":"1979…:classified:1199…","company_id":"8e93b6ae-…","digital_employee_id":"9ec14f36-…","conversation_id":"1cc07a85-…","message_id":"1979…","occurred_at":"2026-07-02T18:09:45.034173Z","classification_label":"freeday"}
{"schema_version":"v1","event_type":"csat_received","event_id":"fd36…:csat:48d7…","company_id":"38dc728d-…","digital_employee_id":"9137d8b7-…","conversation_id":"fe11c421-…","message_id":"fd36…","occurred_at":"2026-07-02T19:54:34.175924Z","rating":5,"feedback":"Friendly and quick.","rating_source":"ai"}
event_id embeds the message_id plus the record kind (e.g. …:message,
…:skill:<uuid>) — that keeps it unique per record while message_id stays
shared across the events of one message.
Integration guidelines
- Delivery is at-least-once — deduplicate on
event_id. - Use
message_idto rejoin events that fanned out from the same message. -
Ignore unknown
event_typevalues — new event types may be added without a version bump. -
A breaking shape change ships as a new schema (
export-event.v2.schema.json, withschema_versionmoving to"v2");v1stays stable.
Contact the Freeday team to enable the export for your environment.