Getting "Bad request - Error parsing JSON body" in HTTP Request node (typeVersion 4.1) when POSTing to Notion API with n8n expressions - any ideas?

Hello everyone,

I’m experiencing a persistent issue with an n8n workflow for user registration that uses Notion as a database. The workflow consistently fails at the **“Create Coach in Notion”** node with the error visible in the attached screenshots.

## :red_circle: Problem Description

**Error**: `Bad request - please check your parameters`

**Detail**: `Error parsing JSON body`

**Node**: HTTP Request to `https://api.notion.com/v1/pages\` (POST)

The workflow successfully executes all previous nodes:

- :white_check_mark: User input validation

- :white_check_mark: Check existing email in Notion database

  • :white_check_mark: Password hashing and ID generation

But it systematically fails when attempting to create the record in the Notion database.

## :hammer_and_wrench: HTTP Request Node Configuration

**Method**: POST

**URL**: `https://api.notion.com/v1/pages\`

**Authentication**: Bearer Token (NOTION_API_KEY correctly configured)

**Headers**: ``` Authorization: Bearer {{$env.NOTION_API_KEY}} Notion-Version: 2022-06-28 Content-Type: application/json

`` **JSON Body**: ```json ={ “parent”: { “database_id”: “{{$env.NOTION_COACHES_DB_ID}}” }, “properties”: { “Coach_ID”: { “title”: [{“text”: {“content”: “{{$json.coach_id}}”}}] }, “Nome”: { “rich_text”: [{“text”: {“content”: “{{$json.nome}}”}}] }, “Cognome”: { “rich_text”: [{“text”: {“content”: “{{$json.cognome}}”}}] }, “Email”: { “email”: “{{$json.email}}” }, “Telefono”: { “number”: {{$json.telefono_number}} }, “Password_Hash”: { “rich_text”: [{“text”: {“content”: “{{$json.password_hash}}”}}] }, “Sport”: { “select”: {“name”: “{{$json.sport}}”} }, “Categoria”: { “rich_text”: [{“text”: {“content”: “{{$json.categoria}}”}}] }, “Club”: { “rich_text”: [{“text”: {“content”: “{{$json.club}}”}}] }, “Plan”: { “select”: {“name”: “FREE”} }, “Status”: { “select”: {“name”: “active”} }, “Privacy_Accepted”: { “rich_text”: [{“text”: {“content”: “TRUE”}}] }, “Marketing_Accepted”: { “rich_text”: [{“text”: {“content”: “{{$json.marketing_text}}”}}] }, “Created_At”: { “date”: {“start”: “{{$json.created_at}}”} } } } ```

## :bar_chart: Input Data (from previous node)

The node correctly receives this data from the “Hash Password & Generate ID” node:

```json { “nome”: “Paolo”, “cognome”: “…”, “email”: “…”, “coach_id”: “coach_1763213768318_i3xlpn6”, “telefono_number”: 3311349468, “password_hash”: “hash_…”, “created_at”: “2025-11-15T…”, “marketing_text”: “TRUE” } ```

## :red_question_mark: What I’ve Already Checked

  • :white_check_mark: Environment variables are correctly configured

  • :white_check_mark: The Notion database exists and has all defined properties

- :white_check_mark: The Notion integration has permissions on the database

  • :white_check_mark: The Notion API Key is valid

- :white_check_mark: Input data to the node is correct and complete

- :white_check_mark: The `Notion-Version: 2022-06-28` header is present

- :white_check_mark: The JSON body is set as “Expression” with `=` at the beginning

## :thinking: Questions

1. **Is the JSON body syntax correct?** Could there be issues with curly braces in n8n expressions?

2. **Could the problem be related to the `{{$json.field}}` expressions?** Should I use a different syntax?

3. **Is there a way to see the actual JSON sent to Notion** before the parsing error?

4. **Could the typeVersion 4.1 of the httpRequest node be causing issues** with this type of JSON body? ## :wrench: n8n Version n8n running via Docker (latest version)

-– Has anyone encountered a similar error? Any suggestions are welcome!

:folded_hands: Thanks in advance for your help.

Looking at your configuration, I can see an issue. Hope it helps. The problem is with how you’re constructing the JSON body in n8n. You’re mixing string interpolation syntax with JSON structure incorrectly. In your JSON body, you’re using {{$json.field}} syntax inside a JSON string, which won’t work properly. When you use = at the beginning to make it an expression, you need to use proper JavaScript/n8n expression syntax.
Replace your current JSON body with this corrected version:
={
“parent”: {
“database_id”: $env.NOTION_COACHES_DB_ID
},
“properties”: {
“Coach_ID”: {
“title”: [{“text”: {“content”: $json.coach_id}}]
},
“Nome”: {
“rich_text”: [{“text”: {“content”: $json.nome}}]
},
“Cognome”: {
“rich_text”: [{“text”: {“content”: $json.cognome}}]
},
“Email”: {
“email”: $json.email
},
“Telefono”: {
“number”: $json.telefono_number
},
“Password_Hash”: {
“rich_text”: [{“text”: {“content”: $json.password_hash}}]
},
“Sport”: {
“select”: {“name”: $json.sport}
},
“Categoria”: {
“rich_text”: [{“text”: {“content”: $json.categoria}}]
},
“Club”: {
“rich_text”: [{“text”: {“content”: $json.club}}]
},
“Plan”: {
“select”: {“name”: “FREE”}
},
“Status”: {
“select”: {“name”: “active”}
},
“Privacy_Accepted”: {
“rich_text”: [{“text”: {“content”: “TRUE”}}]
},
“Marketing_Accepted”: {
“rich_text”: [{“text”: {“content”: $json.marketing_text}}]
},
“Created_At”: {
“date”: {“start”: $json.created_at}
}
}
}