# Diagnosis

## Symptom

Upserting thousands of vectors in one call returns 400; the same vectors succeed in smaller batches.

## Likely cause

Single upsert requests are capped at about 2 MB. Large batches with rich metadata exceed it. The 400 is deterministic for the same payload.

## Confirm it

1. Halve the batch until it succeeds; the threshold you find is your effective cap for that vector shape.
2. Estimate: dimension times 4 bytes per vector plus metadata; keep batches comfortably under 2 MB.
3. Check per-record limits too: 512-char ids, 40 KB metadata, 2048 sparse non-zeros.

## Fix

Batch by byte size, not just count: accumulate vectors until near the cap, then send. Parallelize across batches for throughput, with backoff on 429.

## Verify the fix

Ingest the full dataset with the new batcher and assert `describe_index_stats` totals equal the source count.