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.
4. Search
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.