Twisp
Consuming Parquet pipeline files
List and download near-real-time ledger change data in Parquet format.
When enabled for your environment, Twisp writes committed ledger changes to tenant-isolated Parquet files and exposes them through the Files API. No managed Redshift warehouse is required.
File layout
Files use hourly UTC partitions:
warehouse/parquet/YYYY/MM/DD/HH/<entity>/<batch>-NNNN.parquet
Available entities are journal, account, account_context, account_set, account_set_member, tran_code, transaction, entry, balance, calculation, velocity_control, velocity_limit, transaction_exception, and workflow_execution.
List a narrow, preferably hourly, prefix:
query ListParquetFiles($pageToken: String) {
files {
listPage(
keyPrefix: "warehouse/parquet/2026/07/29/10/entry/"
pageSize: 250
pageToken: $pageToken
) {
keys {
key
download {
downloadURL
}
}
nextPageToken
}
}
}
Repeat the query with nextPageToken until it is null. The older files.list field is deprecated because it loads every matching object into one response. Select download when you need a five-minute presigned URL for each listed key; omit it when you only need the file inventory.
You can also create a fresh download URL for any returned key with a mutation:
mutation DownloadParquetFile {
files {
createDownload(key: "warehouse/parquet/2026/07/29/10/entry/seed-000003-0000.parquet") {
downloadURL
downloadURLExpiration
downloadHeaders
contentType
}
}
}
CDC semantics
The files contain change data, not latest-state snapshots. Every committed record version carries the warehouse metadata columns record_begin, record_rowid, record_status, record_tenantid, and record_version. Process deletes according to record_status and deduplicate on (record_rowid, record_version).
A historical seed represents records exported at time T. The live pipeline should be enabled before creating the seed export. Seed and live files will then overlap slightly instead of leaving a gap; the normal version deduplication removes that overlap.
The hour in a seed key is the export time. Live file hours are their delivery partitions. Consumers should checkpoint successfully processed object keys and continue polling new hourly prefixes.
Raw delivery-stream inputs expire after 30 days. Parquet retention is configured separately by agreement with the customer.