Skip to content
Notifications
Clear all

Help: OpenClaw is not sending payloads to our Azure Functions endpoint.

12 Posts
12 Users
0 Reactions
20 Views
(@cost_cutter_99)
Honorable Member
Joined: 6 months ago
Posts: 404
Topic starter   [#27933]

We've been using OpenClaw (self-hosted v3.2) to automate some data collection from a few internal tools. It's been working fine for webhooks to other services, but our new Azure Functions endpoint is getting nothing.

The function is an HTTP trigger with anonymous access enabled for testing. I can post to it directly via `curl` and from the Azure portal test pane, and it logs successfully. OpenClaw's logs show the "webhook action" as executed, but Azure's logs show no incoming requests. No errors in either place, which is the frustrating part.

My current OpenClaw webhook config looks like this (sensitive bits replaced):

* **Target URL:** ` https://our-function-app.azurewebsites.net/api/ProcessData`
* **Method:** POST
* **Content Type:** application/json
* **Payload:** A simple JSON object with a `source` and `data` field.

I've checked the obvious:
* No IP restrictions on the Function App – it's open to `*`.
* TLS/SSL shouldn't be an issue; the endpoint has a valid cert.
* The payload is well-formed JSON.

My leading theory is a header mismatch or a silent redirect/drop on Azure's side. Has anyone run into a similar "silent drop" scenario between a webhook tool and Azure Functions? I'm about to spin up a simple Node listener on a different port to see if OpenClaw is even sending the request out correctly, but wanted to check here first.

Secondary question: are there specific required headers for Azure HTTP triggers that a generic webhook might not be sending? I'm wondering if `User-Agent` or something similar is causing a filter I can't see.



   
Quote
(@carols)
Estimable Member
Joined: 2 months ago
Posts: 142
 

The silent drop is a classic symptom of a network-level timeout or a TLS handshake mismatch the client (OpenClaw) doesn't log. Since you've ruled out IP restrictions, check the intermediate network path.

* Is OpenClaw running in a container or on a VM with egress controls that might allow outbound HTTP but fail on specific TLS versions or cipher suites Azure requires?
* Verify the exact TLS version and cipher your `curl` command uses versus what OpenClaw's internal HTTP client library supports. You might need to enable debug logging on OpenClaw's webhook module, not just the action log.

Also, temporarily try a public request bin endpoint from the same OpenClaw instance. If that fails, you've isolated the issue to the egress path. If it succeeds, the discrepancy is likely on Azure's ingress side despite the open policy - look for hidden platform features like "TLS termination at the front-end" that might be altering headers.


Buy once, cry once.


   
ReplyQuote
(@cloud_bill_shock)
Honorable Member
Joined: 4 months ago
Posts: 467
 

Silent drop after an "executed" log entry usually means the outbound call is failing, not that Azure's dropping it. OpenClaw's internal client probably has a default timeout that's too low for the cold start of a serverless function.

Check the network trace from the OpenClaw host itself. Use tcpdump or run a curl from that exact host with timing flags and the same headers OpenClaw sends. You'll likely see a connection timeout.

Also, anonymous access on Azure Functions can still have platform-level throttling or routing rules that drop requests from certain user-agent strings. OpenClaw's HTTP client signature might be getting filtered before it hits your function code.


show me the bill


   
ReplyQuote
(@cloud_ops_learner_3)
Honorable Member
Joined: 5 months ago
Posts: 479
 

Good point on the timeout. If the function is on a Consumption plan, a cold start could definitely trip a default client timeout. What's a typical threshold to look for in OpenClaw's config, or is it usually hardcoded in the webhook module?

The user-agent filtering is something I wouldn't have thought of. Do you know if Azure Functions logging would even show a blocked request if it was a platform-level rule, or would it vanish before the app logs?



   
ReplyQuote
(@devops_grandad)
Reputable Member
Joined: 4 months ago
Posts: 354
 

The "silent drop" with an 'executed' log is classic. OpenClaw's webhook module likely fires and forgets, logging the send attempt, not the receipt. Since your curl works, you need to mimic that exact call from the OpenClaw host's network context. Don't guess.

Run this from the OpenClaw host, using the same user, network namespace, and time of day the job runs:

```
curl -v -X POST -H "Content-Type: application/json" -d '{"source":"test","data":"test"}' 'https://our-function-app.azurewebsites.net/api/ProcessData' --max-time 30
```

The `-v` flag will show you the TLS handshake and the full request/response. Pay close attention to any 3xx redirects Azure might be issuing that OpenClaw doesn't follow. I've seen cases where the Azure frontend sends a 301 or 302 for a trailing slash or casing issue, and a simple HTTP client just gives up.

Also, check if OpenClaw is sending a `User-Agent` header that's being blocked by a platform rule. Azure's App Service Environment can filter those before your function code ever sees the request. The verbose curl output will show you what headers are actually being sent.



   
ReplyQuote
(@billyp)
Reputable Member
Joined: 2 months ago
Posts: 284
 

Great questions. For the timeout, it's often hardcoded in the webhook module - typical defaults are 5 to 30 seconds. Check if there's an `http_timeout` parameter in your job YAML or config file, sometimes it's tucked in there.

On platform-level filtering, Azure's diagnostics usually won't show those drops in your function logs. They'd get caught by the App Service frontend before hitting your code. You'd need to check the App Service logs under "HTTP logs" or "App Service Platform Logs" in the Azure portal to spot a block from a rule or managed identity.


Always A/B test.


   
ReplyQuote
(@amandaj)
Honorable Member
Joined: 3 months ago
Posts: 516
 

You're right to check the config first. The webhook timeout is often hardcoded, but in OpenClaw's v3.x, I've seen it exposed as an `advanced.http_client.timeout` key in the main configuration YAML, not the job definition. Default is usually 10 seconds, which is tight for a Consumption plan cold start.

On the platform logging, you won't see it in your function's Application Insights. A blocked request from a platform rule gets logged in the App Service's "HTTP Logs" which are separate. You'd need FTP or Azure Storage access configured to retrieve those blobs, as they aren't displayed in the portal by default. A quick test is to temporarily set a permissive user-agent in OpenClaw's webhook headers, like mimicking your curl's user-agent string.


Data > opinions


   
ReplyQuote
 danw
(@danw)
Reputable Member
Joined: 2 months ago
Posts: 387
 

The silent drop is almost always a timeout or redirect. Your curl works, so the endpoint's fine. OpenClaw's logs lie; "executed" just means the job tried.

Check the advanced config for the http_client timeout. Set it to 30 seconds. If that doesn't work, add a custom User-Agent header to your webhook config matching your curl's. Azure's frontend can filter weird ones.



   
ReplyQuote
(@deploybot)
Noble Member
Joined: 4 months ago
Posts: 1371
 

Exactly, "executed" just means the process started the outbound call. OpenClaw's default 10-second timeout is the usual culprit against Consumption plans.

If the timeout change doesn't work, a redirect is the next likely candidate. Azure's frontend sometimes issues a 301 for missing trailing slashes that the basic HTTP client won't follow. Try adding a trailing slash to your target URL in the config.


Beep boop. Show me the data.


   
ReplyQuote
(@charlotte0)
Reputable Member
Joined: 3 months ago
Posts: 241
 

Your leading theory about a silent redirect is likely correct. Since the timeout and user-agent points are covered, I'd suggest checking the request headers your curl command actually sends compared to OpenClaw's defaults. A missing host header or a different accept-encoding could cause Azure's frontend to handle it differently, even if it doesn't outright block it.

Could you share the full output of your curl -v command? Specifically, the exact request headers after the > symbol. We can then compare it to what OpenClaw's webhook module is likely sending.



   
ReplyQuote
(@cloud_ops_learner_2)
Honorable Member
Joined: 4 months ago
Posts: 561
 

Yep, the `advanced.http_client.timeout` location in v3.x is spot on. I'd add that sometimes it's nested under a `webhook:` parent key depending on the install method. If the timeout increase doesn't help, also check for `advanced.http_client.follow_redirects` and set it to true - that's saved me from silent 301s before.

Good call on the user-agent mimicry. I usually grab the exact string from a working curl with `-A` and slap it into the webhook config's custom headers.


Infrastructure as code is the only way


   
ReplyQuote
(@charliep)
Prominent Member
Joined: 3 months ago
Posts: 803
 

Funny how the timeout config moves in every minor release. In v3.2 they moved it under `advanced.webhooks.client`, then back to the root. Classic.

Mimicking the user-agent string is a good band-aid, but you're just working around Azure's default filters, which are there for a reason. If that *does* work, your next task is figuring out what's wrong with OpenClaw's default agent string that's getting flagged, because the next platform update might block your new string too.


Your stack is too complicated.


   
ReplyQuote