API Reference

Sulcus exposes a REST API at https://api.sulcus.ca. All SDKs are thin HTTP wrappers over these endpoints.

Authentication

Every request requires a Bearer token in the Authorization header:

curl -H "Authorization: Bearer YOUR_API_KEY" https://api.sulcus.ca/api/v1/agent/nodes

Get your API key from the Sulcus Dashboard.


Memories

Store a Memory

POST /api/v1/agent/nodes
ParameterTypeRequiredDescription
labelstringMemory content (supports Markdown)
memory_typestringepisodic, semantic, preference, procedural, fact, moment
namespacestringOrganizational namespace (default: default)
is_pinnedbooleanPin to prevent decay (default: false)
decay_classstringvolatile, normal, persistent, permanent
min_heatnumberHeat floor (0.0–1.0)
initial_heatnumberStarting heat (default: 1.0)
key_pointsstring[]Key points for search indexing

Example:

{
  "label": "User prefers dark mode and monospace fonts",
  "memory_type": "preference",
  "is_pinned": true,
  "key_points": ["dark mode", "monospace", "UI preference"]
}

List Memories

GET /api/v1/agent/nodes?page=1&page_size=25
ParameterTypeDescription
pagenumberPage number (default: 1)
page_sizenumberItems per page (default: 25, max: 100)
memory_typestringFilter by type
namespacestringFilter by namespace
pinnedstringtrue or false
searchstringFull-text search
sortstringSort field (heat, updated_at, memory_type)
orderstringasc or desc

Get a Memory

GET /api/v1/agent/nodes/:id

Update a Memory

PATCH /api/v1/agent/nodes/:id
ParameterTypeDescription
labelstringUpdated content
memory_typestringUpdated type
is_pinnedbooleanPin/unpin
is_lockedbooleanLock/unlock (locked memories cannot be deleted by agents)
namespacestringMove to namespace
current_heatnumberSet heat directly

Delete a Memory

DELETE /api/v1/agent/nodes/:id

Note: Locked memories (is_locked: true) cannot be deleted. Unlock first via PATCH.


Search

Semantic Search

POST /api/v1/agent/search
{
  "query": "dark mode preferences",
  "limit": 10
}

Returns memories ranked by semantic similarity, weighted by heat.


Graph Visualization

Get Memory Graph

GET /api/v1/admin/visualize/graph?limit=200&namespace=daedalus
ParameterTypeDescription
limitnumberMax nodes to return (default: 200, sorted by heat DESC)
namespacestringFilter to specific namespace

Returns { nodes, links, total_nodes } — edges are filtered to only include edges between returned nodes.


Thermodynamic Config

Get Config

GET /api/v1/settings/thermo

Update Config

PATCH /api/v1/settings/thermo

Configure half-lives, decay classes, resonance spread, active index limits, and consolidation settings per tenant.


Feedback

Memory Feedback

POST /api/v1/feedback
{
  "node_id": "uuid-here",
  "signal": "relevant"
}

Signals: relevant (boosts heat + stability), outdated (deprioritizes), wrong (flags for review).


Analytics

Recall Analytics

GET /api/v1/admin/recall-analytics

Returns recall patterns, hit rates, and tuning suggestions.

Dashboard Stats

GET /api/v1/admin/dashboard

Returns node counts, heat distribution, type distribution, namespace breakdown, and recent activity.

Usage

GET /api/v1/admin/usage

Returns sync requests, nodes added, and latency metrics for the current billing period.


Triggers

Triggers are reactive rules that fire when memory events occur. See the Triggers Guide for full documentation.

List Triggers

GET /api/v1/triggers

Returns all triggers for the authenticated tenant.

Create Trigger

POST /api/v1/triggers
ParameterTypeRequiredDescription
namestringHuman-readable name
eventstringon_store, on_recall, on_decay, on_boost, on_relate, on_threshold
actionstringnotify, boost, pin, tag, deprecate, webhook
action_configobjectAction-specific config (e.g., {"strength": 0.3} for boost, {"url": "..."} for webhook)
namespacestringScope trigger to a namespace
filter_memory_typestringOnly fire for this memory type
filter_namespacestringOnly fire for memories in this namespace
filter_label_patternstringCase-insensitive label match
filter_heat_belownumberOnly fire when heat is below this value
filter_heat_abovenumberOnly fire when heat is above this value
max_firesintegerStop after N firings (null = unlimited)
cooldown_secondsintegerMinimum seconds between firings (default: 0)

Update Trigger

PATCH /api/v1/triggers/:id

Supports partial updates: enabled, name, action_config.

Delete Trigger

DELETE /api/v1/triggers/:id

Returns 204 No Content on success.

Trigger History

GET /api/v1/triggers/history?limit=50

Returns recent trigger firings with event, action, node, and result details.

Events

EventFires when...
on_storeA new memory is created
on_recallA memory is returned by search
on_decayA memory's heat decays below threshold during background tick
on_boostA memory's heat is manually increased
on_relateA new edge is created between memories
on_thresholdA memory crosses a heat threshold during background tick

Actions

ActionEffect
notifyReturns a notification message (interpolates {node_id}, {label}, {heat}, {namespace}, {memory_type})
boostIncreases heat by action_config.strength (default: 0.3)
pinPins the memory (immune to decay)
tagAppends [label] tag to memory text
deprecateHalves heat and sets decay_class to volatile
webhookPOSTs trigger context to action_config.url

Rate Limits

TierRequests/minNodesSync
Free601,000Cloud only
Cortex30050,000Cloud + local
EnterpriseUnlimitedUnlimitedCloud + local + priority

Rate-limited responses return 429 Too Many Requests with a Retry-After header.