agenthub · transform.extract
Pull one field out of every item in a list, into a flat list of values. A pure extractor — it does not match, compare or branch.
Why the node earns its place
Given a list somewhere in the input and a path into each item, it returns just that field's values: every row's phone number, every ticket's id. Nothing in it knows about Notion or phones — the paths are configuration, so the same node reads any JSON list.
Whatever you do with the list next is a separate node, deliberately. That is what keeps it composable rather than becoming a membership test with opinions.
How it works at run time
list_path to the array. Empty means the input is already the list.field_path out of each item; empty keeps the whole item.compact is on, de-duplicate when unique is on, and apply normalize per value.output.values ["+9199…", "+9198…", …] output.count how many survived compacting
What you wire
Configuration
| Key | Type | Default & options | What it does |
|---|---|---|---|
| list_path * | string | — | Dotted path to the array, e.g. 'result.body.results'. Empty means the input `data` is already the list. After a Test Run you can pick this from the observed shape. |
| field_path | string | — | Dotted path into each item to pull, e.g. 'properties.Phone.phone_number' (or 'properties.Phone.rich_text[0].plain_text' for a text column). Empty keeps the whole item. |
| compact | boolean | default true | Drop null / empty results (e.g. rows with no phone). |
| unique | boolean | default false | De-duplicate the list (keeps first-seen order). |
| normalize | string | default "none" none · trim · lower · phone10 | Optional per-value normalize. phone10 = last 10 digits (format-agnostic, so +91/0-prefix/spaces all collapse). |
What usually goes wrong
Watch for this
If you need anything about the matched row rather than a bag of values, this is the wrong node — use Find Row. Reaching for Extract and then a second comparison is the long way round to what Find Row does in one step.
Behaviour & provenance