Skip to main content

CSV data upload studio

Bulk ingest

Validate → confirm → batch — historical rows with the same event catalog and TCU rules as webhooks.

Audience: partner teams importing historical activity via CSV.

Outcomes

  • Select one context per batch and download a partner-specific template
  • Validate rows and see estimated TCU before confirm
  • Track batch status and open Pulse filtered by batch_id
  • Attribute ingest to ingest_channel=csv in billing breakdowns

The Data upload studio is TumiTrust’s bulk ingest path for trust producers. It mirrors the rigor of webhook ingest — same event catalog, same context rules, same TCU meter — with a guided validate → confirm → ingest flow so operations teams can backfill or migrate data without guessing.

Hub path: /institution/<slug>/partner-operations/ingest/
Sidebar: Operations → Data upload


When to use CSV vs webhook

ChannelBest for
WebhookReal-time order, repayment, verification events
API / connector syncScheduled pulls from your systems
CSV uploadHistorical backfill, one-off migrations, ops batches, integration testing

Every CSV row becomes a trust event tagged with source=csv, a batch_id, and a context_id — visible in Pulse ingest funnels and billing breakdowns.


The five-step studio

 ① Context          ② Upload           ③ Map & validate      ④ Ingest           ⑤ Results
pick trust → drag-drop CSV → column map + → background → batch status
context UTF-8 header error table processing Pulse deep-link

Step 1 — Select producer trust context

Choose one enabled context per batch from your partner profile — any of the documented trust contexts you have enabled (e.g. merchant, lending, mobility). Cards show primary badge and entity type.

After you pick a context, the studio shows a CSV template panel with:

  • Column headers for that context (required columns highlighted)
  • Allowed event_type values from your catalog
  • A live preview of example rows
  • Download CSV template — file name {partner_id}-{context_id}-trust-events-template.csv

Templates are generated per partner and context from your event catalog (not a single static file). A minimal three-column reference is also available in the studio.

  • Template CSV: GET /institution/<slug>/api/partner-operations/ingest/template/?context=<id>
  • Template JSON (columns + preview): same URL with &format=json

Step 2 — Upload CSV

  • Drag-and-drop or file picker
  • UTF-8 with header row required
  • Typical size limits are shown in the upload studio for your plan; split very large files into multiple batches

Step 3 — Map columns & validate (dry-run)

Click Validate & preview. The studio calls:

POST /institution/<slug>/api/partner-operations/ingest/preview/
(multipart: context_id, file, optional column_map JSON)

You see:

PanelContent
KPI stripValid rows, errors, estimated TCU for this batch
Column mappingMap event_type, partner_entity_id, occurred_at to your file headers
Event histogramCount per event_type among valid rows
Error tableRow number, field, message
Sample rowsFirst valid rows before commit

Re-validate after changing column mapping — no data is written until you confirm.

Column map example (form field column_map):

{
"event_type": "EventType",
"partner_entity_id": "StoreId",
"occurred_at": "Timestamp"
}

Step 4 — Confirm ingest

Click Confirm ingest. The studio:

  1. Re-runs validation server-side
  2. Creates an ingest batch record
  3. Queues async processing
  4. Shows a progress bar

API: POST /institution/<slug>/api/partner-operations/ingest/csv/
Returns batch_id, task_id, tcu_estimate, and pulse_filter_url.

Step 5 — Results & confirmation

When the batch completes:

StatusMeaning
completedAll valid rows ingested
partialSome rows failed; see error report
failedNo rows ingested
processingStill running — poll job API

Poll batch:

GET /institution/<slug>/api/partner-operations/ingest/jobs/<batch_id>/

Response includes ingested_count, duplicate_count, error_count, tcu_accrued, and errors[].

Open Pulse — link filters Insight Studio to source=csv and batch_id for audit.


CSV format

Required columns

ColumnDescription
event_typeMust exist in your event catalog for the chosen context
partner_entity_idYour stable subject key (store id, subscriber id, …)
occurred_atISO-8601 timestamp (UTC recommended)

Optional payload columns

Additional columns become JSON payload fields (e.g. order_value, currency). The template generator includes keys from your catalog sample payloads for the selected context.

Example

event_type,partner_entity_id,occurred_at,order_value,currency
order_completed,store-1001,2026-06-25T10:00:00Z,29.99,USD
repayment_on_time,merchant-acct-88,2026-06-24T15:30:00Z,150.00,USD

TCU and billing

CSV ingest consumes Trust Compute Units (TCU) per successfully ingested row (ingest operation), attributed to:

  • partner_id
  • context_id
  • ingest_channel=csv
  • batch_id (metadata)

The studio shows estimated TCU before confirm; the batch job returns actual TCU accrued after processing. Period totals and per-context breakdowns appear in Partner operations and:

GET /institution/<slug>/api/partner-operations/billing/tcu/
GET /institution/<slug>/api/partner-operations/billing/tcu/breakdown/


Batch history

The studio lists recent ingest batches (time, context, status, rows, TCU). Refresh via:

GET /institution/<slug>/api/partner-operations/ingest/batches/

Use batch IDs in support tickets — not raw PII from CSV files.


Idempotency & duplicates

Each row receives a unique idempotency key so duplicate uploads in the same batch are skipped.

Re-uploading the same logical event in a new batch may create a duplicate acknowledgment if the same business key was already processed via webhook. Design backfills to use consistent partner_entity_id + event_type + occurred_at semantics.


Error handling playbook

SymptomLikely causeFix
Unknown event_typeCatalog gapAdd event + trigger rule; sync connector
Context rejectedContext disabledEnable via trust-contexts API
Invalid occurred_atFormatUse ISO-8601
Zero valid rowsHeader mismatchUse column mapping + re-validate
Partial batchMixed good/bad rowsFix errors; upload corrected rows in new batch

Security & compliance (public guidance)

  • Upload only data you are contractually permitted to share with TumiTrust
  • Use institution session auth — do not embed API keys in browser extensions
  • Rotate credentials if a CSV with secrets was attached to a ticket
  • Prefer webhook ingest for ongoing real-time flows; CSV for batch boundaries

API summary

MethodPathPurpose
GET…/ingest/template/?context=Download CSV template
GET…/ingest/template/?context=&format=jsonTemplate columns + preview (JSON)
POST…/ingest/preview/Dry-run validation
POST…/ingest/csv/Confirm ingest
GET…/ingest/jobs/<batch_id>/Batch status
GET…/ingest/batches/Recent batches