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