Pick by access pattern, not by data size. Hot keeps your vectors in RAM — single-digit-millisecond queries — and is the right tier for anything a person or an application actively waits on: search boxes, RAG retrievers, recommendation widgets. Warm keeps them on SSD at roughly a tenth of the cost; the first query after a quiet spell pays a page-in penalty, then the operating system's page cache brings repeat queries near hot-tier speed — right for internal tools and analyses that run a few times an hour, not a thousand times a minute. Paused archives the collection to compressed cold storage: the data is safe and exportable but not queryable until you promote it back, and it's the cheapest way to keep data you might need someday.

The size instinct — small goes hot, big goes warm — is the common mistake. A 10-million-row collection queried once a week belongs in warm however big it is; a 10,000-row collection behind a search bar belongs in hot however small it is. What hot buys you is latency for queries someone is waiting on, and its value scales with how often someone waits.

The tier is one argument at create time:

from veep import VP, samples

df = samples.dataframe()

vp = VP.from_creds()
vp.collections.create("warm-tier-demo", tier="warm")
vp.vectors.upsert("warm-tier-demo", dataframe=df.head(500))

col = vp.collections.get("warm-tier-demo")
print(col.tier, col.status, col.vector_count)
warm ready 500

Queries work identically on every tier — same API, same filters, same scores; only the latency profile differs:

hit = vp.vectors.query("warm-tier-demo",
                       vector=samples.encode("a small team plans an elaborate casino heist"),
                       top_k=1)[0]
print(f"{hit.score:.4f}  {hit.metadata['title']}")
0.4782  Ocean's Eleven

Changing your mind is cheap

Tiers aren't a commitment. Promote or demote any collection from the dashboard at any time, and billing follows immediately in both directions: the moment you demote, you stop paying the higher rate; the moment you promote, the next query is already faster. Data with a daily rhythm — heavy business-hours traffic, quiet nights — can ride the dial.

Most workloads should simply start hot. When the bill grows and you can name collections nobody is waiting on, demote those to warm; when data goes genuinely dormant, pause it. The tiers exist so each collection gets its own cost/latency decision instead of one global compromise.

The mental model behind the three layers — why RAM, SSD, and cold storage behave the way they do — is drawn out in Hot, warm, paused: a tier mental model, and pricing has the current per-gigabyte rates.

vp.collections.delete("warm-tier-demo")