Solaris AISolaris AI FlowDocs
Node ReferenceUtility

Transform

Reshape upstream data with visual pipeline steps or a template expression.

View as Markdown

The Transform node reshapes data from earlier workflow nodes and passes the result downstream. Use it when you need to extract fields, clean up API responses, filter or sort lists, keep only the fields another node needs, or prepare a payload for AI, Telegram, Discord, trading, or condition nodes.

Transform has two modes:

  • Pipeline - the recommended visual editor. Pick an input and add ordered steps such as Filter, Sort, Slice, Project, Computed field, Literal field, and Age since.
  • Template - a raw template expression for simple one-off reshaping or older workflows.

Configuration

FieldTypeRequiredDescription
Node LabelstringNoDisplay name shown on the canvas
Name this resultstringRecommendedStable variable name for downstream nodes, for example topTokens. Downstream nodes read {topTokens.data}
ModePipeline or TemplateYesChooses which saved draft runs. Switching modes keeps the other draft until you clear it
Inputtemplate pathPipeline modeField to start from, for example {pumpfunResponse.data}. Leave blank to use all upstream outputs
StepslistPipeline modeOrdered visual operations that transform the input
Template ExpressionstringTemplate modeRaw template string, optionally JSON, evaluated against upstream outputs

Pipeline mode

Pipeline mode starts with the Input value, then runs each step in order. If Input is blank, the pipeline starts with the full upstream metadata object. If Input is {pumpfunResponse.data}, the pipeline starts with that field's value.

Most list-oriented steps expect the current value to be an array. A common pipeline is:

Input: {pumpfunResponse.data}
1. Filter
2. Sort
3. Slice
4. Project

Available steps

StepUse it toNotes
FilterKeep array items that match rulesSupports AND/OR, nested groups, numeric comparison, text matching, regex, membership, existence checks, empty checks, and age comparisons
SortReorder an array by one or more fieldsEarlier sort keys take precedence. Missing values sort last
SliceKeep first N, last N, or skip then takeUse after Sort to keep top results
ProjectKeep, drop, or rename fieldsCan apply to the root object or to each item in an array
Computed fieldAdd a field from a template expressionA lone {path} keeps the original value type; mixed text becomes a string
Literal fieldAdd a fixed JSON valueSupports string, number, boolean, null, array, or object values
Age sinceAdd elapsed time from a timestampAccepts epoch milliseconds, epoch seconds, or ISO date strings; output unit can be seconds, minutes, hours, or days

Filter operators

Filter rules can use:

  • Comparison: =, , <, , >,
  • Text: contains, starts with, ends with, matches regex
  • Membership: in list, not in list
  • Existence: exists, is empty
  • Age: younger or older than N seconds, minutes, hours, or days

Use nested groups for logic such as:

(status = live AND bondingProgressPct >= 80)
OR
(source in ["pumpfun", "birdeye"] AND age_hours < 6)

Example: select top Pump.fun tokens

Workflow:

Manual Trigger → Pump.fun → Transform → Telegram

Set the Pump.fun node result name to pumpfunResponse. In the Transform node:

  1. Set Name this result to topTokens
  2. Choose Pipeline mode
  3. Set Input to:
{pumpfunResponse.data}

Add these steps:

StepConfiguration
FilterbondingProgressPct >= 80
SortbondingProgressPct descending
SliceFirst 5 items
ProjectApply to each item. Keep mint, name, symbol, priceSol, bondingProgressPct
Computed fieldApply to each item. Target field summary, expression {symbol}: {bondingProgressPct}% bonded

A downstream Telegram node can then use:

Top token: {topTokens.data[0].symbol}
Mint: {topTokens.data[0].mint}
Progress: {topTokens.data[0].bondingProgressPct}%
Summary: {topTokens.data[0].summary}

Template mode

Template mode evaluates a raw expression against upstream node outputs. Use it for simple extraction or small string/JSON payloads.

Extract one field:

{birdeyeResponse.data.value}

Build a message string:

{jupiterResponse.data.inputMint} → {jupiterResponse.data.outputMint}: {jupiterResponse.data.outAmount}

Build a JSON object:

{
  "symbol": "{pumpfunResponse.data[0].symbol}",
  "mint": "{pumpfunResponse.data[0].mint}",
  "progress": "{pumpfunResponse.data[0].bondingProgressPct}"
}

If the entire expression is a single {path} that resolves to an array or object, Transform returns the native value directly - no String(value) coercion that would otherwise turn an array into "[object Object],...". For mixed templates and primitive paths, the rendered template is parsed as JSON when it's valid (so "42" becomes the number 42); otherwise it stays a string.

Output

A successful Transform node returns:

{
  "success": true,
  "data": "<transformed result>"
}

Downstream nodes read the transformed value under .data.

If Name this result is topTokens:

{topTokens.data}
{topTokens.data[0].symbol}

Set a result name whenever another node needs to reference this Transform. If no friendly name is set, use the variable hints in downstream text fields to insert the available node-id path.

Previewing

Transform settings use the shared node-settings layout:

  • Input shows the upstream sample available to the Transform. The default Variables view is best for finding fields; switch to JSON, Schema, or Table for exact inspection.
  • Parameters contains the Transform mode, input field, and pipeline/template editor.
  • Output shows a Live preview for the current draft and a Last tab for the most recent persisted run output.

When upstream sample data is available, the Live preview runs the same pipeline/template interpreter used by production workflow runs, so the preview should match runtime behavior. It updates as you edit the Transform draft.

If there is no sample yet, use the Input pane button to execute previous nodes. This runs the nodes before the Transform and uses their latest outputs as preview data. Preview runs count as one monthly run and are hidden from normal execution history. If upstream nodes can send messages, transfer funds, trade, or broadcast transactions, the editor asks for confirmation before firing them.

Clicking values in the Input pane inserts template paths into Transform fields when possible. Use {json ...} when the value is an object or array and the receiving field expects valid JSON text.

Limits and safety

  • Pipeline output is capped at 5 MB.
  • Array-processing steps are capped at 100,000 items.
  • Field paths use dot notation such as token.holders.count.
  • Field paths cannot be empty, start/end with ., contain doubled dots, or use reserved prototype segments such as __proto__, constructor, or prototype.
  • Filter, Sort, Slice, and per-item Project/Computed/Literal/Age steps require the current pipeline value to be an array.
  • Literal field values must be JSON-serializable.
  • Age filters and Age since read the current time; other pipeline steps are deterministic for the same input.

When to use Transform vs Code

Use Transform when your data change fits the visual steps: filter, sort, slice, project, rename, add fixed fields, add template-derived fields, or compute ages.

Use Code when you need arbitrary JavaScript, such as custom math, grouping, complex scoring, reducing an array into a summary object, or handling inconsistent data shapes that do not fit the visual pipeline.

Next steps

  • Code - run custom JavaScript when the visual pipeline is not expressive enough
  • Configuring Nodes - input/output panes and variables
  • Filter - conditionally pass or block a workflow path
  • Condition - multi-path branching

On this page