Skip to content
LogoLogo

Three calls: create a collection, store a memory, search it.

You need a personal API key with resources:read, resources:write and collections:create allowed. Exchange your key for an access token, then list workspaces to choose where to create the collection.

export BASE="https://api.zeroset.com/v2"
export WS="..."

1. Create a collection

collection_id is a UUID. Over HTTP you supply it; the SDKs generate one for you when omitted.

curl -X POST "$BASE/workspaces/$WS/collections" \
  -H "Authorization: Bearer $NEBULA_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"collection_id": "018f3c2a-6b41-7d8e-9a52-4c1e77b0d3aa", "name": "Notes"}'

2. Store a memory

curl -X POST "$BASE/collections/018f3c2a-6b41-7d8e-9a52-4c1e77b0d3aa/memories" \
  -H "Authorization: Bearer $NEBULA_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "memory_id": "018f3c2a-7e19-7f04-b3d6-2a9c5e81f742",
    "content": { "kind": "text", "text": "We decided to batch exports nightly to cut load." }
  }'

This returns 202 and an operation — not the finished memory.

3. Wait until it is searchable

Storing is asynchronous. Poll the operation until search_ready is true:

curl "$BASE/collections/018f3c2a-6b41-7d8e-9a52-4c1e77b0d3aa/operations/$OPERATION_ID" \
  -H "Authorization: Bearer $NEBULA_ACCESS_TOKEN"

For a long ingest, stream events_url instead — see Operations.

curl -X POST "$BASE/collections/018f3c2a-6b41-7d8e-9a52-4c1e77b0d3aa/memories/search" \
  -H "Authorization: Bearer $NEBULA_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"query": "how do we handle exports", "retrieval_id": "018f3c2a-8d55-7a21-88bf-6e0d43c9a115"}'

Each hit carries a summary, an excerpt, a citation and a relevance score. retrieval_id is a UUID identifying this retrieval — reuse it and a retry is the same retrieval rather than a second one. The SDKs generate it for you.

Next

Concepts for the model, Search for what comes back, or the TypeScript and Python clients.