[ docs ]

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.

[ quickstart ]

Three calls

01

Create a collection

bash
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"
  }'
02

Write some vectors

python
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
03

Search, filter and fuse

python
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
[ endpoints ]

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.
[ limits ]

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
[ clients ]

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.

[ docs faq ]

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.

[ get started ]

Ready to stop running
your own vector index?

Read the quickstart, or talk to the engineer who will run your index.