Treasure AI Voice can push your organization's recordings, transcripts, AI-generated summaries, and device inventory directly into your own Treasure Data CDP database. Once the data lands in your CDP, you can join it with the rest of your customer data, build segments, drive journeys, and run analytics over what was actually said in your meetings and calls.
The integration supports both manual and recurring exports. An export runs in the background and streams data to the tables you specify in your Treasure Data CDP database. The destination settings and a dedicated write-only API key can be saved for later manual or unattended scheduled runs. The full API key is never returned to the console, included in an export run payload, or written to the audit log.
The Treasure Data CDP export is available to Enterprise Administrators only, and must be enabled for your organization before it appears. See Enabling the integration below.
This page covers moving Treasure AI Voice data into your CDP as tables you can query, segment, and activate. If you instead want an agent to read recordings conversationally — summarizing a meeting, drafting a follow-up, quoting who committed to what — connect Treasure AI Voice to Treasure AI Studio. That path is read-only, needs no export, and is scoped to each user's own Treasure AI Voice role. See Connect Treasure AI Voice.
Each export writes to four logical tables in your CDP database. The recordings, transcript_segments, and summaries tables reflect the recordings in scope for the run. The devices table is not filtered by recording date; an initial export may include the full device inventory, while an incremental export includes devices changed since the export checkpoint.
Recordings are included regardless of processing status. The status column reflects each recording's state, and transcription_text, summary_text, and the related fields are empty for recordings that have not finished transcribing or summarizing yet.
Exports can be incremental. The export uses the source record's updated_at value to identify records changed since the previous checkpoint. A date range limits recording candidates by recorded_at; it does not change the purpose of the incremental checkpoint.
| Table | Contents | Granularity |
|---|---|---|
recordings | One row per recording: metadata, the full speaker-labeled transcript, the AI summary, and action items. | One row per recording |
transcript_segments | The transcript broken into individual timed utterances, with speaker attribution and per-segment language detection. | One row per utterance |
summaries | The AI-generated summary and action items, separated out for easy joining. Only recordings that have a summary produce a row. | One row per summarized recording |
devices | Your organization's PLAUD device fleet: assignment, status, firmware, and last-seen timestamps. | One row per device |
Every row carries a stable unique_id derived from the source record. The same source record always maps to the same unique_id, but Treasure Data CDP appends incoming events rather than replacing existing rows. Use updated_at to identify the latest copy when repeated exports produce more than one row with the same unique_id.
Every row also carries an updated_at column containing the source record's last-updated time as Unix epoch seconds. If a source update time is unavailable for an older record, updated_at falls back to a table-specific timestamp (see each table's updated_at description below).
Every row also carries a time column (Unix epoch seconds) that Treasure Data CDP uses for native time partitioning, so analysts can efficiently filter by time. The time value is anchored to the most meaningful timestamp for each table — recorded_at for recordings and summaries, the recording timestamp plus the utterance offset for segments, and the last heartbeat (falling back to provisioning time) for devices. Use time for partition filtering and updated_at for freshness and deduplication.
The schema is owned by Treasure AI Voice. Columns are appended to your CDP tables on first write — you do not need to pre-declare them.
| Column | Type | Description |
|---|---|---|
time | long | Unix epoch seconds of recorded_at. Used for time partitioning. |
unique_id | string | Stable identifier for this recording row. Use it with updated_at to deduplicate repeated exports. |
updated_at | long | Unix epoch seconds of the source recording's last-updated time. Older records may use recorded_at as a fallback. |
id | string | Recording ID (matches recording_id in the other tables). |
organization_id | string | Your organization's identifier. |
recorded_at | string | ISO 8601 timestamp of when the recording was captured. |
user_email | string | Email of the member who created the recording. |
user_name | string | Display name of the member who created the recording. |
file_name | string | Original file name of the recording. |
duration_seconds | long | Length of the recording in seconds. |
status | string | Processing status (e.g., COMPLETED). |
transcription_language | string | Primary detected language of the transcription. |
transcription_text | string | The full transcript, rendered as speaker-labeled, speaker-grouped text — the same form an administrator sees when opening the recording in the AI Voice Console. Note: If a recording's transcript exceeds the 1 MB per-event size limit (typically recordings over 3 hours), the entire recordings row for that recording is rejected by the ingest API. The export continues and completes with a partial status; the recording's rows in transcript_segments and summaries are unaffected. |
summary_text | string | The AI-generated summary of the recording. |
action_items | array<string> | AI-extracted action items. |
inferred_name | string | AI-inferred title for the recording. |
tags | array<string> | Tags applied to the recording. |
device_serial_number | string | Serial number of the PLAUD device used to capture the recording. |
team_id | string | Identifier of the team the recording is associated with, if any. |
| Column | Type | Description |
|---|---|---|
time | long | Unix epoch seconds at the segment's start position, calculated from the recording timestamp and segment offset. |
unique_id | string | Stable identifier for this segment row. Use it with updated_at to deduplicate repeated exports. |
updated_at | long | Unix epoch seconds of the parent recording's last-updated time. Older records may use the recording timestamp as a fallback. |
recording_id | string | The parent recording's ID. Join to recordings.id. |
organization_id | string | Your organization's identifier. |
segment_index | long | Zero-based position of the segment within the recording. |
start_ms | long | Segment start offset, in milliseconds from the beginning of the recording. |
end_ms | long | Segment end offset, in milliseconds from the beginning of the recording. |
speaker_id | string | Raw speaker identifier from diarization (e.g., spk_0). |
speaker_label | string | Human-friendly speaker name when one has been assigned in the AI Voice Console; otherwise empty. |
language | string | Detected language of the segment. |
language_probability | double | Confidence of the language detection for the segment. |
text | string | The transcribed text of the segment. |
| Column | Type | Description |
|---|---|---|
time | long | Unix epoch seconds of recorded_at. |
unique_id | string | Stable identifier for this summary row. Use it with updated_at to deduplicate repeated exports. |
updated_at | long | Unix epoch seconds of the parent recording's last-updated time. Older records may use the recording timestamp as a fallback. |
recording_id | string | The recording this summary belongs to. Join to recordings.id. |
organization_id | string | Your organization's identifier. |
recorded_at | string | ISO 8601 timestamp of the underlying recording. |
summary_text | string | The AI-generated summary. |
action_items | array<string> | AI-extracted action items. |
inferred_name | string | AI-inferred title for the recording. |
| Column | Type | Description |
|---|---|---|
time | long | Unix epoch seconds of the last heartbeat (or provisioning time if the device has never reported). |
unique_id | string | Stable identifier for this device row. Use it with updated_at to deduplicate repeated exports. |
updated_at | long | Unix epoch seconds of the source device's last-updated time. Older records may use the device's content timestamp as a fallback. |
serial_number | string | The device serial number. |
organization_id | string | Your organization's identifier. |
status | string | Current device status (e.g., ACTIVE, LOCKED). |
device_model | string | Device model (e.g., Note Pro, NotePin S). |
firmware_version | string | Firmware version currently installed. |
assigned_user_email | string | Email of the member the device is assigned to. |
assigned_user_name | string | Display name of the member the device is assigned to. |
assigned_at | string | ISO 8601 timestamp when the device was assigned. |
provisioned_at | string | ISO 8601 timestamp when the device was provisioned. |
last_heartbeat_at | string | ISO 8601 timestamp of the device's most recent status report. |
last_sync_at | string | ISO 8601 timestamp of the device's most recent sync with the mobile app. |
Before configuring an export, make sure you have:
- An Enterprise Administrator account on Treasure AI Voice.
- The integration enabled for your organization (see below).
- A Treasure Data CDP API key belonging to a user who has Import Only or General Access permission on the destination database.
- A destination database in the Japan (AP01) region of Treasure Data CDP. The export creates the destination tables on first write.
Provide a dedicated write-only API key. Import Only or General Access permission on the destination database is required. Do not use your Master key because it grants more access than this integration requires.
The key is stored securely for later manual or scheduled runs. Its full value is never returned to the console, included in an export run payload, or written to the audit log.
Treasure AI Voice exports to the Japan (AP01) region of Treasure Data CDP only. Make sure your destination database and API key are associated with that region.
The integration is off by default. To turn it on:
- Sign in to the AI Voice Console as an Enterprise Administrator.
- Open the Export page.
- Select the Treasure Data CDP destination.
- Click Enable export.
If you do not see the option to enable it, contact your Treasure AI representative.
Save the destination and credential before running a manual or scheduled export:
- Open the Settings tab on the Export page.
- Enter the destination Database.
- Enter a dedicated Write-only API Key.
- Optionally expand Advanced and change the Recordings table and Transcript segments table names.
- Click Save settings.
The database and table settings are restored when you return to the Export page. To replace the credential, click Replace and save a new key. To remove it, click Remove. Removing the saved key disables an enabled recurring schedule.
- Confirm that the destination database and saved API key are shown on the Settings tab.
- Optionally expand Advanced and set a From and To date range.
- Optionally select Re-export previously exported recordings.
- Click Run export now.
- Open the History tab to monitor the run.
The date range filters recordings by their recorded date. The To date is inclusive through the end of that day. The range applies to recordings, transcript segments, and summaries; it does not filter devices by recording date.
The request creates a background run and returns before the export finishes. You can leave the page while the export continues.
Recurring exports use the saved destination, table settings, and write-only API key. The available intervals are:
- Every hour
- Every 6 hours
- Every 12 hours
- Every 24 hours
- Weekly
The shortest interval is one hour. Custom cron expressions are not supported. The first scheduled run can either start from the time the schedule is enabled or backfill the organization's existing exportable data before continuing incrementally.
A recurring export cannot start while another export is running for the same organization.
The History tab lists manual and scheduled runs. Each run has one of the following statuses:
| Status | Meaning |
|---|---|
| Queued | The export has been accepted and is waiting to start. |
| Running | The export worker is processing the run. |
| Success | The run completed without reported row rejections. |
| Partial | The run completed with rejected rows or stopped at the worker time limit. Data not reached by the run is handled by a later export run. |
| Failed | The run could not complete because of an authentication, permission, configuration, or system error. |
| Nothing to send | No recording or device events were accepted for the run. |
The History list shows the start time, trigger type, status, accepted and rejected row counts, duration, and run ID. Run details include the destination database, table-level counts, failure information, and recordings rejected because their event was too large.
Invalid credentials and insufficient Treasure Data CDP database permissions can appear as a failed run because the export runs asynchronously. Grant the key's user Import Only or General Access permission on the destination database, then run the export again.
A recording whose serialized event exceeds the 1 MB per-event limit is listed in the run details. The recording row is rejected, but its transcript segments and summary may still be exported. The recording is retried by later runs for a limited number of attempts.
Every export run is recorded in the Audit Logs under the TD_CDP_EXPORT event type. Run status and row counts are available in History and the run details, not in Audit Logs. Settings and credential changes are also audited. The API key itself is never written to the audit log.
Scheduled and undated exports use an incremental checkpoint. Recordings and devices updated at or after that checkpoint are included in the next run. A date range narrows recording candidates by recorded_at while preserving the incremental check.
Selecting Re-export previously exported recordings removes the checkpoint for that run and sends all records in the selected scope again.
Treasure Data CDP appends incoming events instead of replacing existing rows. Repeated exports can therefore contain multiple rows with the same unique_id. Deduplicate downstream by unique_id, keeping the row with the greatest updated_at.
For older records without a maintained source update time, updated_at falls back to a table-specific timestamp (see each table's updated_at description below).
A single recording event cannot exceed 1 MB, and a batch cannot exceed 4 MB. A run can finish with Partial when Treasure Data CDP rejects rows or when the worker reaches its time limit. The minimum recurring-export interval is one hour, and only one export can run at a time for an organization.
For operational procedures and administrator permissions, see the Administrator Guide.
For the exported table schemas, data relationships, and querying examples, see Querying the exported data.
Because each table shares recording_id (recordings.id), you can reconstruct any view of your meeting data in your CDP. For example:
- Join
summariestorecordingsonrecording_idto get summaries alongside the full recording metadata. - Join
transcript_segmentstorecordingsonrecording_id, ordered bysegment_index, to reconstruct or analyze the conversation utterance by utterance. - Pivot
transcript_segmentsonspeaker_label(orspeaker_id) to analyze talk time per participant. - Join
recordingstodevicesondevice_serial_number=serial_numberto attribute conversations to devices and assigned users.
Scheduled and undated exports use an incremental checkpoint. Rows whose updated_at is at or after the checkpoint are exported again.
Treasure Data CDP appends incoming events instead of replacing existing rows. Deduplicate downstream by unique_id, keeping the row with the greatest updated_at.
A manual export with a date range narrows recording candidates by recorded_at. It does not advance the organization's incremental checkpoint.
WITH ranked AS (
SELECT
*,
ROW_NUMBER() OVER (
PARTITION BY unique_id
ORDER BY updated_at DESC
) AS rn
FROM your_table
)
SELECT *
FROM ranked
WHERE rn = 1For older records without a maintained source update time, updated_at falls back to a table-specific timestamp (see each table's updated_at description below).
| Issue | Solution |
|---|---|
| The export option is unavailable | Confirm that the organization has CDP export enabled and that the signed-in user is an Enterprise Administrator. |
| The export cannot start | Save a destination database and a write-only API key before running the export. |
| The run fails with an API key error | Confirm that the key is valid and that its user has Import Only or General Access permission on the destination database. |
| The run is Partial | Open the run details to review rejected rows or a time-limit message. A later export run handles data that was not reached. |
| The run reports Nothing to send | Check the recording date range and select Re-export previously exported recordings when a full re-export is required. |
For the exported table schemas and query examples, see Schema reference.