¿Cloudflare bloqueando?

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

Hola @HMNTO

Ya que tienes una licencia Enterprise (Sandbox), tienes una línea directa con soporte. Proporciónales:

  • Tu URL de instancia: hmnto.app.n8n.cloud
  • La ventana de tiempo exacta de los intentos fallidos.
  • El hecho de que curl funciona pero las Acciones de OpenAI fallan.
  • Solicitud: Pídeles que verifiquen los registros de Cloudflare WAF de tu subdominio y creen una WAF Skip Rule o una Allowlist para los rangos de IP/User-Agent de OpenAI.

Ah, gracias. No lo sabía.

Me pondré en contacto con ellos.

Saludos.

Normalmente, Cloudflare bloquea las llamadas de IA mientras permite solicitudes curl normales. Esto se puede cambiar a través de las configuraciones del panel de control de Cloudflare de forma global o para una ruta específica, host, etc.

Esto se puede cambiar en Cloudflare en la página “Tu Dominio > Seguridad > Configuración”.