Portal Community

Ephemeral vs. Pinned

AttributeEphemeral OutputPinned Data
LifetimeSingle execution runPersists across runs until explicitly cleared
StorageIn-memory (executionStore.nodeOutputs)Database (Process_NodePinnedData table)
Scope(executionId, nodeId)(processId, nodeId) — shared across all runs of the same workflow
How to setFirst arg of NodeExecutionResult.Success(output)Second arg of NodeExecutionResult.Success(output, pinnedData)
How to readctx.ExecutionMemory.GetNodeOutput<T>(nodeId)ctx.ExecutionMemory.GetPinnedData(nodeId)
Visible in Node InspectorOutput Data sectionPinned Data section (collapsible, only if non-null)

When to Use Pinned Data

Use pinned data when a node produces output that should survive between runs and be accessible to future executions of the same workflow.

ScenarioUse Pinned Data?
Fetch and pass a value to the next node in this runNo — ephemeral output is sufficient
Cache an API response to avoid re-fetching in future runsYes
Store AI agent conversation history across workflow triggersYes
Accumulate a running total that persists across invocationsYes
Intermediate calculation used only within one runNo — ephemeral output is sufficient

How Pinned Data Flows

Executor calls NodeExecutionResult.Success(output, pinnedData)
BaseNodeExecutor detects non-null pinnedData and calls PinnedDataService.SaveAsync(processId, nodeId, pinnedData)
Saved to Process_NodePinnedData table (upsert by processId + nodeId)
Node Inspector fetches pinned data from API and displays in Pinned Data section

Guide Contents

PageWhat You Will Learn
Returning Pinned DataThe NodeExecutionResult.Success(output, pinnedData) overload and the PinnedDataObject type
Pinned Data StorageProcess_NodePinnedData table schema and upsert behavior
Reading Pinned Datactx.ExecutionMemory.GetPinnedData(nodeId) — cross-run access pattern
Node Inspector DisplayHow the PinnedData section renders in the Observer Panel
Clearing Pinned DataExplicit clear, TTL expiry, and node-removal cascade
Use CasesAI memory, accumulation, caching patterns
Security ConsiderationsTenant isolation, PII guidance, encryption at rest
Pinned data is NOT part of ExecutionMemory.nodeOutputs. The ephemeral output store and the pinned data store are completely separate systems. Reading a node's pinned data uses a distinct API call (GetPinnedData), not the same lookup as ephemeral outputs (GetNodeOutput).