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_id to rejoin events that fanned out from the same message.
  • Ignore unknown event_type values — new event types may be added without a version bump.
  • A breaking shape change ships as a new schema (export-event.v2.schema.json, with schema_version moving to "v2"); v1 stays stable.

Contact the Freeday team to enable the export for your environment.