Versioning — commits, branches, diff, merge: fork an idea-space, evolve it in isolation, fold it back. The part no flat memory store can do.
Memories — a flat, namespaced store for apps you build: scope rows to your own end-users, agents, and runs.
Plus ranked full-text search across all of it, and the owner's Self Map behind disclosure gates. The machine-readable spec lives at /api/v1/openapi.json.
Mint an API key at innernet.live/developers. Keys are shown once, stored hashed, carry read and/or write scopes, and can be revoked individually (up to 10 active keys).
# remember something about one of YOUR users
curl -X POST https://innernet.live/api/v1/memories \
-H "Authorization: Bearer innernet_..." \
-H "Content-Type: application/json" \
-d '{
"content": "Prefers concise answers; works in TypeScript.",
"user_id": "user_42",
"tags": ["preference"]
}'
# recall them later
curl "https://innernet.live/api/v1/memories?user_id=user_42&limit=20" \
-H "Authorization: Bearer innernet_..."
user_id, agent_id, and run_id are your namespaces — innernet keeps each end-user's memories separate under your account. metadata is free-form JSON; tags are filterable.
One query ranks across dimensions, nodes, captures, projects, and memories, returning highlighted snippets with kind + ref so you can fetch the source. Scope to one project with &project=slug.
This is the part no other memory API has. Every save and capture is a commit; a branch forks the whole context map so two versions of an idea can exist at once — then diff and merge when a direction wins.
bash
# history
curl https://innernet.live/api/v1/projects/my-product/commits \
-H "Authorization: Bearer innernet_..."
# fork the map at its current head
curl -X POST https://innernet.live/api/v1/projects/my-product/branches \
-H "Authorization: Bearer innernet_..." -H "Content-Type: application/json" \
-d '{"name": "pricing-experiment", "summary": "what if usage-based?"}'
# work on the branch — trunk untouched
curl -X PUT https://innernet.live/api/v1/projects/my-product/branches/pricing-experiment/dimensions/pricing \
-H "Authorization: Bearer innernet_..." -H "Content-Type: application/json" \
-d '{"content": "# Pricing\n\nUsage-based, $0.005/1k ops."}'
# what changed vs trunk?
curl https://innernet.live/api/v1/projects/my-product/branches/pricing-experiment/diff \
-H "Authorization: Bearer innernet_..."
# the experiment won — fold it back (records a merge commit, bumps head)
curl -X POST https://innernet.live/api/v1/projects/my-product/branches/pricing-experiment/merge \
-H "Authorization: Bearer innernet_..."
Not ready to decide? PATCH the branch with {"status": "parked"} — it's archived with its overlay intact, revivable any time. Merge semantics are branch-wins (same as the CLI); conflict-aware merge is on the roadmap.
The account owner's Self Map — atomic facts with disclosure classes — is readable and writable with the same key. private facts never cross the API, whatever ceiling you ask for.
bash
# facts up to a disclosure ceiling (self | trusted | work | public)
curl "https://innernet.live/api/v1/self/facts?max_disclosure=work" \
-H "Authorization: Bearer innernet_..."
# queue a fact-candidate (the consolidator distills it on next sync)
curl -X POST https://innernet.live/api/v1/self/capture \
-H "Authorization: Bearer innernet_..." -H "Content-Type: application/json" \
-d '{"content": "Prefers dark mode everywhere.", "dimension_hint": "preferences"}'
And any project load can carry the owner's context with it — GET /v1/projects/{slug}?include_self=1 appends a disclosure-gated personal_context slice, so an app you build knows how you work the moment it loads what you're working on.