First query in five minutes
Three calls: create a collection, write vectors, search them. Nothing to install on your side, no index to size, no cluster to name. The free tier needs a card exactly never.
Three calls
Create a collection
curl -X POST https://api.nodeform.dev/v1/collections \
-H "Authorization: Bearer $NODEFORM_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "docs",
"dimensions": 768,
"metric": "cosine",
"region": "eu-west-1"
}' Write some vectors
from nodeform import Client
nf = Client() # reads NODEFORM_KEY
docs = nf.collection("docs")
docs.upsert([
{"id": "faq-114",
"vector": embed("how do refunds work"),
"metadata": {"locale": "en-GB", "updated": "2026-09-02"}},
]) # searchable in ~2s Search, filter and fuse
hits = docs.search(
vector=embed("money back"),
text="refund", # BM25, fused with RRF
filter={"locale": "en-GB"}, # applied inside the index
k=10,
)
hits[0].score, hits[0].id # 0.81, "faq-114"
hits.latency_ms, hits.recall_est # 19, 0.993 The whole API
Seven endpoints. If you need an eighth, that is a bug report and we would like to hear it.
| Method | Path | What it does |
|---|---|---|
| POST | /v1/collections | Create a collection. Dimensions and metric are fixed at creation. |
| GET | /v1/collections/:name | Vector count, index family, shard layout, current p99. |
| POST | /v1/collections/:name/upsert | Up to 1,000 vectors per call, or a signed URL for bulk import. |
| POST | /v1/collections/:name/search | Dense, keyword and hybrid search. Filters applied during traversal. |
| POST | /v1/collections/:name/delete | Delete by id or by metadata filter. Tombstoned, compacted nightly. |
| GET | /v1/collections/:name/recall | The latest recall@k report and the ground-truth sample it used. |
| POST | /v1/sources | Attach a Postgres table, an S3 prefix or a Kafka topic for embedding sync. |
What each tier holds
| Limit | Developer | Scale | Enterprise |
|---|---|---|---|
| Vectors per collection | 1M | 100M soft | No ceiling |
| Dimensions | 1,536 | 4,096 | 4,096 |
| Queries per second | 50 | 5,000 | Negotiated |
| Upsert rate | 2K/s | 2M/min bulk | 2M/min bulk |
| Payload per search | 256 KB | 1 MB | 4 MB |
| Write to searchable, p95 | Best effort | 4s | Contracted |
| p99 query latency | Best effort | 24 ms | Contracted |
Pick a language
Python
pip install nodeform Sync and async clients, numpy in and out.
TypeScript
npm i @nodeform/client Works in Node 20+, Bun, and on the edge runtimes.
Go
go get dev.nodeform/go Connection pooling and gRPC by default.
HTTP
curl https://api.nodeform.dev/v1 Everything the SDKs do, documented per endpoint.
Before you write the first call
Do I need to choose an index type?
No. You give us dimensions, a metric and a region. We pick HNSW or DiskANN from the collection size and your latency budget, and we move you between them without a migration.
How long until a written vector is searchable?
Around two seconds on a normal write, and a p95 of four seconds under the Scale tier target. Bulk imports of a few hundred million vectors are indexed in the background and cut over when complete.
What happens when I exceed a limit?
Queries above the per-second ceiling get a 429 with a retry-after header rather than a slow answer. Storage above the included vectors is billed at the published per-million rate; nothing stops working.
Can I get my vectors back out?
Yes, in one call. An export streams every vector and its metadata as JSONL or Parquet to a bucket you own. There is no charge for it and no ticket to raise.
Ready to stop running
your own vector index?
Read the quickstart, or talk to the engineer who will run your index.