Notion title (rich_text array) resolves to empty/undefined when mapped into HTTP module body

:bullseye: What is your goal?

I’m building a two-way sync between Notion and a task app’s REST API using two HTTP modules. Everything works except mapping the Notion title (a ‎Name/title property) into the outgoing HTTP request body — it always resolves to empty, causing the API to reject the request with a validation error (“title: expected string, received undefined” / “Too small: expected string to have >=1 characters”).

Scenario structure:

  1. Notion → Search Objects (Data Source Items) — finds the row (module [2])

  2. HTTP → Make a request (POST) — creates the item in the external API

:thinking: What is the problem & what have you tried?

The problem:

The Notion Search module’s output clearly contains the title. When I inspect its output, I can see:

Properties Value → Task → 1 → Plain Text: "My task title"

So the data is definitely there. But when I map it into the HTTP module’s JSON body ‎title field, it comes through empty every time.

The mapping panel shows the Task title as a split pill: ‎Task[ + ‎]: Plain Text (empty brackets, no index), and I cannot type an index between the two pill segments — the editor won’t let me insert into the gap.

What I’ve tried (all fail with empty/undefined title):

  • The default pill ‎{{2.properties_value.Task[].plain_text}} → resolves empty

  • Typing ‎{{2.properties_value.Task[1].plain_text}} → editor splits ‎[1], orphans the ‎1

  • Dot notation ‎{{2.properties_value.Task.1.plain_text}} → empty

  • {{first(2.properties_value.Task).plain_text}} → error: “‘2.properties_value.Task’ is not a valid array” (typed path treated as string)

  • {{map(2.properties_value.Task; "plain_text")}} → empty

  • A “Set variable” module to capture the title first → variable comes out empty

  • Switching Body input method to “Data structure” and mapping title into its own field → still empty/undefined

  • Confirmed the Notion Search module IS module 2 and DOES return 1 bundle with the title present

Questions:

  1. What is the correct reference to extract ‎plain_text from a Notion title (rich_text array) inside Make’s HTTP module body?

  2. Is there a reliable way to get the flat title string — e.g., does “Database Items (Legacy)” search mode expose a flat ‎Name field instead of the array?

Any exact syntax that works would be hugely appreciated. Thank you!

Hey there,

can you show some screenshots of the output and the mapping?

Two of the things on your list are already correct and each is one detail away from working.

map() returns an array, not a string. So {{map(2.properties_value.Task; “plain_text”)}} really is finding your title, then handing the HTTP body an array where a string is expected, and that arrives as empty. Wrap it: {{join(map(2.properties_value.Task; “plain_text”); “”)}}. That is very likely your whole fix.

The typed attempts failed for a different reason worth knowing, because it will save you time on the next mapping too. When you type a path by hand into the formula box, Make treats it as a literal string rather than a reference, which is exactly why first() told you it was not a valid array. References only work when inserted as pills. To reach an index without fighting the editor, use get(), which takes the path as text: {{get(2.properties_value.Task; “1.plain_text”)}}.

The empty brackets in the pill are normal, by the way. Make shows Task[] when it cannot know the index at design time, and it resolves at runtime. It is not a sign that the path is wrong.

Hello,

Yep, that’s a bit tricky – Notion’s response mixes arrays and collections, which makes direct mapping a little more involved.

Try this function:

{{get(map(toArray(2.properties_value); "value"; "key"; "Task"); "1.1.plain_text")}}


Disclaimer: I compared the Get a Data Source Item module’s output against Notion’s API documentation, and it looks like Make doesn’t transform the data – properties_value should be structurally identical to a direct API call.
If this doesn’t work, let me know and I’ll dig into the HTTP approach instead. I just wanted to save myself some time and avoid generating API keys and setting up a connection. Thanks for understanding.

Have a nice day,
Michal