AltScore
Nodes

Packages

The Packages node works with packages: the JSON documents borrower-central keeps per customer and that scorecards, rules and workflows read. The node has two modes in the same panel. Store builds a package from flow variables and saves it under a key you name. Read looks up packages already stored, filtered by label, alias and customer, and leaves the result in a variable.

The node sends no message. It does its work silently and continues through the normal output, or takes the error output when something in the configuration could not be resolved.

When to Use It

To hand data to a workflow or a scorecard. What the customer answered in the conversation becomes a package of that customer, and a workflow reads it by alias like any other source.

To pick up what you already knew. A returning customer already answered things in an earlier conversation. In Read mode you fetch the latest package and skip asking again.

To review a history. With "List of packages", the node brings the last N packages of a customer ordered by date, and a Python Executor or a Set Variable walks them.

Store Mode

OptionDescription
Package keyUpper case with underscores (GUARANTOR_DATA). The engine prefixes it with FLOW_ and the panel shows that final key. The prefix cannot be removed: it keeps a hand-made package from landing on an altdata source and feeding a scorecard
Existing packagesThe tenant's FLOW_ sources; picking one writes the key for you
LabelHuman-readable name of the package. Accepts {{variables}}: Income of {{name}}
AliasTells apart several packages with the same key for the same customer. Accepts {{variables}}. Empty falls back to the label
JSON fieldsOne field per row: the name it gets in the JSON and the flow variable that brings its value. Each value keeps the variable's declared type: a number is stored as a number
Whole objectAn object or array variable that already holds the whole content, typically built by a Python Executor. An array is stored under the items field

If you fill both, the whole object is the base and the fields overwrite it one by one. The metadata field is written by the node with the package's provenance (conversation, customer, node, label, date), so a field with that name is dropped with a notice.

A {{variable}} in the label or the alias that no node wrote before is stored as written, as text, and the node leaves a warning notice naming it. The package is still stored.

Read Mode

OptionDescription
Key being searchedOptional. With a value, only packages of that FLOW_ source are returned. Empty returns from any package stored by a flow
LabelFilters by exact label. Accepts {{variables}}. Empty does not filter
AliasFilters by exact alias. Accepts {{variables}}. Empty does not filter
CustomerFilters by customer id. Comes as {{borrower_id}}, the conversation's customer. Empty returns packages of any customer in the tenant
Order by / DirectionCreation date, label or alias, ascending or descending. Newest first by default
What it returnsList of packages returns up to the count; Only the first one takes the first package in that order and stores it as an object
At most how manyBetween 1 and 50. Applies only when the result is a list
Start at positionHow many packages to skip, in the chosen order, before the first one returned. A number or a {{variable}}. Empty means 0. Shown only when the result is a list
Where the result goesA flow variable of the type the node returns: array for the list, object for only the first one. Changing the type clears the selection

Packages marked stale are not returned.

What the variable holds

Each package carries its metadata and its content:

  • id, label, alias, sourceId, borrowerId, createdAt, tags, contentType
  • content: the stored JSON. If the content file no longer exists, content is null and the node leaves a notice

With "Only the first one" the variable holds the most recent package, or null when there is none. With the list it holds an array, empty when nothing matched. In a message it is used like any object: {{package.content.income}}.

Paging through a long list

Start at position turns one read into a page of a longer list. With position 0 the read returns the first packages in the chosen order; with position 9 it skips the first nine and starts at the tenth. The field accepts a number or a variable, such as {{offset}}. Whatever does not come out as a whole number of zero or more (an empty field, a variable no node wrote, text, a negative number) counts as 0, so the read falls back to the first page instead of failing. A value that renders with decimals, like 9.0, is not a whole number either and also reads from the start: keep the variable a whole number.

The usual loop pages a list shown with Interactive Options in list mode, whose Ver más row appears when it receives more than ten elements:

  1. A Set Variable sets offset to 0 before the read.
  2. Packages reads in list mode, At most how many 11 or more, Start at position {{offset}}.
  3. Interactive Options shows the result. With more than ten elements it shows nine rows and Ver más.
  4. From the See more output, add 9 to offset and goes back to the read. With a Formula, write to_int(add({{offset}}, 9)): the Formula's arithmetic returns decimals, and without to_int the position would be 9.0 and the read would start over.

Pages advance by nine because that is how many rows the list shows when there are more; the tenth element is the first of the next page. The limit has to be above ten because a read of exactly ten fills the list without a Ver más row, and the next page would never be offered.

When a filter cannot be resolved

A filter with a {{variable}} that does not exist in the conversation does not degrade to "no filter". If {{borrower_id}} is empty because the customer has not identified themselves yet, the node reads nothing, leaves a warning notice and takes the error output. Reading every customer's packages because a filter went empty by accident is exactly what this prevents.

Output Connectors

ConnectorWhen
NormalThe package was stored, or the read finished, even with no results
ErrorInvalid key, no content configured, no destination variable, a filter with a variable that could not be resolved, or the store refused the label or the alias

Zero results in Read mode is not an error: the variable is left empty and the flow continues. To branch, follow the node with a Conditional that compares the variable with empty.

Keep in Mind

  • Every run in Store mode creates a new package. Passing through the node again does not update the previous one; readers take the most recent by date.
  • Signed file URLs inside the content are stored as text and expire after an hour. The node also stores the file reference, and the packages API re-signs it on read.
  • Read mode only reaches packages stored by flows (FLOW_ prefix). Altdata sources are still queried by the workflow.

On this page