Cloudfare blocking?

Describe the problem/error/question

I have 3 workflows exposed as webhooks (/webhook/venue-search, /webhook/venue-details, /webhook/venue-gmail-draft) that are called by a ChatGPT Custom GPT Action (OpenAPI 3.1 schema, server url n8n.io - Workflow Automation).
All 3 webhooks work perfectly when called directly — I’ve verified this repeatedly with curl (both /webhook-test/… and production /webhook/… URLs), every time getting a clean HTTP 200 with the correct JSON payload, with normal Cloudflare response headers (no challenge page, CF-Cache-Status: DYNAMIC).
However, when the same requests are made by ChatGPT’s Custom GPT Action infrastructure (the AI model calling the action server-to-server, not the user’s browser), every single call fails with an empty, generic error, and no execution is ever logged in n8n for that call — meaning the request appears to never reach the workflow at all. This happens consistently across all 3 endpoints, and across two separate Custom GPTs (different ChatGPT accounts) pointing at the identical schema/URLs. One of the two GPTs briefly appeared to work after I deleted and re-added the Action, but it started failing again shortly after — so this doesn’t look like a one-time config glitch on the ChatGPT side.
Since direct curl calls succeed 100% of the time but ChatGPT’s server-to-server calls fail 100% of the time with zero trace in n8n’s execution log, I suspect Cloudflare (which fronts the n8n Cloud domain, confirmed via Server: cloudflare response header) is blocking or challenging requests specifically from OpenAI’s outbound IP ranges or user-agent, before they ever reach the n8n application layer.
Could you check whether there’s bot-protection / WAF-level filtering in front of hmnto.app.n8n.cloud that might be rejecting requests from OpenAI’s Action-calling infrastructure? Is there any way to allowlist this, or view edge-level (pre-application) request logs to confirm requests are being dropped at that layer rather than reaching the workflow and failing silently?

What is the error message (if any)?

On the ChatGPT side, the error surfaced to the model is:

ClientResponseError

Encountered exception: <class 'aiohttp.client_exceptions.ClientResponseError'>.

with an empty response body — no status code or error detail is available from the ChatGPT side. This is consistent across all 3 endpoints (venue-search, venue-details, venue-gmail-draft).

On the n8n side: no error at all, because no execution is ever recorded for these failed calls — the “Executions” tab shows nothing for the time window when ChatGPT attempted the call, even though the workflow is Active and reachable (confirmed by successful curl calls at/around the same time, sub-minute apart).

Please share your workflow

Three separate workflows, all triggered by a webhook, reading the same Google Sheet, then responding. Full JSON below (credential IDs redacted/placeholder — not real secrets).

Workflow 1 — Venue Finder - Search Venues (/webhook/venue-search)

{
  "name": "Venue Finder - Search Venues",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "venue-search",
        "responseMode": "responseNode",
        "options": {}
      },
      "id": "1a1a1a1a-0001-4000-8000-000000000001",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [240, 300],
      "webhookId": "venue-search"
    },
    {
      "parameters": {
        "resource": "sheet",
        "operation": "read",
        "documentId": { "__rl": true, "value": "1y__ABJYPR2r-tN2BHCTFdKU12zujIhD6pBMYIIYdMEU", "mode": "id" },
        "sheetName": { "__rl": true, "value": "gid=0", "mode": "list", "cachedResultName": "Venue options" },
        "options": {}
      },
      "id": "1a1a1a1a-0002-4000-8000-000000000002",
      "name": "Read Venue Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [460, 300],
      "credentials": {
        "googleSheetsOAuth2Api": { "id": "REPLACE_WITH_YOUR_CREDENTIAL_ID", "name": "Google Sheets account" }
      }
    },
    {
      "parameters": {
        "jsCode": "// Filters active venues by guests/area/openAir/budget/type from the request body. Full logic omitted here for brevity — happy to share in full if relevant, but the error occurs before this node ever executes."
      },
      "id": "1a1a1a1a-0003-4000-8000-000000000003",
      "name": "Filter",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [680, 300]
    },
    {
      "parameters": { "respondWith": "allIncomingItems", "options": {} },
      "id": "1a1a1a1a-0004-4000-8000-000000000004",
      "name": "Respond to Webhook",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [900, 300]
    }
  ],
  "connections": {
    "Webhook": { "main": [[{ "node": "Read Venue Sheet", "type": "main", "index": 0 }]] },
    "Read Venue Sheet": { "main": [[{ "node": "Filter", "type": "main", "index": 0 }]] },
    "Filter": { "main": [[{ "node": "Respond to Webhook", "type": "main", "index": 0 }]] }
  },
  "settings": { "executionOrder": "v1" }
}
Workflow 2 — Venue Finder - Get Venue Details (/webhook/venue-details)

{
  "name": "Venue Finder - Get Venue Details",
  "nodes": [
    {
      "parameters": { "httpMethod": "POST", "path": "venue-details", "responseMode": "responseNode", "options": {} },
      "id": "3c3c3c3c-0001-4000-8000-000000000001",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [240, 300],
      "webhookId": "venue-details"
    },
    {
      "parameters": {
        "resource": "sheet",
        "operation": "read",
        "documentId": { "__rl": true, "value": "1y__ABJYPR2r-tN2BHCTFdKU12zujIhD6pBMYIIYdMEU", "mode": "id" },
        "sheetName": { "__rl": true, "value": "gid=0", "mode": "list", "cachedResultName": "Venue options" },
        "options": {}
      },
      "id": "3c3c3c3c-0002-4000-8000-000000000002",
      "name": "Read Venue Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [460, 300],
      "credentials": {
        "googleSheetsOAuth2Api": { "id": "REPLACE_WITH_YOUR_CREDENTIAL_ID", "name": "Google Sheets account" }
      }
    },
    {
      "parameters": {
        "jsCode": "function norm(s) { return String(s == null ? '' : s).trim().toLowerCase(); }\nfunction toBool(v) { return ['true','si','yes','y','1','x','checked','verdadero'].includes(norm(v)); }\n\nconst body = $('Webhook').first().json.body || {};\nconst requestedIds = (Array.isArray(body.venueIds) ? body.venueIds : []).map(id => norm(id)).filter(Boolean);\n\nconst rows = items.map(i => i.json);\n\nconst venues = rows\n  .filter(r => toBool(r['Active']))\n  .filter(r => requestedIds.includes(norm(r['ID'])));\n\nreturn venues.map(r => ({ json: r }));"
      },
      "id": "3c3c3c3c-0003-4000-8000-000000000003",
      "name": "Select Requested Venues",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [680, 300]
    },
    {
      "parameters": { "respondWith": "allIncomingItems", "options": {} },
      "id": "3c3c3c3c-0004-4000-8000-000000000004",
      "name": "Respond to Webhook",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [900, 300]
    }
  ],
  "connections": {
    "Webhook": { "main": [[{ "node": "Read Venue Sheet", "type": "main", "index": 0 }]] },
    "Read Venue Sheet": { "main": [[{ "node": "Select Requested Venues", "type": "main", "index": 0 }]] },
    "Select Requested Venues": { "main": [[{ "node": "Respond to Webhook", "type": "main", "index": 0 }]] }
  },
  "settings": { "executionOrder": "v1" }
}
Workflow 3 — Venue Finder - Create Gmail Draft (/webhook/venue-gmail-draft)

{
  "name": "Venue Finder - Create Gmail Draft",
  "nodes": [
    {
      "parameters": { "httpMethod": "POST", "path": "venue-gmail-draft", "responseMode": "responseNode", "options": {} },
      "id": "2b2b2b2b-0001-4000-8000-000000000001",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [240, 300],
      "webhookId": "venue-gmail-draft"
    },
    {
      "parameters": {
        "resource": "sheet",
        "operation": "read",
        "documentId": { "__rl": true, "value": "1y__ABJYPR2r-tN2BHCTFdKU12zujIhD6pBMYIIYdMEU", "mode": "id" },
        "sheetName": { "__rl": true, "value": "gid=0", "mode": "list", "cachedResultName": "Venue options" },
        "filtersUI": { "values": [{ "lookupColumn": "ID", "lookupValue": "={{ $('Webhook').first().json.body.venueId }}" }] },
        "options": {}
      },
      "id": "2b2b2b2b-0002-4000-8000-000000000002",
      "name": "Look Up Venue",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [460, 300],
      "credentials": {
        "googleSheetsOAuth2Api": { "id": "REPLACE_WITH_YOUR_CREDENTIAL_ID", "name": "Google Sheets account" }
      }
    },
    {
      "parameters": {
        "jsCode": "// Builds a Spanish enquiry (email or WhatsApp message) from venue row + requirements. Full logic omitted here for brevity — happy to share in full if relevant, but the error occurs before this node ever executes."
      },
      "id": "2b2b2b2b-0003-4000-8000-000000000003",
      "name": "Build Email",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [680, 300]
    },
    {
      "parameters": {
        "conditions": {
          "options": { "caseSensitive": false, "leftValue": "", "typeValidation": "loose" },
          "conditions": [{ "leftValue": "={{ $json.contactMethod }}", "rightValue": "email", "operator": { "type": "string", "operation": "equals" } }],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "2b2b2b2b-0009-4000-8000-000000000009",
      "name": "Check Contact Method",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [900, 300]
    },
    {
      "parameters": {
        "rules": {
          "values": [
            {
              "conditions": { "options": { "caseSensitive": false, "leftValue": "", "typeValidation": "loose" }, "conditions": [{ "leftValue": "={{ $json.sender }}", "rightValue": "Arturo", "operator": { "type": "string", "operation": "equals" } }], "combinator": "and" },
              "renameOutput": true,
              "outputKey": "Arturo"
            },
            {
              "conditions": { "options": { "caseSensitive": false, "leftValue": "", "typeValidation": "loose" }, "conditions": [{ "leftValue": "={{ $json.sender }}", "rightValue": "Bruno", "operator": { "type": "string", "operation": "equals" } }], "combinator": "and" },
              "renameOutput": true,
              "outputKey": "Bruno"
            }
          ]
        },
        "options": {}
      },
      "id": "2b2b2b2b-0004-4000-8000-000000000004",
      "name": "Route By Sender",
      "type": "n8n-nodes-base.switch",
      "typeVersion": 3,
      "position": [1120, 200]
    },
    {
      "parameters": {
        "resource": "draft",
        "operation": "create",
        "subject": "={{ $json.subject }}",
        "message": "={{ $json.bodyText }}",
        "options": { "sendTo": "={{ $json.to }}" }
      },
      "id": "2b2b2b2b-0005-4000-8000-000000000005",
      "name": "Create Draft (Arturo)",
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [1340, 120],
      "credentials": { "gmailOAuth2": { "id": "REPLACE_WITH_ARTURO_GMAIL_CREDENTIAL_ID", "name": "Arturo Gmail" } }
    },
    {
      "parameters": {
        "resource": "draft",
        "operation": "create",
        "subject": "={{ $json.subject }}",
        "message": "={{ $json.bodyText }}",
        "options": { "sendTo": "={{ $json.to }}" }
      },
      "id": "2b2b2b2b-0006-4000-8000-000000000006",
      "name": "Create Draft (Bruno)",
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [1340, 280],
      "credentials": { "gmailOAuth2": { "id": "REPLACE_WITH_BRUNO_GMAIL_CREDENTIAL_ID", "name": "Bruno Gmail" } }
    },
    {
      "parameters": { "numberInputs": 2 },
      "id": "2b2b2b2b-0007-4000-8000-000000000007",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "typeVersion": 3,
      "position": [1560, 200]
    },
    {
      "parameters": { "respondWith": "allIncomingItems", "options": {} },
      "id": "2b2b2b2b-0008-4000-8000-000000000008",
      "name": "Respond to Webhook",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [1780, 300]
    }
  ],
  "connections": {
    "Webhook": { "main": [[{ "node": "Look Up Venue", "type": "main", "index": 0 }]] },
    "Look Up Venue": { "main": [[{ "node": "Build Email", "type": "main", "index": 0 }]] },
    "Build Email": { "main": [[{ "node": "Check Contact Method", "type": "main", "index": 0 }]] },
    "Check Contact Method": {
      "main": [
        [{ "node": "Route By Sender", "type": "main", "index": 0 }],
        [{ "node": "Respond to Webhook", "type": "main", "index": 0 }]
      ]
    },
    "Route By Sender": {
      "main": [
        [{ "node": "Create Draft (Arturo)", "type": "main", "index": 0 }],
        [{ "node": "Create Draft (Bruno)", "type": "main", "index": 0 }]
      ]
    },
    "Create Draft (Arturo)": { "main": [[{ "node": "Merge", "type": "main", "index": 0 }]] },
    "Create Draft (Bruno)": { "main": [[{ "node": "Merge", "type": "main", "index": 1 }]] },
    "Merge": { "main": [[{ "node": "Respond to Webhook", "type": "main", "index": 0 }]] }
  },
  "settings": { "executionOrder": "v1" }
}

Share the output returned by the last node

Direct curl call (works every time) — clean JSON, HTTP 200, response headers include Server: cloudflare, CF-Cache-Status: DYNAMIC, e.g.:
[{“id”:“V001”,“name”:“4 Latas Beethoven”},{“id”:“V002”,“name”:“4 Latas Diagonal”}, …]
ChatGPT Custom GPT Action call (fails every time) — no output at all, no execution created in n8n, nothing to inspect in the Executions list. The only artifact is the client-side error shown to the model:
ClientResponseError
Encountered exception: <class ‘aiohttp.client_exceptions.ClientResponseError’>.

Information on your n8n setup

  • core

    • n8nVersion: 1.123.64
    • platform: docker (cloud)
    • nodeJsVersion: 24.13.1
    • nodeEnv: production
    • database: sqlite
    • executionMode: regular
    • concurrency: 5
    • license: enterprise (sandbox)

    storage

    • success: all
    • error: all
    • progress: false
    • manual: true
    • binaryMode: filesystem

    pruning

    • enabled: true
    • maxAge: 168 hours
    • maxCount: 2500 executions

    client

    • userAgent: mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/150.0.0.0 safari/537.36
    • isTouchDevice: false

    Generated at: 2026-07-15T09:21:40.373Z

Hi @HMNTO

Since you are on an Enterprise (Sandbox) license, you have a direct line to support. Provide them with:

  • Your instance URL: hmnto.app.n8n.cloud
  • The exact time window of the failed attempts.
  • The fact that curl works but OpenAI’s Actions fail.
  • Request: Ask them to check the Cloudflare WAF logs for your subdomain and create a WAF Skip Rule or an Allowlist for OpenAI’s IP ranges/User-Agent.

Oh thanks. I didn’t know this.

Will contact them.

Cheers.

Usually, Cloudflare blocks AI calls while allowing normal curl requests. This can be changed through Cloudflare’s dashboard configurations globally or for a specific path, host, etc.

This can be changed in Cloudflare in the “Your Domain > Security > Settings” page.