v1
latestOpenAPI 3.1.02026-07-267154122.0 KBUpsert rows from a CSV file (same operation, CSV transport)
The CSV transport for POST /tables/{tableId}/rows/upsert: content is a base64-encoded CSV whose headers are input-column slugs (the same keys as JSON upsert rows) with one record per data row. Identical match/enrich semantics, identical per-batchId idempotency, identical row cap — a CSV with more than 100 data rows is rejected with 413 TOO_MANY_ROWS (split the file or page the JSON upsert).
Headers
Transport-level replay protection — any v2 POST may send it (1–255 printable ASCII characters; UUIDs recommended). The first response for a key is recorded and replayed verbatim for retries with the same key + method/path/body for 24 hours; replayed responses carry the Idempotency-Replay: true response header. Reusing a key with a different request — or retrying while the original is still in flight — returns 409 IDEMPOTENCY_ERROR. 5xx responses are never recorded (the retry re-executes).
Request body
Response
Idempotent replay of an existing batchId (same receipt shape).