{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Grok Bot","description":"Control the power of AI Agents in runtime.","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"grok-bot","__idx":0},"children":["Grok Bot"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Register Capsule as your AI security server for Cursor's Grok Bot ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://cursor.com/docs/grok-bot/inference-hooks"},"children":["inference hooks"]}," so every Grok Bot model request is checked against your policies before the model sees it."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"overview","__idx":1},"children":["Overview"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Inference hooks make Cursor hold each Grok Bot model request until an external AI security server returns an allow or deny verdict. Capsule is that server:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Real-time enforcement"]}," - each member message is evaluated against your policies, and a policy hit denies the request before the model sees it"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Tool result inspection"]}," - content a Bot gathered through a tool, such as a web page, a document or a connected app's response, is evaluated before it goes back to the model"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Denial feedback"]}," - the member who sent the message sees the policy's reason in Grok Bot's block notice"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Observability"]}," - every message is recorded as a user message, and every tool call as a tool invocation, on the Bot's agent in Capsule"]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Note:"]}," Cursor checks model inputs only. A tool call has already run, and Grok Bot's reply has already reached the member, by the time a frame contains it. A deny stops the next model call, not an action that already happened. Use Cursor's network policy and Auto Review to control actions in real time."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"prerequisites","__idx":2},"children":["Prerequisites"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Before you begin, ensure you have:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["A ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Cursor Enterprise"]}," team with Grok Bot enabled"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Team admin"]}," access in the Cursor dashboard"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["At least one ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["policy"]}," configured in Capsule, otherwise every request is allowed"]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-1-get-your-endpoint-and-authorization-header-from-capsule","__idx":3},"children":["Step 1: Get Your Endpoint and Authorization Header from Capsule"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Log in to the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Capsule Security"]}," portal"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Click ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Integrations"]}," in the left sidebar"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Open the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Grok Bot"]}," card and click ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Connect"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Copy the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Endpoint"]}," and the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Authorization header value"]}," using the copy buttons"]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Note:"]}," The header value carries a token scoped to your tenant and environment. Treat it as a credential."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-2-register-capsule-in-cursor","__idx":4},"children":["Step 2: Register Capsule in Cursor"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["In the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://cursor.com/dashboard/bot"},"children":["Cursor dashboard"]},", open ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Grok Bot"]}," > ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Security & Compliance"]}," > ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Inference Hooks"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Click ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Set Up Endpoint"]}," and choose ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Custom Endpoint"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Paste the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Endpoint"]}," from Step 1 into ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Endpoint URL"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Add a custom header:",{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Name"]},": ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Authorization"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Value"]},": the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Authorization header value"]}," from Step 1, which starts with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Bearer "]}]}]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Save. Cursor shows a signing secret that starts with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["whsec_"]}," once. Copy it"]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-3-turn-on-signature-verification","__idx":5},"children":["Step 3: Turn On Signature Verification"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Back in the Capsule card, paste the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["whsec_..."]}," value into ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Signing secret"]}," and click ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Save"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The card shows ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Signature verification is on"]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The header value does not change, so there is nothing to update in Cursor."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"rotating-the-signing-secret","__idx":6},"children":["Rotating the signing secret"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Capsule accepts the two most recent secrets. Click ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Rotate Secret"]}," in Cursor, then paste the new secret into the Capsule card. Cursor switches to the new secret within about a minute, so paste it promptly: frames signed with a secret Capsule does not have yet are rejected."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-4-test-and-roll-out","__idx":7},"children":["Step 4: Test and Roll Out"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["In Cursor, click ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Test Connection"]},". Capsule answers with an allow verdict"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["New configurations start in ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Shadow Mode"]},": Cursor sends frames but never waits for or enforces the verdict. Turn on ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Enforce Verdicts"]}," and review the detections Capsule records"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["When the results look right, choose a failure ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Mode"]},". ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Allow the Request"]}," lets a request through when Capsule cannot be reached; ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Block the Request"]}," blocks it"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Tell your members before you enforce verdicts. A denied member sees a block notice with the policy's reason"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Recommended settings:"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Setting"},"children":["Setting"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Value"},"children":["Value"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Why"},"children":["Why"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Verdict Timeout (ms)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["5,000 or more"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Capsule answers within 4 seconds of receiving a frame"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Requests Inspected (%)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["100"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Requests Cursor skips never reach Capsule"]}]}]}]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Note:"]}," In Shadow Mode, Capsule still records denials that Cursor did not enforce. Cursor does not tell Capsule which mode is on."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"what-capsule-ingests","__idx":8},"children":["What Capsule Ingests"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Inference hook frame"},"children":["Inference hook frame"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Appears in Capsule as"},"children":["Appears in Capsule as"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The Bot (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["session_id"]},")"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["An agent named ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Grok Bot"]}," followed by the start of the Bot's ID"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["New member message, including attachment text such as rules and memory"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["User message"]}," activity on the Bot's agent"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Tool call with its result"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Tool invocation"]}," activity on the Bot's agent, and the tool in its inventory"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Member, Bot and the chat's first message"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["One ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["session"]}," per chat in Observability"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Member ID"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Metadata on each activity. Cursor sends no email address"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Policy denial"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Detection"]},", with the reason shown to the member"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Each frame carries the whole conversation. Capsule evaluates and records only the frame's final message, so earlier messages are not counted twice. A message Cursor blocked stays in the conversation but is not judged again, so the member can continue with a different message. When Grok Bot summarizes a long chat, Capsule starts a new session for it."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"troubleshooting","__idx":9},"children":["Troubleshooting"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Symptom"},"children":["Symptom"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Cause"},"children":["Cause"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Fix"},"children":["Fix"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Signing secret must start with whsec_"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Something other than the signing secret was pasted"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Copy the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["whsec_..."]}," value Cursor shows after the endpoint is saved, or rotate it to get a new one"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Test Connection reports ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Non-200 status"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Authorization"]}," header is missing, misspelled, or lacks the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Bearer "]}," prefix"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Re-add the header as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Authorization"]}," with the copied ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Authorization header value"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Requests fail right after a secret rotation"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Capsule does not have the new secret yet"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Paste the new secret into the Capsule card"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Requests fail with a signature error and no rotation is in progress"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["A clock is off by more than 5 minutes"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Correct the system clock"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Requests time out"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The Verdict Timeout in Cursor is below 5,000 ms"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Raise ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Verdict Timeout"]}," to 5,000 ms or more"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Requests are never denied"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["No policy matches"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Check the policy's scope and trigger"]}]}]}]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"how-it-works","__idx":10},"children":["How It Works"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Cursor POSTs one ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["prompt"]}," frame per Grok Bot model call to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST /v1/grok-bot/hooks/events"]}," and holds the call until Capsule answers with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["{\"action\": \"allow\"}"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["{\"action\": \"deny\", \"deny_reason\": \"...\", \"reference_id\": \"...\"}"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Authentication runs in two layers. The bearer token is a per-environment JWT that names your tenant and environment. Once the signing secret is saved, each frame must also carry a valid ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://www.standardwebhooks.com"},"children":["Standard Webhooks"]}," signature: an HMAC-SHA256 over ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["{webhook-id}.{webhook-timestamp}.{raw body}"]},", checked against the raw bytes Cursor signed."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Anything but a 200 carrying a verdict is a failed check in Cursor, which never reads as a deny: your failure mode decides the outcome, and repeated failures trip Cursor's circuit breaker. Capsule therefore answers 200 with a verdict on every path, allows frames it cannot read, and allows when analysis is unavailable or does not finish in time. A request is denied only on an explicit policy hit."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["deny_reason"]}," is truncated to 500 characters. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["reference_id"]}," is the frame's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["request_id"]},", which Cursor also records in its audit log, so a denial in Cursor joins back to the matching Capsule detection."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"support","__idx":11},"children":["Support"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For help with this integration:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Email"]},": support@capsule.security"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Include"]},": Your tenant ID and the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["request_id"]}," from any unexpected denial"]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"references","__idx":12},"children":["References"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://cursor.com/docs/grok-bot/inference-hooks"},"children":["Grok Bot inference hooks"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://cursor.com/docs/grok-bot/security"},"children":["Grok Bot security"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://www.standardwebhooks.com"},"children":["Standard Webhooks specification"]}]}]}]},"headings":[{"value":"Grok Bot","id":"grok-bot","depth":1},{"value":"Overview","id":"overview","depth":2},{"value":"Prerequisites","id":"prerequisites","depth":2},{"value":"Step 1: Get Your Endpoint and Authorization Header from Capsule","id":"step-1-get-your-endpoint-and-authorization-header-from-capsule","depth":2},{"value":"Step 2: Register Capsule in Cursor","id":"step-2-register-capsule-in-cursor","depth":2},{"value":"Step 3: Turn On Signature Verification","id":"step-3-turn-on-signature-verification","depth":2},{"value":"Rotating the signing secret","id":"rotating-the-signing-secret","depth":3},{"value":"Step 4: Test and Roll Out","id":"step-4-test-and-roll-out","depth":2},{"value":"What Capsule Ingests","id":"what-capsule-ingests","depth":2},{"value":"Troubleshooting","id":"troubleshooting","depth":2},{"value":"How It Works","id":"how-it-works","depth":2},{"value":"Support","id":"support","depth":2},{"value":"References","id":"references","depth":2}],"frontmatter":{"seo":{"title":"Grok Bot"}},"lastModified":"2026-10-25T13:29:03.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/guides/grok-bot","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}