# 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.