Closed general

grok_webhook_fire refused: automation rate limit 18000/min exceeded (current 18002)

John Lauer · 5d ago ·closed by John Lauer

grok_webhook_fire: "Automation run rate limit exceeded: grok bot limit 18000 per minute, current_count=18002"

2026-10-15, 13:25 to 13:36 UTC, from the Adom Bridge thread on AdomLapper. Every grok_webhook_fire {event:"ping"} returns HTTP 400 with that body, so nothing can reach the agent box through the webhook (and grok_computer_screenshot uses the same route).

My calls: two fires about ten minutes apart, plus grok_chat_read reads. 18,000 runs a minute means something else is firing in a loop against this Grok bot. Worth checking: whatever calls the automation endpoint (a retry loop on 400, a poller using fire instead of chat_read, or the box itself).

Asks:

  1. Find and stop whatever is firing at that rate.
  2. Have grok_webhook_fire report a rate-limit 400 as its own errorCode (rate_limited, with the limit and the current count) and say whether the caller should wait or stop. Today it reads as a URL/key problem ("Re-run grok_webhook_ensure if the routine URL/key rotated"), which is the wrong advice for this case.
  3. A second way to reach the box when the webhook is refused would help: Adom Bridge on the box went offline at 13:16 and nothing could ask the agent to restart it.

2 Replies

John Lauer · 5d ago

Still happening, with one more data point that matters:

  • 13:25 to 13:36 UTC: refused, current_count=18002.
  • About 13:48: one fire went through (HTTP 200, the agent replied).
  • 14:04 and 14:37: refused again, current_count=18001 both times.

The count does not move between attempts half an hour apart, so this does not behave like a per-minute window. It looks like a counter on the automation (api2.cursor.sh) that stays at the cap. If grok-bridge can read the automation's run history or usage, that would show what is filling it.

Impact today: the webhook is the only route from grok-bridge into the agent box (grok_send is a toast plus the inbox unless it types into John's chat, and grok_computer_screenshot rides the webhook). With it refused, nothing can ask the box to check or restart Adom Bridge, which dropped off the relay at 13:55 UTC, and kicad-bridge's Linux work on that box is blocked (adom/kicad-bridge#127).

John Lauer · 5d ago

Done in 1.3.13 to 1.3.15 (insiders; AdomLapper and ConfRoomROG run 1.3.15).

1. Who filled the counter: not grok-bridge on AdomLapper or ConfRoomROG.

  • Their old grok.logs (no timestamps then) show 5 grok_webhook_fire calls on AdomLapper since its 08:23 restart and zero on ConfRoomROG. ConfRoomROG's heavy traffic is Hydrogen polling grok_readiness / grok_status (~16k each), which never reaches Grok.
  • Since 14:50 UTC every call is logged, and neither PC fired until my checks.
  • At 16:47 UTC one test fire went through with HTTP 200 and the agent replied, so the counter had cleared by then.
  • Grok Bot's Settings > Usage shows only the weekly plan % and the on-demand cap; I found no automation run history there. The source is outside grok-bridge on these PCs (Cursor's automation side, another PC, or a direct caller). If it happens again, grok_activity on each PC now shows exactly who fired.

2. Own errorCode: a rate-limit answer (HTTP 429, or a 400 body with "rate limit") returns errorCode:"webhook_throttled", throttledBy:"grok", rateLimitPerMinute:18000, currentCount:18002 (parsed from the body). The hint says wait or stop and do not re-run grok_webhook_ensure. The PC then holds every fire for Retry-After, or 60 s doubling to 300 s, so callers do not keep the counter pinned.

  • Also new: a per-PC budget (6 fires/min) and a per-thread budget (3/min), so one noisy thread cannot lock the others out.
  • Every call is logged to ~/.adom/grok-bridge-activity.jsonl, and grok_activity reads it.

3. Second route: grok_chat_send {message, reason} types into the grok-bridge chat through UIA. It sets the Prompt box and invokes Send message, with no keyboard and no focus steal, and it refuses if you have a draft. The message always starts with [from AI thread "<name>" via grok-bridge, not typed by John], and grok-anywhere tells the agent that is an AI request, not your approval. Live test: sent at 11:51 CT, and the agent answered the same minute.

Log in to reply.