ADR 0006. Large Batches via Object Storage + Manifest, Not One Giant HTTP Payload
Status
Accepted.
Inline batch endpoint in the current spec is POST /v1/activity-batches
(spec §37.6), not POST /v1/event-batches. Formats (NDJSON, NDJSON.gz,
Parquet, CSV via signed upload + manifest) still stand. There is no
api/openapi.yaml in the repository yet; cite spec §37.
Context
Not every partner supports real-time integration; many will export periodically (every few minutes to end-of-day). Sending millions of records as one HTTP JSON payload is expensive and fragile (memory pressure, timeout risk, poor retry semantics).
Decision
Small/medium batches may be submitted inline via POST /v1/event-batches.
For very large exports: request a signed upload URL, upload compressed
NDJSON/Parquet/CSV directly to S3-compatible object storage, then submit
a manifest referencing that upload for asynchronous processing.
Consequences
- Batch and real-time paths still converge on the same normalized event model post-ingestion (see ADR 0004). This only changes how bytes arrive, not how they're processed afterward.
- Requires manifest/checkpoint design and idempotent batch processing
(same
(source_party_id, source_event_id)uniqueness as real-time). - Exact accepted formats are fixed (NDJSON, NDJSON.gz, Parquet, CSV).
See
api/openapi.yaml.