Skip to content

docs(triggers): unify webhook-endpoint concept end-to-end [PLEN-2435]#3361

Merged
anshugarg15 merged 24 commits into
nextfrom
docs/triggers-webhook-endpoints
May 11, 2026
Merged

docs(triggers): unify webhook-endpoint concept end-to-end [PLEN-2435]#3361
anshugarg15 merged 24 commits into
nextfrom
docs/triggers-webhook-endpoints

Conversation

@anshugarg15
Copy link
Copy Markdown
Contributor

@anshugarg15 anshugarg15 commented May 7, 2026

What this PR is

The trigger docs predate the current webhook-endpoints model and never explained it. The site has zero mentions of webhook endpoints, signing secrets at ingress, or the trigger-type flag that tells you whether endpoint setup is required. This PR fixes that gap end-to-end and surfaces the per-toolkit setup on the toolkit pages where customers look.

The mental model the docs now teach

Two delivery types: webhook (provider pushes events to Composio in real time) or polling (Composio polls). Determined by the trigger type.

Two pieces of setup, both one-time:

Piece When it's needed Scope
Webhook subscription — your URL where Composio delivers signed events Always Once per project
Webhook endpoint — the URL the provider posts events to Only when the trigger type's requires_webhook_endpoint flag is true Once per OAuth app

Discovery is at the trigger level. When you inspect a trigger type with composio.triggers.get_type(), the response includes a requires_webhook_endpoint flag. If true, configure the endpoint before creating the trigger; if false, just create. With Composio-managed OAuth apps the flag is always false. The trigger creation call also returns a 400 if the flag is true and no endpoint exists yet.

The toolkit-level schema endpoint (GET /api/v3.1/webhook_endpoints/schema?toolkit_slug=...) is documented as a sub-step inside the configuration walkthrough — it's the source of truth for which credentials the endpoint needs once you know you're configuring one. It's not the upfront check.

What I changed (10 files)

Conceptual docs (/docs/...)

File Change
docs/triggers.mdx New overview structure: two delivery types → setup-at-a-glance table → end-to-end flow with the two-URLs table → Working-with-triggers steps that lead with "inspect the trigger type." No upfront schema-endpoint check; no toolkit-name lists.
docs/setting-up-triggers/creating-triggers.mdx Reordered. SDK and dashboard sections now come first (the common path); the 5-step "Configuring the webhook endpoint" walkthrough is last, gated behind "skip unless your trigger needs it." SDK code samples print requires_webhook_endpoint / requiresWebhookEndpoint alongside config so the discovery moment is visible in-line.
docs/setting-up-triggers/subscribing-to-events.mdx Top callout reframed around the flag instead of toolkit names.
docs/webhook-verification.mdx Two-signatures callout. Ingress signature verification section reframed around the flag.
docs/troubleshooting/triggers.mdx Webhook endpoint issues section: header drops the toolkit names; lead-in references the flag. Failure modes unchanged.
docs/glossary.mdx Trigger entry simplified to two delivery types. New Webhook Endpoint and Webhook Subscription entries, both phrased around the flag.
docs/setting-up-triggers/meta.json No new pages — the walkthrough lives in creating-triggers.mdx.

Toolkit-page FAQs (/toolkits/...)

Toolkit pages (e.g. /toolkits/slack) get triggers and tools server-side from Apollo (/api/v3/triggers_types, /api/v3/tools). The only piece of per-toolkit content in this repo is content/toolkits/faq/{slug}.md — plain markdown rendered as a FAQ accordion at the bottom of the toolkit page.

File Change
content/toolkits/faq/slack.md Rewrite the "How do I set up Slack event webhooks?" answer: it pointed at the legacy /trigger_instances/slack/default/handle URL. Replace with the webhook_endpoints flow (POST endpoint → PATCH signing secret → optional app_token → paste URL into Event Subscriptions). Lead with "Composio-managed credentials = nothing to do." Update "Why aren't my Slack triggers working?" to reference the same flow.
content/toolkits/faq/notion.md Add "How do I set up Notion webhook triggers?" with the same Composio-managed-vs-your-own split. Step 1 calls the schema endpoint to discover required fields, since I don't want to invent Notion-specific field names.

Both FAQ entries link to /docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint for the canonical reference.

What's deliberately NOT in this PR

  • No V1/V2 split in the prose. Per direction: keep the docs unified around the current model. V1 isn't mentioned in user-facing copy. The V2 announcement changelog still exists at /docs/changelog/2026/04/27 for historical reference.
  • No invented vocabulary. Earlier drafts had "user-level webhook" and "app-level webhook endpoint" as named delivery models — both removed.
  • No standalone V2 setup page. The walkthrough is folded into creating-triggers.mdx so readers don't context-switch mid-flow.
  • No API reference changes. All API ref pages under /reference/api-reference/webhooks/ are auto-generated by the docs-update-data workflow from Apollo's OpenAPI export — see Companion PR.

Companion PR — must merge with this one

#3238 — docs/auto-update-data is the auto-update PR (open since 2026-04-18). It contains the regenerated webhooks/index.mdx and the latest openapi.json, both of which include the new webhook_endpoints CRUD operations. That PR is what surfaces the API reference pages (postWebhookEndpoints, getWebhookEndpoints, getWebhookEndpointsByNanoId, postWebhookEndpointsByNanoId, patchWebhookEndpointsByNanoId).

Verified the auto-PR is correct:

  • Branch docs/auto-update-data, force-pushed every cycle (every 5 hours) by peter-evans/create-pull-request.
  • Latest commit 2026-05-07T10:42:33Z. Single commit. 14 files, all in the expected auto-generated set: docs/content/reference/api-reference/*, docs/content/reference/v3/api-reference/*, docs/content/reference/meta-tools/*, docs/public/data/*, docs/public/openapi*.json. Zero unrelated changes.
  • +27,173 / -16,704 lines come from openapi.json (~31k lines) and toolkits.json (~6.7k lines) being fully regenerated. Review by file list, not by line count.
  • Status: mergeStateStatus: BLOCKED, reviewDecision: REVIEW_REQUIRED. All CI green (CodeQL, Vercel preview).

Either PR can merge first; they touch disjoint files. Both must be in for the trigger story to be complete.

Two open product items (separate from this PR)

  1. requires_webhook_endpoint flag on trigger types. This PR's code samples and conceptual prose write against this flag as the discovery mechanism. Per discussion, the product team will expose it on the trigger type / SDK. If the field name shipped is different, this PR will need a small follow-up rename (one place in triggers.mdx, two places in creating-triggers.mdx's code samples, plus the cross-references in subscribing-to-events.mdx, webhook-verification.mdx, troubleshooting/triggers.mdx, and glossary.mdx).
  2. GET /api/v3.1/webhook_endpoints/schema?toolkit_slug=... not in the OpenAPI spec. This endpoint is documented (used inside the configuration walkthrough) but Apollo isn't exporting it. Without Apollo source in this repo I can't say whether it's missing the Webhooks tag, marked x-internal: true, or just unannotated. The endpoint works in production today; it just doesn't show up in the auto-generated API reference. Action item on the Apollo side.

Test plan

  • bun x fumadocs-mdx && bun run scripts/validate-links.ts — 0 errors after each commit
  • Reviewer: open the Vercel preview and confirm:
    • /docs/triggers reads coherently end-to-end (no V1/V2 in prose; setup-at-a-glance table is accurate)
    • /docs/setting-up-triggers/creating-triggers — SDK/dashboard sections come first; walkthrough at the bottom is clearly skippable
    • /toolkits/slack and /toolkits/notion FAQ accordions show the new webhook setup steps
    • The requires_webhook_endpoint flag references read correctly across all the trigger pages

🤖 Generated with Claude Code

Trigger docs predate Webhook Triggers V2 — they describe a single
"webhook trigger" model in which Composio handles ingress automatically.
That story is no longer complete: V2 toolkits (Slack today, more to
follow) require a one-time, project-level setup where the user
registers an OAuth app's signing secret on a webhook_endpoint and
points the provider's app dashboard at a Composio-issued URL.

This change rewrites the trigger surface around three delivery models:

- Polling — Composio polls the provider on a schedule (e.g. Gmail).
- User-level webhook — Composio auto-registers a per-user webhook
  with the provider on trigger creation (Asana, GitHub, Outlook, ...).
- App-level webhook endpoint (V2) — the user creates a
  webhook_endpoint per OAuth app, stores the provider's signing
  secret, and points the provider at the issued ingress URL (Slack).

Files:
- triggers.mdx — overview rewritten around the three delivery models,
  end-to-end flow with both webhook URLs (ingress vs subscription),
  and ingress-side signature verification.
- setting-up-triggers/configuring-webhook-endpoints.mdx — new page,
  full V2 walkthrough (Slack) using Steps: discover schema → create
  endpoint → store signing secret → optionally add app token →
  point provider at URL → confirm verified_at. Also covers PATCH
  vs POST update semantics and V1 → V2 migration triggers.
- setting-up-triggers/creating-triggers.mdx — note V2 prerequisite
  in the prerequisites callout; link to new page in next steps.
- setting-up-triggers/subscribing-to-events.mdx — top-of-page
  callout disambiguating the two webhook URLs (ingress vs subscription).
- setting-up-triggers/meta.json — register new page, ordered after
  creating-triggers.
- webhook-verification.mdx — split responsibility callout at the top
  (Composio verifies ingress, you verify delivery); add an "Ingress
  signature verification (V2)" section.
- troubleshooting/triggers.mdx — V2-specific failure modes
  (signing-secret missing, verified_at null, missing app_token,
  replay-window rejections).
- glossary.mdx — "Trigger" entry rewritten around three models;
  new "Webhook Endpoint" and "Webhook Subscription" entries.

Note: the corresponding webhook_endpoints API reference pages are
auto-generated from Apollo's OpenAPI export by the
docs-update-data workflow. They are already present on PR #3238
(the open auto-update-data PR) and will surface in the API reference
the moment that PR merges.

Separately: GET /api/v3.1/webhook_endpoints/schema?toolkit_slug=...
is referenced in the changelog and on the new doc page but is not in
Apollo's exported OpenAPI spec. That's an Apollo annotation gap to
fix on the backend side; it does not block this docs PR.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@vercel
Copy link
Copy Markdown

vercel Bot commented May 7, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
docs Ready Ready Preview, Comment May 11, 2026 7:33am

Request Review

@claude
Copy link
Copy Markdown
Contributor

claude Bot commented May 7, 2026

Claude finished @anshugarg15's task in 2m 31s —— View job


Docs review

Applied the docs-reviewer checklist to all 8 changed files.

  • Read the docs-reviewer guidelines
  • Run git diff origin/next...HEAD
  • Verify referenced links / anchors / icon imports / parent index entries exist
  • Apply the "would a developer get stuck or be misled?" filter
  • Post review

Findings

One factual issue.

docs/content/docs/triggers.mdx:47 — V1 ingress URL has the wrong API version (v3.1 should be v3).

In the new "End-to-end flow" table, the V1 ingress path is documented as /api/v3.1/trigger_instances/.../handle, but the V1 path is /api/v3 everywhere else — including the V2 changelog (04-27-26-webhook-triggers-v2.mdx:189) and two other files in this PR:

  • configuring-webhook-endpoints.mdx:199/api/v3/trigger_instances/{toolkit}/{project_id}/handle
  • webhook-verification.mdx:215/api/v3/trigger_instances/{toolkit}/{project_id}/handle

A V1 user reading this table to understand the two URL shapes would copy the wrong version prefix.

Fix:

-| **Ingress** (`/api/v3.1/trigger_instances/.../handle` for V1, `/api/v3.1/webhook_ingress/...` for V2) | Provider → Composio | Composio (V1, automatic) or you, once per OAuth app (V2 — see [Configuring webhook endpoints](/docs/setting-up-triggers/configuring-webhook-endpoints)) |
+| **Ingress** (`/api/v3/trigger_instances/.../handle` for V1, `/api/v3.1/webhook_ingress/...` for V2) | Provider → Composio | Composio (V1, automatic) or you, once per OAuth app (V2 — see [Configuring webhook endpoints](/docs/setting-up-triggers/configuring-webhook-endpoints)) |

Fix this →


What I checked and is fine

  • Icons (Zap, RouteIcon, Plug, ShieldCheck, Wrench, BookOpen, Key) — all already imported in docs/mdx-components.tsx:29-46, so the new <Card icon={...}> usages render.
  • Cross-page anchors#three-delivery-models resolves to the new H2 in triggers.mdx (slugify gives three-delivery-models); #heads-up-oauth-apps-are-project-scoped-on-v2 matches 04-27-26-webhook-triggers-v2.mdx:166.
  • Parent index — new page registered in setting-up-triggers/meta.json and surfaced from triggers.mdx, creating-triggers.mdx, and webhook-verification.mdx Card grids.
  • Reference links/docs/changelog/2026/04/27 resolves via the dated-slug router; /reference/api-reference/webhooks exists.
  • Walkthrough completeness — the Slack walkthrough covers all 6 steps (schema → create → secret → optional app_token → provider dashboard → confirm verified_at). The "store the secret before flipping the URL" warning and the per-trigger app_token requirement matrix (SLACK_DIRECT_MESSAGE_RECEIVED always, SLACK_CHANNEL_MESSAGE_RECEIVED only for private/MPDM, SLACK_MESSAGE_REACTION_ADDED always) are concrete enough that someone wiring this up won't be left guessing.
  • PATCH vs POST semantics — clearly distinguished (PATCH = merge one field, POST = replace data wholesale and clear omitted fields).
  • PR-acknowledged Apollo gap for webhook_endpoints/schema — out of scope for this docs PR, no review action.

Once the V1 path typo is fixed, this looks good.
• Branch: docs/triggers-webhook-endpoints

… framing

Per review: the conceptual docs should describe the current product —
one webhook-endpoint concept whose only axis is who configures it.
V1/V2 split was an implementation detail that didn't belong in user-
facing prose. Per-OAuth-app endpoint setup also doesn't apply when
you use Composio-managed credentials, which the previous draft failed
to call out.

Concrete changes vs the previous commit:

- Drop "V1", "V2", "user-level webhook", "app-level webhook endpoint",
  and "delivery models" from all conceptual docs (triggers.mdx,
  creating-triggers.mdx, subscribing-to-events.mdx,
  webhook-verification.mdx, troubleshooting/triggers.mdx, glossary.mdx).
- Remove the standalone configuring-webhook-endpoints.mdx page; fold
  the walkthrough into creating-triggers.mdx as a "Configuring the
  webhook endpoint" section. Revert meta.json accordingly.
- triggers.mdx now frames a single webhook-endpoint concept with two
  configurations: Composio-managed (default for everything; required
  with Composio-managed OAuth apps) vs you-managed (your own OAuth
  app on toolkits like Slack and Notion today).
- Make the Composio-managed-OAuth case explicit: if you use
  Composio-managed credentials, no manual webhook-endpoint setup
  applies. Surfaced as a callout in triggers.mdx and
  creating-triggers.mdx.
- The schema endpoint
  (GET /api/v3.1/webhook_endpoints/schema?toolkit_slug=...) is
  documented as the source of truth for whether your toolkit needs
  manual configuration: empty setup_fields = Composio handles it
  (Asana, etc.); non-empty = you handle it (Slack, Notion).
- creating-triggers.mdx: walkthrough now uses 5 numbered steps
  (discover → create → store credentials → point provider at URL →
  confirm verified_at), plus an "Updating an endpoint" subsection
  covering PATCH vs POST semantics and how to list endpoints.
- troubleshooting/triggers.mdx: section header drops "V2", lead with
  a one-line note that issues only apply to user-managed endpoints.
- glossary.mdx: Trigger entry simplified to two delivery types;
  Webhook Endpoint entry rewritten without V2 vocabulary.
- webhook-verification.mdx: ingress section drops "V2" framing and
  explains the two cases for where the signing secret comes from
  (Composio-managed credentials vs PATCHed by the user).

Note: the schema endpoint is referenced in the docs but is not in
Apollo's exported OpenAPI spec, so no auto-generated reference page
exists for it. CRUD on /webhook_endpoints is in the spec and will
surface via auto-update PR #3238.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@claude
Copy link
Copy Markdown
Contributor

claude Bot commented May 7, 2026

Claude finished @anshugarg15's task in 2m 46s —— View job


Docs review (re-review on synchronize)

Re-applied the docs-reviewer checklist to the updated diff.

  • Read the docs-reviewer guidelines
  • Run git diff origin/next..HEAD
  • Verify referenced links / anchors / icon imports / parent index entries exist
  • Apply the "would a developer get stuck or be misled?" filter
  • Post review

Looks good

The V1/V2 inconsistency I flagged on the previous push is fully resolved — commit 68390b0 drops the V1/V2 framing entirely and unifies the docs around a single webhook-endpoint concept, so there's no longer a V1 ingress URL to get wrong. All ingress URLs in the updated set consistently use /api/v3.1/webhook_ingress/... and all webhook_endpoints CRUD URLs use /api/v3.1/webhook_endpoints/....

Other things I checked and that are fine:

  • Refactor is consistent. The new standalone configuring-webhook-endpoints.mdx page from the previous push is gone; that walkthrough now lives as the ## Configuring the webhook endpoint section in creating-triggers.mdx (creating-triggers.mdx:16). No stale /docs/setting-up-triggers/configuring-webhook-endpoints references remain anywhere under docs/content/, and setting-up-triggers/meta.json correctly does not change since no new page was added.
  • Cross-page anchors all resolve.
    • #configuring-the-webhook-endpointcreating-triggers.mdx:16 (cited from triggers.mdx, webhook-verification.mdx, troubleshooting/triggers.mdx, glossary, subscribing-to-events.mdx)
    • #using-the-sdkcreating-triggers.mdx:176
    • #webhook-endpointstriggers.mdx:20
    • #checking-which-case-applies-to-your-toolkittriggers.mdx:39
    • #ingress-signature-verificationwebhook-verification.mdx:200
  • Icons. Plug, RouteIcon, ShieldCheck, Wrench, BookOpen, Key, Zap are all imported in docs/mdx-components.tsx:29-46, so the new <Card icon={...}> usages render.
  • Walkthrough completeness. Five-step Slack flow (schema → create → store credentials → point provider at URL → confirm verified_at) is concrete enough to follow end-to-end. The "store the secret before flipping the URL" warning, the Slack auto-disable window (~36 hours), and the per-trigger app_token requirement matrix are all preserved from the previous push.
  • PATCH vs POST update semantics are clearly distinguished (creating-triggers.mdx:147-167): PATCH merges one field, POST replaces data wholesale and clears omitted fields.
  • End-to-end flow disambiguation between ingress URL (provider → Composio) and subscription URL (Composio → your app) is consistent across triggers.mdx, subscribing-to-events.mdx, and webhook-verification.mdx.
  • Glossary additions (Webhook Endpoint, Webhook Subscription) keep the two URL shapes distinct and link to the right pages.

Approving from my side. Ready when you are.
• Branch: docs/triggers-webhook-endpoints

@anshugarg15 anshugarg15 changed the title docs(triggers): introduce webhook endpoints and three delivery models docs(triggers): unify webhook-endpoint concept end-to-end May 7, 2026
Toolkit pages (e.g. /toolkits/slack) get triggers/tools server-side
from Apollo and pull a per-toolkit FAQ from
content/toolkits/faq/{slug}.md. The Slack FAQ already had a
"How do I set up Slack event webhooks?" entry but it pointed at the
legacy ingress URL; Notion had no webhook entry at all.

- slack.md: rewrite the webhook setup answer to use the
  webhook_endpoints flow (POST /webhook_endpoints, PATCH signing
  secret, optional app_token, paste URL into Event Subscriptions).
  Lead with "Composio-managed credentials = nothing to do."
  Update the "Why aren't my Slack triggers working?" answer to
  reference the same flow.
- notion.md: add a "How do I set up Notion webhook triggers?" entry
  with the same Composio-managed-vs-your-own split. Step 1 calls
  the schema endpoint as the source of truth for which credentials
  Notion needs, since I don't want to invent field names.
- Both link to /docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint
  for the canonical reference.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@claude
Copy link
Copy Markdown
Contributor

claude Bot commented May 7, 2026

Claude finished @anshugarg15's task in 3m 34s —— View job


Docs review (re-review on synchronize)

Re-applied the docs-reviewer checklist to the latest push (commit 0cb8a52, which adds the Slack and Notion FAQ entries).

  • Read docs-reviewer guidelines
  • Run git diff origin/next...HEAD
  • Verify referenced links / anchors / icon imports / parent index entries exist
  • Apply the "would a developer get stuck or be misled?" filter
  • Post review

One issue

Three new absolute internal links in the FAQ files violate docs/CLAUDE.md rule #10 ("Internal links use relative paths, never absolute") and silently bypass scripts/validate-links.ts.

File:Line Current
docs/content/toolkits/faq/slack.md:60 https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint
docs/content/toolkits/faq/slack.md:79 https://docs.composio.dev/docs/troubleshooting/triggers
docs/content/toolkits/faq/notion.md:53 https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint

Per docs/CLAUDE.md: "Never https://docs.composio.dev/.... The link checker (rule 9) only validates relative links; absolute URLs silently bypass it and rot over time." I confirmed this — validate-links.ts uses next-validate-link which only resolves relative paths, so these three links won't be caught when creating-triggers#configuring-the-webhook-endpoint or troubleshooting/triggers ever moves.

The targets all exist as relative paths today (verified #configuring-the-webhook-endpoint at creating-triggers.mdx:16 and /docs/troubleshooting/triggers exists), so this is a pure path-form swap.

Fix:

# docs/content/toolkits/faq/slack.md:60
-For the full reference (PATCH vs POST update semantics, listing endpoints, troubleshooting), see [Configuring the webhook endpoint](https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint).
+For the full reference (PATCH vs POST update semantics, listing endpoints, troubleshooting), see [Configuring the webhook endpoint](/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint).

# docs/content/toolkits/faq/slack.md:79
-For DMs, private channels, or reactions, also confirm the endpoint has an `app_token` set. See [Triggers troubleshooting](https://docs.composio.dev/docs/troubleshooting/triggers) for the full list of failure modes.
+For DMs, private channels, or reactions, also confirm the endpoint has an `app_token` set. See [Triggers troubleshooting](/docs/troubleshooting/triggers) for the full list of failure modes.

# docs/content/toolkits/faq/notion.md:53
-For the full reference (PATCH vs POST update semantics, rotating credentials, listing endpoints), see [Configuring the webhook endpoint](https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint).
+For the full reference (PATCH vs POST update semantics, rotating credentials, listing endpoints), see [Configuring the webhook endpoint](/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint).

Fix this →


Everything else looks good

  • Same-page FAQ anchor. slack.md:77#how-do-i-set-up-slack-event-webhooks slugifies cleanly from the heading at slack.md:25 and works since FAQ snippets are embedded as same-page sections in the toolkit page.
  • Glossary. New Webhook Endpoint and Webhook Subscription entries link to the right relative paths and keep the two URL shapes distinct.
  • Cross-page anchors (re-checked): #configuring-the-webhook-endpoint, #using-the-sdk, #webhook-endpoints, #checking-which-case-applies-to-your-toolkit, #ingress-signature-verification all resolve.
  • Icon imports (Plug, RouteIcon, ShieldCheck, Wrench, BookOpen, Key, Zap) are all present in docs/mdx-components.tsx:29-46.
  • Walkthrough completeness. Slack FAQ steps (create endpoint → store secret → optional app_token → paste URL → subscribe) and Notion FAQ steps (schema → create → paste URL → PATCH credentials → confirm verified_at) are concrete enough to follow.
  • Note (not flagging): the Notion FAQ pastes the URL before PATCHing credentials, which is the opposite of the Slack-shaped warning at creating-triggers.mdx:106-108 ("store the credentials before you switch the provider's callback URL"). For Notion this order is plausibly correct because the verification token is generated by Notion after you save the webhook URL on their side, so you can't PATCH it onto the endpoint earlier. Worth confirming with a Notion test, but not a blocker.

Once the three absolute URLs are flipped to relative, this is good to merge.
• Branch: docs/triggers-webhook-endpoints

Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 0cb8a52. Configure here.


<GlossaryTerm name="Webhook Subscription">
The URL Composio delivers signed events to in your application. One per project, configured via the dashboard or the [Webhook Subscriptions API](/reference/api-reference/webhooks). See [Subscribing to events](/docs/setting-up-triggers/subscribing-to-events).
</GlossaryTerm>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Glossary entries break alphabetical ordering

Low Severity

The new Webhook Endpoint and Webhook Subscription entries are inserted between Trigger Instance and User ID, breaking the glossary's alphabetical order. Since "U" sorts before "W", the User ID entry needs to appear before both new Webhook entries.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 0cb8a52. Configure here.

Targeted English fixes on triggers.mdx:

- Webhook endpoints table — drop the duplicated "for on your behalf"
  ("register webhooks for on your behalf" → "register webhooks on
  your behalf"), reflow both rows to read as full sentences instead
  of fragmented clauses.
- "There are two ways an endpoint gets configured" → "An endpoint
  is configured in one of two ways" (less awkward).
- "more toolkits move onto this flow" → "more toolkits adopt this
  flow over time" (idiomatic).
- Two webhook URLs table — "you for your-own-OAuth on toolkits"
  → "you when you bring your own OAuth app on a toolkit".
- Ingress signature paragraph — "the signing secret is sourced
  from" → "the signing secret comes from"; tighten clauses.
- Working with triggers / "Configure ingress" step — split the
  long compound sentence into two; replace parenthetical
  "(only when needed)" with a clearer lead-in.
- Next steps card — "(when needed)" → "if your toolkit needs it".

No structural changes; the table and section structure are
unchanged, just the copy.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@claude
Copy link
Copy Markdown
Contributor

claude Bot commented May 7, 2026

Claude finished @anshugarg15's task in 2m 37s —— View job


Docs review (re-review on synchronize)

Re-applied the docs-reviewer checklist to the latest push (commit 4fa33bd, prose polish on triggers.mdx).

  • Read docs-reviewer guidelines
  • Run git diff origin/next..HEAD
  • Verify referenced links / anchors / icon imports / parent index entries exist
  • Apply the "would a developer get stuck or be misled?" filter
  • Post review

The prose polish itself looks good

4fa33bd is purely copy edits on triggers.mdx — no structural or link changes, all anchors (#webhook-endpoints, #checking-which-case-applies-to-your-toolkit, #configuring-the-webhook-endpoint) still resolve, and the Zap / Plug / ShieldCheck / Wrench / BookOpen icons are still imported in docs/mdx-components.tsx. The two-row config table reads more cleanly as full sentences, and the "Configure ingress, only if your toolkit needs it" Step is clearer than the prior "(only when needed)" parenthetical.

But two issues from prior reviews are still unaddressed

The latest push didn't touch the FAQ files or the glossary, so both findings still apply on this commit.

1. Three absolute internal URLs in the FAQ files (from my 11:53Z review)

Confirmed still present via grep 'https://docs.composio.dev':

  • docs/content/toolkits/faq/slack.md:60
  • docs/content/toolkits/faq/slack.md:79
  • docs/content/toolkits/faq/notion.md:53

Per docs/CLAUDE.md rule #10: "Internal links use relative paths, never absolute. The link checker only validates relative links; absolute URLs silently bypass it and rot over time." All three targets resolve as relative paths today (/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint and /docs/troubleshooting/triggers), so this is a pure path-form swap.

2. Glossary alphabetical ordering (from Cursor Bugbot)

docs/content/docs/glossary.mdx:126-136Webhook Endpoint and Webhook Subscription are inserted before User ID, but U sorts before W. The <Glossary> component renders entries in source order (verified in docs/components/glossary.tsx — no sort), so the visual order matches the file order. The page has a filter input, so a user typing "user id" still finds it, but the rendered list reads out of order.

Move User ID (currently glossary.mdx:134-136) above Webhook Endpoint (line 126).

Fix this →


Other things I checked and that are fine

  • Anchors: #configuring-the-webhook-endpoint (creating-triggers.mdx:16), #using-the-sdk (creating-triggers.mdx:176), #webhook-endpoints (triggers.mdx:20), #checking-which-case-applies-to-your-toolkit (triggers.mdx:39), #ingress-signature-verification (webhook-verification.mdx:200), #how-do-i-set-up-slack-event-webhooks (slugifies cleanly from the FAQ heading) — all resolve.
  • Icon imports (Plug, RouteIcon, ShieldCheck, Wrench, BookOpen, Key, Zap) — all present in docs/mdx-components.tsx:29-46.
  • Walkthrough completeness: the 5-step Slack walkthrough (schema → create → store credentials → point provider at URL → confirm verified_at) and the Updating subsection (PATCH vs POST semantics) are concrete enough to follow end-to-end.
  • End-to-end flow disambiguation between ingress URL (provider → Composio) and subscription URL (Composio → your app) is consistent across triggers.mdx, subscribing-to-events.mdx, and webhook-verification.mdx.

Once the three absolute URLs are flipped to relative and the User ID glossary entry is moved above the Webhook entries, this is good to merge.
• Branch: docs/triggers-webhook-endpoints

…point flag

Rethought the structure: whether endpoint configuration is required is
a property of the trigger type, not of (toolkit + OAuth source). So:

- The trigger type exposes a `requires_webhook_endpoint` flag (forthcoming
  on the SDK / API per product direction).
- The reader inspects the trigger type. If the flag is true, configure
  the endpoint; otherwise just create.
- The toolkit-level schema endpoint is no longer a primary upfront check
  — it's used inside the configuration walkthrough as the source of
  truth for which fields to PATCH.

triggers.mdx
- Drop the "Webhook endpoints" subsection with the two-row Composio-
  configures vs you-configure table.
- Drop the "Checking which case applies to your toolkit" subsection
  with the schema-endpoint upfront check.
- Add a "Setup at a glance" table — webhook subscription always (per
  project), webhook endpoint only when required (per OAuth app),
  determined at the trigger level.
- Working-with-triggers steps now lead with "Pick a trigger type and
  inspect it" before the create step.

creating-triggers.mdx
- Reorder so the SDK and dashboard sections come first (most readers'
  path) and the 5-step "Configuring the webhook endpoint" walkthrough
  is last, gated behind "skip unless your trigger needs it."
- Code samples now print `requires_webhook_endpoint` /
  `requiresWebhookEndpoint` alongside `config`, so readers see the
  discovery moment in the same snippet.
- Walkthrough body unchanged — still discovers fields via the schema
  endpoint, creates, PATCHes credentials, points provider at URL,
  confirms verified_at.

subscribing-to-events.mdx
- Top callout reframed around the flag instead of toolkit names.

webhook-verification.mdx
- Ingress section's "your own OAuth app on a toolkit (today: Slack,
  Notion)" bullet reframed around the flag.

troubleshooting/triggers.mdx
- Section header drops the toolkit-name list.
- Lead-in note now references the flag, not "if you've configured the
  webhook endpoint yourself."

glossary.mdx
- Webhook Endpoint entry rephrased around the flag.

Toolkit FAQs (slack.md, notion.md) and meta.json unchanged — toolkit-
specific FAQs naturally talk per-toolkit, and the flag-vs-toolkit
framing doesn't change the steps users follow there.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@claude
Copy link
Copy Markdown
Contributor

claude Bot commented May 7, 2026

Claude finished @anshugarg15's task in 4m 10s —— View job


Docs review (re-review on synchronize)

Re-applied the docs-reviewer checklist to the latest push (commit 56de32c, which pivots discovery to a trigger-level requires_webhook_endpoint flag).

  • Read docs-reviewer guidelines
  • Run git diff origin/next..HEAD
  • Verify referenced links / anchors / icon imports / parent index entries exist
  • Apply the "would a developer get stuck or be misled?" filter
  • Post review

Blocker — requires_webhook_endpoint does not exist on the SDK or the API yet

The latest commit re-frames the entire flow around a requires_webhook_endpoint flag on the trigger-type response. The commit message itself acknowledges this is "forthcoming on the SDK / API per product direction" — and that's borne out by the repo state: this field exists nowhere except in this PR's docs.

I confirmed this both ways:

  • TS SDK. ts/packages/core/src/types/triggers.types.ts:152-167 defines TriggerTypeSchema as slug, name, description, instructions?, toolkit, payload, config, version? — no requiresWebhookEndpoint. composio.triggers.getType() (Triggers.ts:324) returns TriggersTypeRetrieveResponse = z.infer<typeof TriggerTypeSchema>, so the field isn't there.
  • Python SDK. python/composio/core/models/triggers.py:734 returns TriggersTypeRetrieveResponse from composio_client.types; no requires_webhook_endpoint reference anywhere in the Python tree either.
  • OpenAPI. Zero hits for requires_webhook_endpoint in docs/public/openapi.json or docs/public/openapi-v3.json.

CI confirms it. This PR's typescript-check and test jobs are both FAILING, with the same error (downloaded job-74820190446 and job-74820189991):

[2339] Property 'requiresWebhookEndpoint' does not exist on type '{ name: string; description: string; slug: string; toolkit: ...; payload: Record<string, unknown>; config: Record<string, unknown>; version?: string \| undefined; instructions?: string \| undefined; }'.

That's Twoslash failing on creating-triggers.mdx:60 (console.log(triggerType.requiresWebhookEndpoint);). The build is broken; the Vercel preview is failing for the same reason.

Cause: the snippet documents a field that isn't on the type. Both creating-triggers.mdx:60 and the matching Python snippet at :36 are misleading — a developer copying them today will hit a TypeError (TS) or AttributeError (Python).

Beyond the snippet, every place the docs tell readers to "check the flag" depends on this field shipping:

  • creating-triggers.mdx:11, :96 ("If the trigger type's requires_webhook_endpoint flag is true...")
  • triggers.mdx:21 ("composio.triggers.get_type() exposes a requires_webhook_endpoint flag")
  • triggers.mdx:39, :46 (the "Setup at a glance" table and the URL table both gate on the flag)
  • subscribing-to-events.mdx:9 (top callout gates on the flag)
  • webhook-verification.mdx:204 (Ingress section bullet gates on the flag)
  • troubleshooting/triggers.mdx:19 (whole new section is gated on "triggers whose requires_webhook_endpoint flag is true")
  • glossary.mdx:127 ("When a trigger type's requires_webhook_endpoint flag is true...")

Two ways out, pick one before merging:

  1. Land the SDK / API field first in a separate PR (add it to TriggerTypeSchema + the OpenAPI + Python types), wait for a generated-clients bump, then this PR's snippets type-check on top of it. This is the cleanest fix.
  2. Drop the flag from the prose for now and revert to the previous discovery model (toolkit-level webhook_endpoints/schema + the 400-on-create signal) until the SDK ships the field. Roughly: replace every requires_webhook_endpoint reference with "call GET /api/v3.1/webhook_endpoints/schema?toolkit_slug=... to check setup_fields", and remove the SDK code lines that print requiresWebhookEndpoint / requires_webhook_endpoint.

Either way, the build needs to be green for the docs to ship.

Fix this →


Two issues from prior reviews are still unaddressed

The latest push didn't touch the FAQ files or the glossary, so both findings still apply.

1. Three absolute internal URLs in the FAQ files (from my 11:53Z review) — confirmed still present via grep:

File:Line Current
docs/content/toolkits/faq/slack.md:60 https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint
docs/content/toolkits/faq/slack.md:79 https://docs.composio.dev/docs/troubleshooting/triggers
docs/content/toolkits/faq/notion.md:53 https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint

docs/CLAUDE.md rule #10: "Internal links use relative paths, never absolute. The link checker only validates relative links; absolute URLs silently bypass it and rot over time." Replace each https://docs.composio.dev/docs/... with /docs/....

2. Glossary alphabetical ordering (from Cursor Bugbot)glossary.mdx:126-132 puts Webhook Endpoint and Webhook Subscription before User ID (:134-136), but U sorts before W. The <Glossary> component renders entries in source order. Move the User ID block above the Webhook Endpoint block.

Fix this →


Other things I checked and that are fine

  • Anchors all resolve (re-checked): #configuring-the-webhook-endpoint (creating-triggers.mdx:94), #using-the-sdk (creating-triggers.mdx:13), #ingress-signature-verification (webhook-verification.mdx:200), #how-do-i-set-up-slack-event-webhooks (slugifies cleanly from FAQ heading).
  • Icon imports (Plug, RouteIcon, ShieldCheck, Wrench, BookOpen, Key, Zap) are all in docs/mdx-components.tsx:29-46.
  • Restructure is consistent. SDK and dashboard sections lead; the 5-step walkthrough is correctly gated under "Skip this section unless you already know you need it." End-to-end ingress vs subscription URL framing in triggers.mdx, subscribing-to-events.mdx, and webhook-verification.mdx is consistent.
  • Walkthrough completeness. The 5 walkthrough steps (schema → create → store credentials → point provider at URL → confirm verified_at), the "store credentials before flipping the URL" warning, the Slack auto-disable window, and the PATCH-vs-POST update semantics are all preserved and concrete.
  • Glossary entries (separate from the alphabetical-order issue) keep the two URL shapes distinct and link to the right pages.

Once the build is green (either ship the SDK field first, or revert the pivot to the schema-endpoint discovery model) and the two prior-review items above are addressed, this is good to merge.
• Branch: docs/triggers-webhook-endpoints

…ples

The TypeScript code block in creating-triggers.mdx accessed
triggerType.requiresWebhookEndpoint, which doesn't exist on the
SDK's TriggerType today (see ts/packages/core/src/types/triggers.types.ts:152).
Twoslash type-checks all TS code blocks at build time per docs/CLAUDE.md
rule 1, so the build failed on Vercel.

Drop the property reads (Python and TypeScript) so the samples are
valid against today's SDK. Conceptual prose still references the
requires_webhook_endpoint flag — the discovery story is unchanged,
just the code samples no longer claim the field exists yet. When the
SDK ships the field, add the reads back.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@claude
Copy link
Copy Markdown
Contributor

claude Bot commented May 7, 2026

Claude finished @anshugarg15's task in 2m 24s —— View job


Docs review (re-review on synchronize)

Re-applied the docs-reviewer checklist to the latest push (commit 68b27d2, which drops the forward-looking SDK field reads from the code samples).

  • Read docs-reviewer guidelines
  • Run git diff origin/next..HEAD
  • Verify referenced links / anchors / icon imports / parent index entries exist
  • Apply the "would a developer get stuck or be misled?" filter
  • Post review

The Twoslash blocker is resolved

68b27d2 removes the six lines that were accessing triggerType.requiresWebhookEndpoint / trigger_type.requires_webhook_endpoint in the Python and TypeScript snippets at creating-triggers.mdx:25-72. I confirmed via grep that the prose still references the requires_webhook_endpoint flag in 6 files (creating-triggers.mdx, triggers.mdx, subscribing-to-events.mdx, webhook-verification.mdx, troubleshooting/triggers.mdx, glossary.mdx) but no code block does, so Twoslash has nothing to type-check the missing field against. CI confirms — Docs Check Links is already green and Docs TS Code Validation is in progress on this commit (was failing before).

This is the right shape of fix for now. When the SDK lands the field, adding the reads back is a localized change to the two code blocks at creating-triggers.mdx:25-72.


Two issues from prior reviews are still unaddressed

The latest commit only touched creating-triggers.mdx, so both findings still apply.

1. Three absolute internal URLs in FAQ files (from my 11:53Z review)

Confirmed still present via grep 'https://docs.composio.dev':

File:Line Current
docs/content/toolkits/faq/slack.md:60 https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint
docs/content/toolkits/faq/slack.md:79 https://docs.composio.dev/docs/troubleshooting/triggers
docs/content/toolkits/faq/notion.md:53 https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint

docs/CLAUDE.md rule #10: "Internal links use relative paths, never absolute. The link checker only validates relative links; absolute URLs silently bypass it and rot over time."

Fix:

# docs/content/toolkits/faq/slack.md:60
-For the full reference (PATCH vs POST update semantics, listing endpoints, troubleshooting), see [Configuring the webhook endpoint](https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint).
+For the full reference (PATCH vs POST update semantics, listing endpoints, troubleshooting), see [Configuring the webhook endpoint](/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint).

# docs/content/toolkits/faq/slack.md:79
-For DMs, private channels, or reactions, also confirm the endpoint has an `app_token` set. See [Triggers troubleshooting](https://docs.composio.dev/docs/troubleshooting/triggers) for the full list of failure modes.
+For DMs, private channels, or reactions, also confirm the endpoint has an `app_token` set. See [Triggers troubleshooting](/docs/troubleshooting/triggers) for the full list of failure modes.

# docs/content/toolkits/faq/notion.md:53
-For the full reference (PATCH vs POST update semantics, rotating credentials, listing endpoints), see [Configuring the webhook endpoint](https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint).
+For the full reference (PATCH vs POST update semantics, rotating credentials, listing endpoints), see [Configuring the webhook endpoint](/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint).

2. Glossary alphabetical ordering (from Cursor Bugbot)

docs/content/docs/glossary.mdx:126-136Webhook Endpoint and Webhook Subscription are inserted at lines 126 and 130, but User ID is at line 134. Since U sorts before W and the <Glossary> component renders entries in source order (no sort), the visual list reads out of order. Move the User ID block (glossary.mdx:134-136) above the Webhook Endpoint block (line 126).

Fix this →


Other things I checked and that are fine

  • Anchors all resolve (re-checked): #using-the-sdk (creating-triggers.mdx:16), #configuring-the-webhook-endpoint (creating-triggers.mdx:88), #ingress-signature-verification (webhook-verification.mdx:200), #how-do-i-set-up-slack-event-webhooks (slugifies cleanly from FAQ heading).
  • Icon imports (Plug, RouteIcon, ShieldCheck, Wrench, BookOpen, Key, Zap) — all in docs/mdx-components.tsx:30-43 and registered for MDX use at lines 107-120.
  • Walkthrough completeness: the 5 walkthrough steps (schema → create → store credentials → point provider at URL → confirm verified_at), the "store credentials before flipping the URL" warning, the Slack auto-disable window (~36 hours), the per-trigger app_token requirement, and the PATCH-vs-POST update semantics are all preserved and concrete.
  • End-to-end flow disambiguation between ingress URL (provider → Composio) and subscription URL (Composio → your app) is consistent across triggers.mdx, subscribing-to-events.mdx, and webhook-verification.mdx.
  • Code samples are now SDK-correct. The Python and TS snippets at creating-triggers.mdx:25-72 print triggerType.config only — no field that doesn't exist yet. The conceptual flag references in prose are fine (markdown, not type-checked) and the PR body explicitly tracks the SDK rename as a follow-up item.

Once the three absolute URLs are flipped to relative and the User ID glossary entry is moved above the Webhook entries, this is good to merge. The Twoslash blocker is resolved.
• Branch: docs/triggers-webhook-endpoints

…n" in flow diagram

The rightmost box in the triggers-flow figure (the receiver inside
"Your Application") was labelled "Webhook Endpoint", which conflicts
with our docs vocabulary: webhook_endpoint is the Composio-side
resource that owns the ingress URL we register with the provider, not
the URL the customer's app exposes. The customer-side URL is a
webhook_subscription.

Update both the light and dark SVGs to label that box "Webhook
Subscription". Also reword the alt text on the Figure in triggers.mdx
("your webhook endpoint" → "your webhook subscription URL") so the
non-visual experience matches.

The leftmost box "Webhook Receiver" is unchanged — it's a generic
descriptive label for Composio's intake side, not a vocabulary term.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@claude
Copy link
Copy Markdown
Contributor

claude Bot commented May 7, 2026

Claude finished @anshugarg15's task in 2m 21s —— View job


Docs review (re-review on synchronize)

Re-applied the docs-reviewer checklist to the latest push (commit c912d1e, which renames the rightmost box in the triggers-flow figure from "Webhook Endpoint" → "Webhook Subscription").

  • Read docs-reviewer guidelines
  • Run git diff origin/next..HEAD
  • Verify referenced links / anchors / icon imports / parent index entries exist
  • Apply the "would a developer get stuck or be misled?" filter
  • Post review

The figure rename is correct

c912d1e is a focused vocabulary fix: the rightmost box in triggers-flow.svg / triggers-flow-dark.svg (the receiver inside "Your Application") was labelled "Webhook Endpoint" — but per this PR's new glossary entries, Webhook Endpoint is the Composio-side resource that owns the ingress URL we register with the provider, while the customer-side URL is the Webhook Subscription. Re-labelling that box to "Webhook Subscription" matches:

  • glossary.mdx:130Webhook Subscription: "The URL Composio delivers signed events to in your application."
  • triggers.mdx:46 → table row: "Webhook subscription (your URL) | Composio → your application | You, once per project"
  • triggers.mdx:38 ASCII flow → "...webhook subscription ──▶ your endpoint"

Alt text on the <Figure> is updated to match (triggers.mdx:9). The leftmost "Webhook Receiver" box is correctly left as-is — that one's a generic description of Composio's intake side, not a vocabulary term.


Two issues from prior reviews are still unaddressed

The latest commit only touches three files (triggers.mdx + the two SVGs), so both findings still apply.

1. Three absolute internal URLs in FAQ files (from my 11:53Z review)

Confirmed still present via grep 'https://docs.composio.dev':

File:Line Current
docs/content/toolkits/faq/slack.md:60 https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint
docs/content/toolkits/faq/slack.md:79 https://docs.composio.dev/docs/troubleshooting/triggers
docs/content/toolkits/faq/notion.md:53 https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint

Per docs/CLAUDE.md rule #10: "Internal links use relative paths, never absolute. The link checker only validates relative links; absolute URLs silently bypass it and rot over time."

Fix — strip https://docs.composio.dev from each:

# docs/content/toolkits/faq/slack.md:60
-For the full reference (PATCH vs POST update semantics, listing endpoints, troubleshooting), see [Configuring the webhook endpoint](https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint).
+For the full reference (PATCH vs POST update semantics, listing endpoints, troubleshooting), see [Configuring the webhook endpoint](/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint).

# docs/content/toolkits/faq/slack.md:79
-For DMs, private channels, or reactions, also confirm the endpoint has an `app_token` set. See [Triggers troubleshooting](https://docs.composio.dev/docs/troubleshooting/triggers) for the full list of failure modes.
+For DMs, private channels, or reactions, also confirm the endpoint has an `app_token` set. See [Triggers troubleshooting](/docs/troubleshooting/triggers) for the full list of failure modes.

# docs/content/toolkits/faq/notion.md:53
-For the full reference (PATCH vs POST update semantics, rotating credentials, listing endpoints), see [Configuring the webhook endpoint](https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint).
+For the full reference (PATCH vs POST update semantics, rotating credentials, listing endpoints), see [Configuring the webhook endpoint](/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint).

2. Glossary alphabetical ordering (from Cursor Bugbot)

docs/content/docs/glossary.mdxWebhook Endpoint is at line 126, Webhook Subscription at line 130, but User ID is at line 134. Since U sorts before W and <Glossary> renders entries in source order (no sort, verified in docs/components/glossary.tsx), the visual list reads out of order. Move the User ID block (glossary.mdx:134-136) above the Webhook Endpoint block (line 126).

Fix this →


Other things I checked and that are fine

  • Vocabulary is now self-consistent. Across triggers.mdx, the glossary, and the SVG, "Webhook Endpoint" = Composio-side ingress resource (signing secret + URL registered with the provider), and "Webhook Subscription" = customer-side delivery URL. The pre-rename figure was the only place this got crossed.
  • Anchors all resolve (re-checked): #configuring-the-webhook-endpoint (creating-triggers.mdx:88), #using-the-sdk (creating-triggers.mdx:16), #ingress-signature-verification (webhook-verification.mdx:200), #how-do-i-set-up-slack-event-webhooks (slugifies cleanly from FAQ heading).
  • Icon imports (Plug, RouteIcon, ShieldCheck, Wrench, BookOpen, Key, Zap) — all in docs/mdx-components.tsx.
  • Code samples at creating-triggers.mdx:25-72 print triggerType.config only — no field that doesn't exist in the SDK yet (the Twoslash blocker from 56de32c was resolved by 68b27d2 and the figure rename does not re-introduce it).
  • Walkthrough completeness: the 5-step Slack walkthrough, the "store credentials before flipping the URL" warning, the Slack auto-disable window, and the PATCH-vs-POST update semantics are all preserved and concrete.

Once the three absolute URLs are flipped to relative and the User ID glossary entry is moved above the Webhook entries, this is good to merge.
• Branch: docs/triggers-webhook-endpoints

…ng-triggers

Iteration based on review of the rendered preview.

triggers.mdx
- Webhook row: add "processes the payload" to the description so the
  table reflects what Composio does between signature verification
  and fan-out.
- Drop the "Setup at a glance" 4-column table and the second
  flag-vs-OAuth-source table — both restated content already covered
  by the bullets and the steps below.
- End-to-end flow: keep the arrow + the two URL bullets as a slim
  description; webhook-endpoint bullet links to the section in
  creating-triggers (not a standalone page).
- Drop the "Two webhook URLs" duplicate table inside End-to-end flow.
- "Working with triggers" steps already lead with subscription
  before create — no change.
- Next-steps cards reordered: Subscribing first (one-time per
  project), then Creating, then the situational Configuring the
  webhook endpoint card linking to the section anchor inside
  Creating triggers.

creating-triggers.mdx
- Restore the "Configuring the webhook endpoint" section (5 steps +
  Updating subsection) as a section, not a separate page. Earlier
  iteration tried a standalone page; reverted per direction
  (customers should hit a short note in triggers.mdx and follow it
  to a section in creating-triggers).
- Remove the in-page configuring page link from the next-steps cards;
  reuse the slot for "Subscribing to events".
- Prereq callout adds: webhook subscription must exist on the project
  so events have somewhere to land.

Cross-references in subscribing-to-events.mdx, webhook-verification.mdx,
troubleshooting/triggers.mdx, glossary.mdx, slack/notion FAQs all
already point at creating-triggers#configuring-the-webhook-endpoint
— no further change needed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@claude
Copy link
Copy Markdown
Contributor

claude Bot commented May 7, 2026

Claude finished @anshugarg15's task in 2m 30s —— View job


Docs review (re-review on synchronize)

Re-applied the docs-reviewer checklist to the latest push (commit 916894f, which trims the concept page).

  • Read docs-reviewer guidelines
  • Run git diff origin/next..HEAD
  • Verify referenced links / anchors / icon imports / parent index entries exist
  • Apply the "would a developer get stuck or be misled?" filter
  • Post review

The trim is the right call

916894f removes two pieces of content that were restating things already covered elsewhere on the page — the 4-column "Setup at a glance" table and the duplicate "Two webhook URLs" table inside End-to-end flow. The page now reads:

  1. Two delivery types — webhook vs polling, one row each
  2. End-to-end flow — the arrow diagram + the two URL bullets + the two-signatures bullets (kept; this is the disambiguation framing every downstream page builds on)
  3. Working with triggers — six-step <Steps> block, lead with subscription before create
  4. Trigger type / instance accordions
  5. Next steps Cards reordered to put Subscribing first (one-time per project), then Creating, then the situational Configuring card

Anchors I sanity-checked after the trim: #configuring-the-webhook-endpoint (creating-triggers.mdx:89), #using-the-sdk (creating-triggers.mdx:17), #ingress-signature-verification (webhook-verification.mdx:200) — all resolve. The card link text "Subscribing to triggers" matches the actual page title (subscribing-to-events.mdx frontmatter is title: Subscribing to triggers). Icons (Plug, RouteIcon, ShieldCheck, Wrench, BookOpen, Key, Zap) and the Steps / Step components are all imported and registered in docs/mdx-components.tsx:30-43, 75-76, 107-120.

Restoring the "Configuring the webhook endpoint" section inside creating-triggers.mdx (:89-243) rather than as a standalone page is the right shape — readers landing on creating-triggers can scroll down to the situational walkthrough without a context switch, and every cross-reference in the rest of the docs (triggers.mdx, webhook-verification.mdx, troubleshooting/triggers.mdx, glossary, slack/notion FAQs) already points at the section anchor.


Two issues from prior reviews are still unaddressed

The latest commit only touches triggers.mdx and creating-triggers.mdx, so both findings still apply.

1. Three absolute internal URLs in FAQ files (from my 11:53Z review)

Confirmed still present via grep 'https://docs.composio.dev':

File:Line Current
docs/content/toolkits/faq/slack.md:60 https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint
docs/content/toolkits/faq/slack.md:79 https://docs.composio.dev/docs/troubleshooting/triggers
docs/content/toolkits/faq/notion.md:53 https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint

docs/CLAUDE.md rule #10: "Internal links use relative paths, never absolute. The link checker only validates relative links; absolute URLs silently bypass it and rot over time."

Fix — strip https://docs.composio.dev from each:

# docs/content/toolkits/faq/slack.md:60
-For the full reference (PATCH vs POST update semantics, listing endpoints, troubleshooting), see [Configuring the webhook endpoint](https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint).
+For the full reference (PATCH vs POST update semantics, listing endpoints, troubleshooting), see [Configuring the webhook endpoint](/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint).

# docs/content/toolkits/faq/slack.md:79
-For DMs, private channels, or reactions, also confirm the endpoint has an `app_token` set. See [Triggers troubleshooting](https://docs.composio.dev/docs/troubleshooting/triggers) for the full list of failure modes.
+For DMs, private channels, or reactions, also confirm the endpoint has an `app_token` set. See [Triggers troubleshooting](/docs/troubleshooting/triggers) for the full list of failure modes.

# docs/content/toolkits/faq/notion.md:53
-For the full reference (PATCH vs POST update semantics, rotating credentials, listing endpoints), see [Configuring the webhook endpoint](https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint).
+For the full reference (PATCH vs POST update semantics, rotating credentials, listing endpoints), see [Configuring the webhook endpoint](/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint).

2. Glossary alphabetical ordering (Cursor Bugbot)

docs/content/docs/glossary.mdx — re-checked: Webhook Endpoint is at line 126, Webhook Subscription at line 130, User ID at line 134. Since U sorts before W and <Glossary> renders entries in source order (no sort, verified in docs/components/glossary.tsx), the visual list reads out of order. Move the User ID block (glossary.mdx:134-136) above the Webhook Endpoint block (line 126).

Fix this →


Other things I checked and that are fine

  • No new content was added that needs validation. 916894f is purely a removal of restated content — no new fields documented, no new code samples, no new external references.
  • Walkthrough content under ## Configuring the webhook endpoint is unchanged from the prior reviewed state (5 steps + Updating subsection): schema → create → store credentials → point provider at URL → confirm verified_at. The "store credentials before flipping the URL" warning, the Slack ~36 hour auto-disable window, the per-trigger app_token requirement, and the PATCH-vs-POST update semantics are all preserved.
  • Code samples at creating-triggers.mdx:25-72 print triggerType.config only — no field that doesn't exist in the SDK yet (the Twoslash blocker from 56de32c was resolved by 68b27d2 and not re-introduced here).
  • Prereqs callout correctly adds the webhook subscription as a prerequisite, since events need somewhere to land regardless of whether the trigger requires its own webhook endpoint.
  • End-to-end flow disambiguation between ingress URL (provider → Composio) and subscription URL (Composio → your app) remains consistent across triggers.mdx, subscribing-to-events.mdx, and webhook-verification.mdx.

Once the three absolute URLs are flipped to relative and the User ID glossary entry is moved above the Webhook entries, this is good to merge.
• Branch: docs/triggers-webhook-endpoints

…unmixed per page

Per review:
- triggers.mdx feels duplicative when it both summarizes setup and
  links to workflow pages that cover the same.
- subscribing-to-events.mdx introduces "webhook endpoints" in a
  callout, which mixes two distinct concepts on a page that should
  only own the subscription side.

triggers.mdx
- "Two delivery types" renamed to "Two trigger types".
- Drop the trailing "..." in webhook examples; remove GitHub.
- Add "Google Calendar" to polling examples.
- Add "processes the payload" to the Webhook row description.
- Drop the "End-to-end flow" section (arrow + two URL bullets +
  signature bullets). The Figure at the top already conveys the
  visual; signature behavior is documented on webhook-verification.mdx.
- Drop the "Working with triggers" 6-step list. The Next steps
  cards orient readers to the workflow pages, which own the
  step-by-step content.
- Add a single-sentence note between the trigger types table and
  the Accordions: "If you bring your own OAuth app for a webhook
  trigger, you may need to register the Composio-issued ingress URL
  with the provider once per OAuth app — see Configuring the webhook
  endpoint." Composio handles it for you in most cases.

subscribing-to-events.mdx
- Remove the top "two webhook URLs" callout. The page is about
  subscriptions; bringing in webhook endpoints here added complexity
  that belongs on the concept and workflow pages, not here.

Net: triggers.mdx goes from ~85 lines to ~42; concepts stay separated
per page (subscription on its own page, endpoint on creating-triggers).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@claude
Copy link
Copy Markdown
Contributor

claude Bot commented May 7, 2026

Claude finished @anshugarg15's task in 2m 33s —— View job


Docs review (re-review on synchronize)

Re-applied the docs-reviewer checklist to the latest push (commit 5aa9430, which slims triggers.mdx to orientation only and drops the two-URLs callout from subscribing-to-events.mdx).

  • Read docs-reviewer guidelines
  • Run git diff origin/next..HEAD
  • Verify referenced links / anchors / icon imports / parent index entries exist
  • Apply the "would a developer get stuck or be misled?" filter
  • Post review

The slim is the right call, and the per-page concept separation is now clean

5aa9430 removes two pieces of content from triggers.mdx that were duplicating what the workflow pages own (the "End-to-end flow" arrow + URL bullets, and the "Working with triggers" 6-step list), and removes the top "two webhook URLs" callout from subscribing-to-events.mdx that was bleeding the webhook-endpoint concept onto the subscription page.

After this commit each page owns one concept:

  • triggers.mdx — orientation: hero figure → 2-row trigger types table → BYOC note that routes to Configuring the webhook endpoint → accordions → Next steps
  • subscribing-to-events.mdx — webhook subscriptions only (no webhook-endpoint cross-talk)
  • creating-triggers.mdx — SDK / dashboard, then the situational ## Configuring the webhook endpoint walkthrough
  • webhook-verification.mdx — delivery + ingress signature verification (one section each)

That's a cleaner mental model than the pre-trim version. Anchors I sanity-checked after the trim:

  • #configuring-the-webhook-endpoint (creating-triggers.mdx:89) — referenced from triggers.mdx:18, triggers.mdx:38, webhook-verification.mdx:204, 207, troubleshooting/triggers.mdx:19, 22, glossary.mdx:127
  • #using-the-sdk (creating-triggers.mdx:17) — referenced from creating-triggers.mdx:218
  • #ingress-signature-verification (webhook-verification.mdx:200) — referenced from webhook-verification.mdx:9
  • #how-do-i-set-up-slack-event-webhooks (slack.md:25) — same-page reference at slack.md:77

All resolve. No stale references to removed anchors (#three-delivery-models, #end-to-end-flow, #working-with-triggers, #webhook-endpoints, #checking-which-case-applies-to-your-toolkit) remain anywhere under docs/content/.

Icons (Plug, RouteIcon, ShieldCheck, Wrench, BookOpen, Key, Zap) all imported in docs/mdx-components.tsx:30-43 and registered for MDX use at lines 107-120.


Two issues from prior reviews are still unaddressed

The latest commit only touched triggers.mdx and subscribing-to-events.mdx, so both findings still apply.

1. Three absolute internal URLs in FAQ files (from my 11:53Z review)

Confirmed still present via grep 'https://docs.composio.dev':

File:Line Current
docs/content/toolkits/faq/slack.md:60 https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint
docs/content/toolkits/faq/slack.md:79 https://docs.composio.dev/docs/troubleshooting/triggers
docs/content/toolkits/faq/notion.md:53 https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint

docs/CLAUDE.md rule #10: "Internal links use relative paths, never absolute. The link checker only validates relative links; absolute URLs silently bypass it and rot over time."

Fix — strip https://docs.composio.dev from each:

# docs/content/toolkits/faq/slack.md:60
-...see [Configuring the webhook endpoint](https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint).
+...see [Configuring the webhook endpoint](/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint).

# docs/content/toolkits/faq/slack.md:79
-...See [Triggers troubleshooting](https://docs.composio.dev/docs/troubleshooting/triggers) for the full list of failure modes.
+...See [Triggers troubleshooting](/docs/troubleshooting/triggers) for the full list of failure modes.

# docs/content/toolkits/faq/notion.md:53
-...see [Configuring the webhook endpoint](https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint).
+...see [Configuring the webhook endpoint](/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint).

2. Glossary alphabetical ordering (Cursor Bugbot)

docs/content/docs/glossary.mdx re-checked: Webhook Endpoint is at line 126, Webhook Subscription at line 130, User ID at line 134. Since U sorts before W and <Glossary> renders entries in source order (no sort, verified in docs/components/glossary.tsx), the visual list reads out of order. Move the User ID block (glossary.mdx:134-136) above the Webhook Endpoint block (line 126).

Fix this →


Other things I checked and that are fine

  • Trim doesn't introduce any broken cross-references. Every anchor that other pages link into still exists. The removed sections (#three-delivery-models, #end-to-end-flow, #working-with-triggers, #webhook-endpoints, #checking-which-case-applies-to-your-toolkit) are not referenced from anywhere under docs/content/ after the trim.
  • The requires_webhook_endpoint references are prose-only (no code blocks read it), so the Twoslash blocker from 56de32c stays resolved. Five places in the prose: creating-triggers.mdx:15, :91, webhook-verification.mdx:207, troubleshooting/triggers.mdx:19, glossary.mdx:127. The PR body explicitly tracks the SDK rename as a follow-up item.
  • Hero figure alt text (triggers.mdx:9) updated to "webhook subscription URL" to match the rename in the SVG (c912d1e); consistent vocabulary across figure / table / glossary.
  • Walkthrough completeness in creating-triggers.mdx is unchanged (5 steps + Updating subsection, "store credentials before flipping the URL" warning, ~36-hour Slack auto-disable window, per-trigger app_token requirement, PATCH-vs-POST update semantics).
  • Minor (not flagging): the Trigger glossary entry lists Slack, GitHub, Asana as webhook examples, while triggers.mdx lists Slack, Asana, Notion, Outlook. Both are factually correct; varying examples per page is fine.

Once the three absolute URLs are flipped to relative and the User ID glossary entry is moved above the Webhook entries, this is good to merge.
• Branch: docs/triggers-webhook-endpoints

The intro was cramming five things into one runaway sentence: where
you can create triggers, the Composio-managed flow, the
bring-your-own-OAuth flow, the requires_webhook_endpoint_setup flag,
and the 400 status code. Plus a meta "see Configuring below" pointer.

Reduced to two short sentences. Flag name and 400 status drop out —
the Configuring section's own intro already explains both, so they
don't need to be teased here. Reader gets oriented (SDK or dashboard)
with a soft anchor for the conditional case.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@claude
Copy link
Copy Markdown
Contributor

claude Bot commented May 7, 2026

Claude finished @anshugarg15's task in 3m 11s —— View job


Docs review (re-review on synchronize)

Re-applied the docs-reviewer checklist to the latest push (commit b0b8580, which tightens the intro paragraph in creating-triggers.mdx).

  • Read docs-reviewer guidelines
  • Run git diff origin/next..HEAD -- docs/
  • Verify referenced links / anchors / icon imports / parent index entries exist
  • Apply the "would a developer get stuck or be misled?" filter
  • Post review

The intro tightening is the right call

b0b8580 reduces a runaway sentence at creating-triggers.mdx:15 to two short ones:

You can create triggers using the SDK or the Composio dashboard. Some webhook triggers also need a webhook endpoint configured first — covered in Configuring the webhook endpoint below.

Drops the flag name and the 400 status from the intro — both are explained in the Configuring section's own intro at :91, so they don't need to be teased here. The #configuring-the-webhook-endpoint anchor still resolves and the section is one click away. Good edit.


Four issues from prior reviews are still unaddressed

b0b8580 only touches the intro paragraph, so all four findings from earlier reviews still apply.

1. Secret-callout claim still contradicts the OpenAPI on this branch (highest impact — silently breaks customers who follow the docs)

webhook-verification.mdx:14, 64 still read:

Store the webhook secret securely as COMPOSIO_WEBHOOK_SECRET. You can fetch it from the webhook subscription at any time or rotate it if it leaks.

Re-verified on HEAD (docs/public/openapi.json):

Line Content
:10529 "The signing secret is returned only on creation." (POST /webhook_subscriptions)
:10759, :10903, :11057 "description": "Masked signing secret (full secret only on create/rotate)" (the secret field on GET, POST, and rotate-secret responses)

A customer who lost their secret follows the new copy, GETs the subscription, gets a masked value, pastes it into COMPOSIO_WEBHOOK_SECRET, and watches HMAC verification fail silently on every request. Pick (1) wait for companion PR #3238 to land an OpenAPI where the GET description no longer says "Masked", or (2) revert the wording. Suggested option-2 fix:

-Store the webhook secret securely as `COMPOSIO_WEBHOOK_SECRET`. You can fetch it from the [webhook subscription](/reference/api-reference/webhooks/getWebhookSubscriptionsById) at any time or [rotate it](/reference/api-reference/webhooks/postWebhookSubscriptionsByIdRotateSecret) if it leaks.
+The full secret is only returned when you [create a webhook subscription](/reference/api-reference/webhooks/postWebhookSubscriptions) or [rotate it](/reference/api-reference/webhooks/postWebhookSubscriptionsByIdRotateSecret); the [GET endpoint](/reference/api-reference/webhooks/getWebhookSubscriptionsById) returns a masked value. Store it securely as `COMPOSIO_WEBHOOK_SECRET`; if you lose it, rotate.

2. FAQ ↔ deleted-troubleshooting-section mismatch (from my 15:27Z review)

Commit 649d923 deleted the "Webhook endpoint issues" section from troubleshooting/triggers.mdx (verified — that page now only covers Unable to create trigger, Not receiving payloads, Type errors with trigger payloads, Reporting issues, Getting help). But slack.md:39 still promises:

See Triggers troubleshooting for the common failure modes — signing secret missing, verified_at null, missing app-level token, and replay-window rejections.

A Slack customer hitting one of those four modes, clicking the link, and landing on the page now sees only generic "check permissions / publicly accessible URL / trigger enabled / logs" content — none of the four specific failures. Pick:

  • Restore the section in troubleshooting/triggers.mdx (better — "endpoint worked yesterday, today it doesn't" content fits a troubleshooting page, not a setup walkthrough), or
  • Re-point the FAQ link at /docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint and rephrase to drop the "common failure modes" promise.

3. Two absolute internal URLs in slack.md

Confirmed via grep 'https://docs.composio.dev' docs/content/toolkits/faq/slack.md:

File:Line Current
docs/content/toolkits/faq/slack.md:27 https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint
docs/content/toolkits/faq/slack.md:39 https://docs.composio.dev/docs/troubleshooting/triggers

docs/CLAUDE.md rule #10: "Internal links use relative paths, never absolute. The link checker only validates relative links; absolute URLs silently bypass it and rot over time."

# slack.md:27
-...see [Configuring the webhook endpoint](https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint).
+...see [Configuring the webhook endpoint](/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint).

# slack.md:39 (also see issue 2 above)
-See [Triggers troubleshooting](https://docs.composio.dev/docs/troubleshooting/triggers) for...
+See [Triggers troubleshooting](/docs/troubleshooting/triggers) for...

4. Glossary alphabetical ordering (Cursor Bugbot)

docs/content/docs/glossary.mdx re-checked: Webhook Endpoint at line 126, Webhook Subscription at line 130, User ID at line 134. Since U sorts before W and <Glossary> renders entries in source order (no sort, verified in docs/components/glossary.tsx), the visual list reads out of order. Move the User ID block (glossary.mdx:134-136) above the Webhook Endpoint block (line 126).

Fix all four →


Other things I checked and that are fine

  • Anchors all resolve (re-checked): #configuring-the-webhook-endpoint (creating-triggers.mdx:89), #using-the-sdk (creating-triggers.mdx:17), #using-the-dashboard (creating-triggers.mdx:79), #how-do-i-set-up-slack-event-webhooks (slugifies cleanly from FAQ heading at slack.md:25).
  • Icon imports (Plug, RouteIcon, ShieldCheck, Wrench, BookOpen, Key, Zap) — all in docs/mdx-components.tsx.
  • Twoslash unaffected. Code samples at creating-triggers.mdx:25-72 print triggerType.config only — no field that doesn't exist in the SDK yet.
  • Walkthrough completeness preserved at creating-triggers.mdx:89-249: 5 walkthrough steps (schema → create → store credentials → point provider at URL → confirm verified_at), the "store credentials before flipping the URL" warning, the Slack ~36-hour auto-disable window, the per-trigger app_token requirement, the re-handshake-rejection security note, and the PATCH-vs-POST update semantics.
  • End-to-end flow disambiguation between ingress URL (provider → Composio) and subscription URL (Composio → your app) remains consistent across triggers.mdx, subscribing-to-events.mdx, and webhook-verification.mdx.
  • Minor (not blocking): requires_webhook_endpoint_setup is referenced in 2 places (creating-triggers.mdx:91, glossary.mdx:127) — down from earlier as expected after b0b8580 dropped one reference. Still not on the SDK or OpenAPI; the PR body tracks it as a follow-up. Prose-only, so Twoslash isn't affected.

Once the secret-callout claim is reconciled with the OpenAPI (most important — silent HMAC verification failure for customers who follow the docs), the FAQ↔troubleshooting mismatch is resolved, the two absolute URLs are flipped to relative, and the User ID glossary entry is moved above the Webhook entries, this is good to merge.

…bullets

The two prose paragraphs about per-tenant guarantees and ingress
signature checks were dense walls of text. Restructure as bullets
matching the V2 announcement changelog's format. Each item now
stands on its own line, scannable.

Word-level edits:
- "since providers accept" → "providers accept" (drop redundant
  conjunction; colon does the work)
- "The upside:" → "In return," — acknowledges it's a trade
- "every project becomes its own webhook tenant with isolated..."
  → restructured as a lead-in followed by 4 bullets
- "Provider events are verified at ingress against the endpoint's
  signing secret before any trigger fires —" → "Every inbound event
  is signature-checked at ingress before any trigger fires:" —
  active, shorter
- Replay protection bullet is no longer a "for providers..."
  parenthetical; it's its own item

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@claude
Copy link
Copy Markdown
Contributor

claude Bot commented May 7, 2026

Claude finished @anshugarg15's task in 3m 3s —— View job


Docs review (re-review on synchronize)

Re-applied the docs-reviewer checklist to the latest two pushes (b0b85804 tightens the intro paragraph in creating-triggers.mdx; e19792c0 converts the project-tenant upsides + signature-verification paragraphs to bulleted lists).

  • Read docs-reviewer guidelines
  • Run git diff origin/next..HEAD
  • Verify referenced links / anchors / icon imports / parent index entries exist
  • Apply the "would a developer get stuck or be misled?" filter
  • Post review

The latest two commits look good

Both edits are scoped to creating-triggers.mdx and improve readability without introducing factual issues:

  • b0b85804 rewrites the post-prereqs sentence at creating-triggers.mdx:15 from a flag-conditional ("If you bring your own OAuth app and the trigger type's requires_webhook_endpoint_setup flag is true, the create call returns a 400...") to a one-liner ("Some webhook triggers also need a webhook endpoint configured first — covered in Configuring the webhook endpoint below"). This is the right call given the field doesn't exist on the SDK or OpenAPI yet — readers landing on the page no longer encounter a name they can't find anywhere else. The full flag explanation still appears once at creating-triggers.mdx:91 inside the situational walkthrough section, where it's needed.
  • e19792c0 breaks two dense paragraphs at creating-triggers.mdx:99-110 into structured bullets. The "every project becomes its own webhook tenant" upsides (rate limits + signing secret + handshake-rejection guarantee + clean fan-out + per-project metering) and the three signature-verification points (HMAC-SHA256/Ed25519 schemes, timestamp replay protection, 400 for unsigned/tampered) read more cleanly as scannable lists. No content lost; the handshake-rejection sentence is preserved as a sub-bullet under "Its own signing secret and app-level token".

Anchors I rechecked after the edits — all resolve:

  • #configuring-the-webhook-endpoint (creating-triggers.mdx:89) — referenced from creating-triggers.mdx:15, glossary :127, slack FAQ :27, etc.
  • #using-the-sdk (creating-triggers.mdx:17)
  • #using-the-dashboard (creating-triggers.mdx:79)

Icons and Twoslash unaffected (commits don't touch any code blocks or component imports).


Four issues from prior reviews are still unaddressed

The latest two commits only touched creating-triggers.mdx, so all prior-review findings still apply on this commit.

1. Secret-callout claim contradicts the OpenAPI on this branch — highest impact

Still present at webhook-verification.mdx:14 and :64:

Store the webhook secret securely as COMPOSIO_WEBHOOK_SECRET. You can fetch it from the webhook subscription at any time or rotate it if it leaks.

OpenAPI on HEAD says the opposite (docs/public/openapi.json):

Line Content
:10529 "The signing secret is returned only on creation."
:10759, :10903, :11057 "description": "Masked signing secret (full secret only on create/rotate)"

A developer who lost their secret follows the new copy, GETs the subscription, gets a masked value, pastes it into COMPOSIO_WEBHOOK_SECRET, and watches HMAC verification fail silently. Pick: (1) wait for companion PR #3238 to land an OpenAPI where the GET response's secret description no longer says "Masked"; (2) revert the wording. Suggested option-2 fix:

-Store the webhook secret securely as `COMPOSIO_WEBHOOK_SECRET`. You can fetch it from the [webhook subscription](/reference/api-reference/webhooks/getWebhookSubscriptionsById) at any time or [rotate it](/reference/api-reference/webhooks/postWebhookSubscriptionsByIdRotateSecret) if it leaks.
+The full secret is only returned when you [create a webhook subscription](/reference/api-reference/webhooks/postWebhookSubscriptions) or [rotate it](/reference/api-reference/webhooks/postWebhookSubscriptionsByIdRotateSecret); the [GET endpoint](/reference/api-reference/webhooks/getWebhookSubscriptionsById) returns a masked value. Store it securely as `COMPOSIO_WEBHOOK_SECRET`; if you lose it, rotate.

2. FAQ ↔ deleted-troubleshooting-section mismatch (introduced in 649d9239)

slack.md:39:

See Triggers troubleshooting for the common failure modes — signing secret missing, verified_at null, missing app-level token, and replay-window rejections.

But verified via grep on troubleshooting/triggers.mdx: the words signing secret, verified_at, app-level token, and replay-window are no longer anywhere on that page (the "Webhook endpoint issues" section was deleted in 649d9239). A Slack customer hitting one of those failures, clicking the FAQ link, and landing on the troubleshooting page sees only generic "check permissions / publicly accessible URL / trigger enabled / logs" content. Pick:

  1. Restore the deleted section in troubleshooting/triggers.mdx — natural place for "endpoint worked yesterday, today it doesn't" content.
  2. Update the FAQ link target to /docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint and rephrase to drop the "common failure modes" promise.

3. Two absolute internal URLs in slack.md (rule #10 violation)

File:Line Current
docs/content/toolkits/faq/slack.md:27 https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint
docs/content/toolkits/faq/slack.md:39 https://docs.composio.dev/docs/troubleshooting/triggers

Per docs/CLAUDE.md rule #10: "Internal links use relative paths, never absolute. The link checker only validates relative links; absolute URLs silently bypass it and rot over time." Strip https://docs.composio.dev.

4. Glossary alphabetical ordering (Cursor Bugbot)

docs/content/docs/glossary.mdx re-checked: Webhook Endpoint at line 126, Webhook Subscription at line 130, User ID at line 134. U sorts before W and <Glossary> renders entries in source order (no sort, verified in docs/components/glossary.tsx). Move User ID (:134-136) above Webhook Endpoint (:126).

Fix all four →


Other things I checked and that are fine

  • Twoslash unaffected. Code samples at creating-triggers.mdx:25-72 print triggerType.config only — no field that doesn't exist in the SDK yet (the Twoslash blocker from 56de32c was resolved by 68b27d2 and not re-introduced here).
  • Anchors all resolve (re-checked): #configuring-the-webhook-endpoint, #using-the-sdk, #using-the-dashboard, #how-do-i-set-up-slack-event-webhooks, #ingress-signature-verification.
  • Icon imports (Plug, RouteIcon, ShieldCheck, Wrench, BookOpen, Key, Zap) — all in docs/mdx-components.tsx.
  • Walkthrough completeness preserved. The 5 walkthrough steps (schema → create → store credentials → point provider at URL → confirm verified_at), the "store credentials before flipping the URL" warning, the Slack ~36 hour auto-disable window, the per-trigger app_token requirement, and the PATCH-vs-POST update semantics are all intact at creating-triggers.mdx:89-247.
  • End-to-end flow disambiguation between ingress URL (provider → Composio) and subscription URL (Composio → your app) remains consistent across triggers.mdx, subscribing-to-events.mdx, and webhook-verification.mdx.
  • Minor (not blocking): requires_webhook_endpoint_setup is still referenced in 2 places (creating-triggers.mdx:91, glossary.mdx:127) but is not on the SDK or OpenAPI yet (verified absent from ts/packages/core/src/types/triggers.types.ts and both OpenAPI files). The PR body tracks the SDK addition as a follow-up; the field is prose-only here so Twoslash isn't affected. Worth confirming the canonical name (requires_webhook_endpoint per the PR body vs. requires_webhook_endpoint_setup in the docs) with whoever owns the SDK addition before merging.

Once the four items above are resolved (the secret-callout claim being the most impactful — it'll silently break customers who follow the docs), this is good to merge.

anshugarg15 and others added 2 commits May 7, 2026 21:05
…d as inspection note

Step 5 ("Confirm the endpoint is verified" by GETting and checking
verified_at) wasn't in the V2 changelog walkthrough. The changelog
goes from "point provider dashboard at URL" straight to "create V2
trigger instances" — the trigger create call is itself the natural
confirmation, since it'll fail if the endpoint didn't verify.

Verified in the changelog: `verified_at` IS a real field returned by
GET /api/v3.1/webhook_endpoints/{id} (changelog line 44 lists the
endpoint as "Get a single endpoint, including verified_at"). So the
field exists; just the standalone confirmation step doesn't.

- Step 4's last sentence now ends with the natural next-action
  ("Once the provider saves the URL, retry the trigger creation
  call from Using the SDK") instead of a separate Step 5.
- Add a GET-by-id example to "Updating an endpoint" so verified_at
  remains discoverable as an inspection tool when needed, just not
  promoted to a mandatory step.

Walkthrough collapses to 4 steps, matching the changelog structure.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Two issues flagged on review:

1. "Retry the trigger creation call" in step 4 implied the user had
   already failed once. First-time setup users hadn't tried at all.
   Reword to "head back to Using the SDK to create your trigger".

2. verified_at isn't universal — providers that don't run a URL
   verification handshake never populate it. Telling readers to
   check verified_at would mislead them on toolkits that don't
   verify. Remove all verified_at references from the docs:
   - creating-triggers.mdx Step 4 ending: drop the verified_at
     framing; reword the verification challenge sentence to lead
     with "for providers that issue a verification challenge on
     save" so providers without a handshake aren't misframed.
   - creating-triggers.mdx "Updating an endpoint": drop the
     "(handy for checking verified_at after a provider re-save)"
     parenthetical from the GET-by-id example.
   - slack.md FAQ: simplify the "Why aren't my Slack triggers
     working?" answer to just point at the troubleshooting page,
     dropping the enumerated failure-mode list (which referenced
     verified_at and is no longer on the troubleshooting page
     anyway).

The changelog mention of verified_at (line 44 of the V2 announcement)
is left intact — historical reference, shouldn't be retroactively
edited.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@claude
Copy link
Copy Markdown
Contributor

claude Bot commented May 7, 2026

Claude finished @anshugarg15's task in 3m 34s —— View job


Docs review (re-review on synchronize)

Re-applied the docs-reviewer checklist to the latest two pushes (562452e drops Step 5 "Confirm the endpoint is verified" and reframes Step 4's ending; 107734b removes verified_at references from creating-triggers.mdx and simplifies the "Why aren't my Slack triggers working?" FAQ to drop the failure-mode list).

  • Read docs-reviewer guidelines
  • Run git diff origin/next..HEAD
  • Verify referenced links / anchors / icon imports / parent index entries exist
  • Apply the "would a developer get stuck or be misled?" filter
  • Post review

The latest two commits are good

Both edits remove content that would have misled readers, leaving the walkthrough cleaner:

  • 562452e drops the standalone Step 5 (GET and check verified_at) and folds its action into Step 4's ending: "Once the provider accepts the URL, head back to Using the SDK to create your trigger." This collapses the walkthrough to 4 steps and matches the V2 changelog structure (where the trigger-create call is the natural confirmation — it'll fail if the endpoint didn't verify). The verified_at field stays discoverable as an inspection tool via the GET /webhook_endpoints/<id> example in Updating an endpoint, just not promoted to a mandatory step.
  • 107734b drops verified_at from the Step 4 narrative ("For providers that issue a verification challenge on save") and from the "(handy for checking verified_at after a provider re-save)" parenthetical on the GET example. Important fix: not every provider runs a verification handshake, so telling readers to wait for verified_at to populate would mislead them on toolkits that don't verify. The "head back to Using the SDK" anchor resolves cleanly to creating-triggers.mdx:17.

The same commit also resolves my earlier flag about the FAQ ↔ deleted-troubleshooting-section mismatch. slack.md:39 is now See [Triggers troubleshooting](https://docs.composio.dev/docs/troubleshooting/triggers). — a generic pointer with no specific-failure-mode promise. The link target is generic guidance, which matches what the page actually contains, so the misleading-promise issue from prior reviews is gone.

Anchors I resanity-checked: #using-the-sdk (creating-triggers.mdx:17), #using-the-dashboard (:79), #configuring-the-webhook-endpoint (:89), #how-do-i-set-up-slack-event-webhooks (slugifies cleanly from the FAQ heading at slack.md:25) — all resolve. Icons (Plug, RouteIcon, ShieldCheck, Wrench, BookOpen, Key, Zap) all imported in docs/mdx-components.tsx. Twoslash unaffected — code samples at creating-triggers.mdx:25-72 print triggerType.config only.


Three issues from prior reviews are still unaddressed

The latest two commits don't touch the secret callouts, the FAQ link path-form, or the glossary, so all three findings still apply.

1. Secret-callout claim still contradicts the OpenAPI on this branch — highest impact

Still present at webhook-verification.mdx:14 and :64:

Store the webhook secret securely as COMPOSIO_WEBHOOK_SECRET. You can fetch it from the webhook subscription at any time or rotate it if it leaks.

OpenAPI on HEAD says the opposite (re-verified docs/public/openapi.json):

Line Content
:10529 "The signing secret is returned only on creation." (POST /webhook_subscriptions)
:10759, :10903, :11057 "description": "Masked signing secret (full secret only on create/rotate)" (the secret field on GET, POST, and rotate-secret responses)

A customer who lost their secret follows the new copy, GETs the subscription, gets a masked value, pastes it into COMPOSIO_WEBHOOK_SECRET, and watches HMAC verification fail silently on every request. Pick: (1) wait for companion PR #3238 to land an OpenAPI where the GET response's secret description no longer says "Masked"; (2) revert the wording. Suggested option-2 fix:

-Store the webhook secret securely as `COMPOSIO_WEBHOOK_SECRET`. You can fetch it from the [webhook subscription](/reference/api-reference/webhooks/getWebhookSubscriptionsById) at any time or [rotate it](/reference/api-reference/webhooks/postWebhookSubscriptionsByIdRotateSecret) if it leaks.
+The full secret is only returned when you [create a webhook subscription](/reference/api-reference/webhooks/postWebhookSubscriptions) or [rotate it](/reference/api-reference/webhooks/postWebhookSubscriptionsByIdRotateSecret); the [GET endpoint](/reference/api-reference/webhooks/getWebhookSubscriptionsById) returns a masked value. Store it securely as `COMPOSIO_WEBHOOK_SECRET`; if you lose it, rotate.

2. Two absolute internal URLs in slack.md (rule #10 violation)

Confirmed via grep 'docs.composio.dev':

File:Line Current
docs/content/toolkits/faq/slack.md:27 https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint
docs/content/toolkits/faq/slack.md:39 https://docs.composio.dev/docs/troubleshooting/triggers

Per docs/CLAUDE.md rule #10: "Internal links use relative paths, never absolute. The link checker only validates relative links; absolute URLs silently bypass it and rot over time." Strip https://docs.composio.dev from each.

3. Glossary alphabetical ordering (Cursor Bugbot)

docs/content/docs/glossary.mdx re-checked: Webhook Endpoint at line 126, Webhook Subscription at line 130, User ID at line 134. Since U sorts before W and <Glossary> renders entries in source order (no sort, verified in docs/components/glossary.tsx), the visual list reads out of order. Move the User ID block (:134-136) above the Webhook Endpoint block (:126).

Fix all three →


Other things I checked and that are fine

  • verified_at removal is consistent. grep verified_at docs/content/ returns one hit only — in the V2 announcement changelog at 04-27-26-webhook-triggers-v2.mdx:44 ("Get a single endpoint, including verified_at"), correctly left intact as a historical reference. Zero references in the user-facing setup flow.
  • Walkthrough at creating-triggers.mdx:89-255 is now: 4 setup steps (schema → create → store credentials → point provider at URL) + Updating-an-endpoint subsection. The "store credentials before flipping the URL" warning, the Slack ~36-hour auto-disable window, the per-trigger app_token requirement, the re-handshake-rejection security note, and the PATCH-vs-POST update semantics all preserved.
  • Step 4's reframed ending ("head back to Using the SDK to create your trigger") correctly drops the "retry" framing — first-time setup users haven't tried at all, so "retry" was confusing.
  • End-to-end flow disambiguation between ingress URL (provider → Composio) and subscription URL (Composio → your app) remains consistent across triggers.mdx, subscribing-to-events.mdx, and webhook-verification.mdx.
  • Minor (not blocking): requires_webhook_endpoint_setup is still referenced in 2 places (creating-triggers.mdx:91, glossary.mdx:127) but is not on the SDK or OpenAPI yet. The PR body tracks the SDK addition as a follow-up; the field is prose-only here so Twoslash isn't affected. Worth confirming the canonical name (requires_webhook_endpoint per the PR body vs. requires_webhook_endpoint_setup in the docs) with whoever owns the SDK addition before merging.

Once the secret-callout claim is reconciled with the OpenAPI (most important — silent HMAC verification failure for customers who follow the docs), the two absolute URLs are flipped to relative, and the User ID glossary entry is moved above the Webhook entries, this is good to merge.

…before SDK, fix bullet wording, single PATCH

Multiple corrections from review:

1. Frontmatter description reverted to original
   "Create trigger instances via the dashboard or SDK" (was edited
   to a longer string that wasn't part of this PR's scope).

2. SDK section's first paragraph reverted to original
   ("Before creating a trigger, inspect the trigger type to see
   what configuration it requires. Then create the trigger with
   the required config."). The previous edit added a "...whether
   you need to set up a webhook endpoint first" tail that drifted
   from the section's original framing.

3. Code-comment reverts in both Python and TypeScript samples:
   - "# Inspect the trigger type" -> "# Check what configuration is required"
   - "# {properties...}" -> "# Returns: {properties...}"
   - same in TS with // comments
   These were collateral edits during prior passes; the originals
   were fine.

4. Dashboard step 4 reverted to original
   ("Choose a trigger type and fill in the required configuration").
   The added sentence claimed the dashboard prompts for webhook
   endpoint configuration, which it doesn't.

5. Section order: Configuring the webhook endpoint now comes
   before Using the SDK. Anyone who needs to configure encounters
   it before scrolling past SDK examples. Users who don't need
   it skip naturally — the section's intro spells out the
   conditions. Last sentence of step 4 changed from "head back
   to" -> "continue to" since SDK is now below.

6. Per-project capabilities bullet reworded — "Its own signing
   secret and app-level token" -> "Project-scoped credentials —
   the signing secret and app-level token you provide are stored
   against this project alone." Composio doesn't provide the
   secrets; the customer does. The capability is project-scoping,
   not credential issuance.

7. Step 3 consolidated into a single PATCH that sends both fields
   at once (previously two separate PATCH requests, one per
   field). One request is the right API pattern; the Slack-specific
   guidance about where to find each credential is preserved as
   a bullet list under the curl block.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@claude
Copy link
Copy Markdown
Contributor

claude Bot commented May 7, 2026

Claude finished @anshugarg15's task in 2m 45s —— View job


Docs review (re-review on synchronize)

Re-applied the docs-reviewer checklist to the latest push (commit df3405a, which reverts unrelated edits, reorders the Configuring section before the SDK section, reframes one bullet, and combines two PATCH calls into one).

  • Read docs-reviewer guidelines
  • Run git diff origin/next..HEAD -- docs/
  • Verify referenced links / anchors / icon imports / parent index entries exist
  • Apply the "would a developer get stuck or be misled?" filter
  • Post review

The latest commit's changes

Three substantive edits in df3405a, all on creating-triggers.mdx:

  1. Reorder. The page now reads Configuring the webhook endpoint (:17) → Using the SDK (:174) → Using the dashboard (:236). Previously the situational walkthrough was at the bottom. The "head back to [Using the SDK]" pointer at the end of Step 4 was correctly updated to "continue to [Using the SDK]" since SDK now follows the walkthrough. Anchors all still resolve (#configuring-the-webhook-endpoint, #using-the-sdk, #using-the-dashboard); the intro paragraph at :15 correctly still routes Composio-managed-OAuth readers around the section. Note: this is a structural choice that diverges from the PR body's description ("SDK and dashboard sections now come first; the walkthrough is last, gated behind 'skip unless your trigger needs it'"), but the section itself opens with You only run the steps below when you bring your own OAuth app... so readers who don't need it have an explicit skip cue. Not a blocker.
  2. Single PATCH. Step 3 (:104-117) now combines webhook_signing_secret + app_token into one PATCH body, replacing the prior two-call pattern. Per the existing PATCH-merge semantics documented later in the page (PATCH merges per field, POST replaces data wholesale), this is correct — multiple fields can be merged in a single request.
  3. "Project-scoped credentials" rewording at :30. The bullet now reads "the signing secret and app-level token you provide are stored against this project alone, never shared across projects" instead of the previous "Its own signing secret and app-level token, scoped to this project alone." Same factual content, clearer language. The handshake-rejection security note is preserved as a sub-clause.

No new factual issues from this commit.


Three issues from prior reviews are still unaddressed

The latest commit only touches creating-triggers.mdx, so all three findings still apply.

1. Secret-callout claim still contradicts the OpenAPI on this branch — highest impact

Re-verified webhook-verification.mdx:14, 64:

Store the webhook secret securely as COMPOSIO_WEBHOOK_SECRET. You can fetch it from the webhook subscription at any time or rotate it if it leaks.

Re-verified docs/public/openapi.json on HEAD:

Line Content
:10529 "The signing secret is returned only on creation." (POST /webhook_subscriptions)
:10759, :10903, :11057 "description": "Masked signing secret (full secret only on create/rotate)" (the secret field on GET, POST, and rotate-secret responses)

A customer who lost their secret follows the new copy, GETs the subscription, gets a masked value, pastes it into COMPOSIO_WEBHOOK_SECRET, and watches HMAC verification fail silently on every request. Pick: (1) wait for companion PR #3238 to land an OpenAPI where the GET response's secret description no longer says "Masked"; (2) revert the wording. Suggested option-2 fix:

-Store the webhook secret securely as `COMPOSIO_WEBHOOK_SECRET`. You can fetch it from the [webhook subscription](/reference/api-reference/webhooks/getWebhookSubscriptionsById) at any time or [rotate it](/reference/api-reference/webhooks/postWebhookSubscriptionsByIdRotateSecret) if it leaks.
+The full secret is only returned when you [create a webhook subscription](/reference/api-reference/webhooks/postWebhookSubscriptions) or [rotate it](/reference/api-reference/webhooks/postWebhookSubscriptionsByIdRotateSecret); the [GET endpoint](/reference/api-reference/webhooks/getWebhookSubscriptionsById) returns a masked value. Store it securely as `COMPOSIO_WEBHOOK_SECRET`; if you lose it, rotate.

2. Two absolute internal URLs in slack.md (rule #10 violation)

Confirmed via grep 'docs.composio.dev':

File:Line Current
docs/content/toolkits/faq/slack.md:27 https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint
docs/content/toolkits/faq/slack.md:39 https://docs.composio.dev/docs/troubleshooting/triggers

Per docs/CLAUDE.md rule #10: "Internal links use relative paths, never absolute. The link checker only validates relative links; absolute URLs silently bypass it and rot over time."

# slack.md:27
-...see [Configuring the webhook endpoint](https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint).
+...see [Configuring the webhook endpoint](/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint).

# slack.md:39
-See [Triggers troubleshooting](https://docs.composio.dev/docs/troubleshooting/triggers).
+See [Triggers troubleshooting](/docs/troubleshooting/triggers).

3. Glossary alphabetical ordering (Cursor Bugbot)

docs/content/docs/glossary.mdx re-checked: Webhook Endpoint at line 126, Webhook Subscription at line 130, User ID at line 134. U sorts before W and <Glossary> renders entries in source order (no sort, verified in docs/components/glossary.tsx). Move the User ID block (:134-136) above the Webhook Endpoint block (:126).

Fix all three →


Other things I checked and that are fine

  • Anchors all resolve (re-checked after the section reorder): #configuring-the-webhook-endpoint (creating-triggers.mdx:17), #using-the-sdk (:174), #using-the-dashboard (:236), #how-do-i-set-up-slack-event-webhooks (slugifies cleanly from FAQ heading at slack.md:25). Cross-page references from triggers.mdx, webhook-verification.mdx, glossary.mdx, and the slack FAQ continue to resolve.
  • Icon imports (Plug, RouteIcon, ShieldCheck, Wrench, BookOpen, Key, Zap) — all in docs/mdx-components.tsx.
  • Twoslash unaffected. Code samples at creating-triggers.mdx:181-227 print triggerType.config only — no field that doesn't exist in the SDK yet (the Twoslash blocker from 56de32c was resolved by 68b27d2 and not re-introduced here).
  • Walkthrough completeness preserved at creating-triggers.mdx:17-172: 4 setup steps (schema → create → store credentials → point provider at URL) + Updating-an-endpoint subsection. The "store credentials before flipping the URL" warning, the Slack ~36-hour auto-disable window, the per-trigger app_token requirement, the re-handshake-rejection security note, and the PATCH-vs-POST update semantics all preserved.
  • Combined-PATCH change is consistent with the API merge semantics documented at creating-triggers.mdx:138-172: PATCH merges per field (so multiple fields in one body merge in), POST replaces data wholesale.
  • Dashboard step 4 simplification ("Choose a trigger type and fill in the required configuration") is fine — readers who hit a configuration step that needs a webhook endpoint are routed back to the Configuring section by the intro at :15.
  • End-to-end flow disambiguation between ingress URL (provider → Composio) and subscription URL (Composio → your app) remains consistent across triggers.mdx, subscribing-to-events.mdx, and webhook-verification.mdx.
  • Minor (not blocking): requires_webhook_endpoint_setup is still referenced in 2 places (creating-triggers.mdx:19, glossary.mdx:127) but is not on the SDK or OpenAPI yet. The PR body tracks the SDK addition as a follow-up; the field is prose-only here so Twoslash isn't affected. Worth confirming the canonical name (requires_webhook_endpoint per the PR body vs. requires_webhook_endpoint_setup in the docs) with whoever owns the SDK addition before merging.

Once the secret-callout claim is reconciled with the OpenAPI (most important — silent HMAC verification failure for customers who follow the docs), the two absolute URLs are flipped to relative, and the User ID glossary entry is moved above the Webhook entries, this is good to merge.

@anshugarg15 anshugarg15 changed the title docs(triggers): unify webhook-endpoint concept end-to-end docs(triggers): unify webhook-endpoint concept end-to-end [PLEN-2435] May 7, 2026
</Callout>

You can create triggers using the [SDK](#using-the-sdk) or the Composio [dashboard](#using-the-dashboard).
You can create triggers using the [SDK](#using-the-sdk) or the Composio [dashboard](#using-the-dashboard). Some webhook triggers also need a webhook endpoint configured first — covered in [Configuring the webhook endpoint](#configuring-the-webhook-endpoint) below.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we add a note that this is needed only for webhook triggers and not polling triggers?
This will help customers know when to stop reading if they are interested only in polling triggers.

- **Its own ingress rate limit and backpressure budget**
- **Project-scoped credentials** — the signing secret and app-level token you provide are stored against this project alone, never shared across projects. Repeat verification handshakes are rejected after the endpoint is verified, so the signing secret can't be silently swapped by a forged challenge.
- **Clean fan-out** — events reach only that project's trigger instances
- **Per-project metering**
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: please mention in brackets (in future) as we don't have metering right now

- Single Webhook Endpoints API pointer at Step 2 of creating-triggers, mirroring the Subscriptions API pointer pattern; same pointer added to the Webhook Endpoint glossary entry.
- Reword Slack-walkthrough intro to direct readers to per-toolkit FAQ (Slack, Notion).
- Add "How do I set up the Notion webhook ingress endpoint?" FAQ covering the reverse-direction verification flow (token from Composio pasted back into Notion).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@claude
Copy link
Copy Markdown
Contributor

claude Bot commented May 11, 2026

Claude finished @anshugarg15's task in 2m 18s —— View job


Docs review (re-review on synchronize)

Re-applied the docs-reviewer checklist to the latest push (commit 73a5ccf, which adds a Webhook Endpoints API pointer in the glossary + Step 2 of the walkthrough, and adds a new "How do I set up the Notion webhook ingress endpoint?" FAQ entry).

  • Read docs-reviewer guidelines
  • Run git diff origin/next..HEAD
  • Verify referenced links / anchors / icon imports / parent index entries exist
  • Apply the "would a developer get stuck or be misled?" filter
  • Post review

The 73a5ccf changes themselves look good

Three small additions, all factually consistent with the rest of the walkthrough:

  • API pointer in glossary.mdx:127Webhook Endpoint entry now says "you configure it yourself once per OAuth app via the Webhook Endpoints API". The link resolves (page exists at docs/content/reference/api-reference/webhooks/index.mdx); the auto-generated <ApiEndpointsTable> on that page is currently the source of truth and will grow the webhook_endpoints CRUD ops once companion PR docs: update toolkits, API spec, and meta tools data #3238 lands. Until then a reader clicking through will see only the webhook_subscriptions endpoints on a page titled "Webhooks" — slightly imperfect, but not misleading enough to block. The PR body explicitly tracks the two-PR ordering.
  • Step 2 lead-in at creating-triggers.mdx:79 — "Call the Webhook Endpoints API with the toolkit slug and your OAuth client_id" — explicit name for the cURL that follows. Reads cleanly.
  • Walkthrough framing at creating-triggers.mdx:44 — was "The steps below use Slack. Other toolkits follow the same flow with different setup fields." Now points readers to per-toolkit FAQs ("see its FAQ section — e.g., Slack, Notion"). Both slugs match public/data/toolkits.json, so the links resolve.
  • New Notion FAQ entry at notion.md:17-43 — 4 concrete steps (POST endpoint → paste URL into Notion → GET token from Composio → paste token back into Notion). Calling out the Notion-vs-Slack flow asymmetry up front ("the verification flow runs in reverse from Slack's") is correct and useful. One subtle reader-trap: the verification token is returned in data.webhook_signing_secret (Step 3) — i.e., the same field name as the HMAC signing secret on other toolkits. Worth a one-line note that for Notion this field carries the verification challenge token, not a signing secret. Not a blocker.

Anchors I checked after the edits — all resolve: #using-the-sdk (creating-triggers.mdx:174), #using-the-dashboard (creating-triggers.mdx:236), #configuring-the-webhook-endpoint (creating-triggers.mdx:17). Icons (Plug, RouteIcon, ShieldCheck, Wrench, BookOpen, Key, Zap) all imported in docs/mdx-components.tsx. Twoslash unaffected (no TS code blocks touched).


One new issue from 73a5ccf

docs/content/toolkits/faq/notion.md:43 introduces a fourth absolute internal URL. Same rule #10 violation as the two outstanding slack.md ones.

# notion.md:43
-4. **Paste the token back into Notion's verify field** to complete setup. Continue with [Creating triggers](https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#using-the-sdk).
+4. **Paste the token back into Notion's verify field** to complete setup. Continue with [Creating triggers](/docs/setting-up-triggers/creating-triggers#using-the-sdk).

Three issues from prior reviews are still unaddressed

1. Secret-callout claim still contradicts the OpenAPI on this branch — highest impact

webhook-verification.mdx:14, 64 still read:

Store the webhook secret securely as COMPOSIO_WEBHOOK_SECRET. You can fetch it from the webhook subscription at any time or rotate it if it leaks.

Re-verified on HEAD (docs/public/openapi.json):

Line Content
:10529 "The signing secret is returned only on creation."
:10759, :10903, :11057 "description": "Masked signing secret (full secret only on create/rotate)"

A customer who lost their secret follows the new copy, GETs the subscription, gets a masked value, pastes it into COMPOSIO_WEBHOOK_SECRET, and watches HMAC verification fail silently on every request. Pick (1) wait for companion PR #3238 to land an OpenAPI where the GET response's secret description no longer says "Masked", or (2) revert the wording:

-Store the webhook secret securely as `COMPOSIO_WEBHOOK_SECRET`. You can fetch it from the [webhook subscription](/reference/api-reference/webhooks/getWebhookSubscriptionsById) at any time or [rotate it](/reference/api-reference/webhooks/postWebhookSubscriptionsByIdRotateSecret) if it leaks.
+The full secret is only returned when you [create a webhook subscription](/reference/api-reference/webhooks/postWebhookSubscriptions) or [rotate it](/reference/api-reference/webhooks/postWebhookSubscriptionsByIdRotateSecret); the [GET endpoint](/reference/api-reference/webhooks/getWebhookSubscriptionsById) returns a masked value. Store it securely as `COMPOSIO_WEBHOOK_SECRET`; if you lose it, rotate.

2. Two (now three) absolute internal URLs in FAQ files (rule #10)

File:Line Current
docs/content/toolkits/faq/slack.md:27 https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint
docs/content/toolkits/faq/slack.md:39 https://docs.composio.dev/docs/troubleshooting/triggers
docs/content/toolkits/faq/notion.md:43 https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#using-the-sdk (new in 73a5ccf)

Per docs/CLAUDE.md rule #10: "Internal links use relative paths, never absolute. The link checker only validates relative links; absolute URLs silently bypass it and rot over time." Strip https://docs.composio.dev from each.

3. Glossary alphabetical ordering (Cursor Bugbot)

docs/content/docs/glossary.mdx re-checked: Webhook Endpoint at line 126, Webhook Subscription at line 130, User ID at line 134. Since U sorts before W and <Glossary> renders entries in source order (no sort, verified in docs/components/glossary.tsx), the visual list reads out of order. Move the User ID block (:134-136) above the Webhook Endpoint block (:126).

Fix all three →


Other things I checked and that are fine

  • Toolkit FAQ link targets resolve. /toolkits/slack and /toolkits/notion both resolve via the dynamic toolkit route (toolkit slugs in public/data/toolkits.json).
  • /reference/api-reference/webhooks resolves as an existing page. The endpoint table on that page is auto-generated from OpenAPI by CI; once companion PR docs: update toolkits, API spec, and meta tools data #3238 lands, the webhook_endpoints CRUD ops will appear there alongside the existing webhook_subscriptions ops. Pointing at the page now is reasonable per the PR body's two-PR ordering note.
  • Notion FAQ flow is logically consistent with the walkthrough. Step 2 paste-URL-then-Step-3-read-token correctly reflects that Notion sends the verification token after the URL is registered (unlike Slack where the secret comes from the provider's dashboard before the URL is registered). The previously-flagged "PATCH-credentials-before-flipping-URL" warning at creating-triggers.mdx:106-108 is Slack-shaped and doesn't apply to Notion's reverse flow — this is correctly handled by Notion having its own FAQ.
  • Walkthrough completeness preserved at creating-triggers.mdx:17-172: 4 setup steps (schema → create → store credentials → point provider at URL) + Updating-an-endpoint subsection. The "store credentials before flipping the URL" warning, the Slack ~36-hour auto-disable window, the per-trigger app_token requirement, the re-handshake-rejection security note, and the PATCH-vs-POST update semantics all preserved.
  • End-to-end flow disambiguation between ingress URL (provider → Composio) and subscription URL (Composio → your app) remains consistent across triggers.mdx, subscribing-to-events.mdx, and webhook-verification.mdx.
  • requires_webhook_endpoint_setup is still prose-only (creating-triggers.mdx:19, glossary.mdx:127) — not on the SDK or OpenAPI yet, so Twoslash isn't affected. PR body tracks the SDK addition as a follow-up; canonical name (requires_webhook_endpoint per the PR body vs. requires_webhook_endpoint_setup in the docs) still worth confirming with whoever owns the SDK addition before merging.

Once the secret-callout claim is reconciled with the OpenAPI (most important — silent HMAC verification failure for customers who follow the docs), the three absolute URLs are flipped to relative, and the User ID glossary entry is moved above the Webhook entries, this is good to merge.

The /reference/api-reference/webhooks page lists both Subscriptions and Endpoints operations on one page, so the generic page-level link was ambiguous about which API the prose was referring to. Each label now points to its create operation page (postWebhookSubscriptions / postWebhookEndpoints).

Also moves the Webhook Endpoints API pointer up out of Step 2 into the section intro so it scopes the whole walkthrough.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@claude
Copy link
Copy Markdown
Contributor

claude Bot commented May 11, 2026

Claude finished @anshugarg15's task in 4m 25s —— View job


Docs review (re-review on synchronize)

Re-applied the docs-reviewer checklist to the latest two pushes (73a5ccf adds a Webhook Endpoints API pointer + Notion ingress FAQ; 0006e10 swaps the Webhooks API hub links for specific create-operation links).

  • Read docs-reviewer guidelines
  • Run git diff origin/next..HEAD and git diff 73a5ccf..HEAD
  • Verify referenced links / anchors / icon imports / parent index entries exist
  • Apply the "would a developer get stuck or be misled?" filter
  • Post review

New issue from 0006e10 — two new links target an operation page that doesn't exist on this branch

0006e10 swaps the generic /reference/api-reference/webhooks hub link for specific operation IDs in 5 places. Three of them point at postWebhookSubscriptions / getWebhookSubscriptionsById / postWebhookSubscriptionsByIdRotateSecret, which are all in the existing OpenAPI (verified via the <ApiEndpointsTable> in content/reference/api-reference/webhooks/index.mdx). Good edits.

But two of the new links target postWebhookEndpoints:

File:Line New link
docs/content/docs/glossary.mdx:127 /reference/api-reference/webhooks/postWebhookEndpoints
docs/content/docs/setting-up-triggers/creating-triggers.mdx:44 /reference/api-reference/webhooks/postWebhookEndpoints

postWebhookEndpoints is the forthcoming webhook_endpoints CRUD op, which is only in the companion auto-update PR (#3238) — not in this branch's OpenAPI. Verified:

  • grep -c WebhookEndpoint docs/public/openapi.json docs/public/openapi-v3.json0 and 0
  • ls docs/content/reference/api-reference/webhooks/ → only index.mdx
  • The <ApiEndpointsTable> in webhooks/index.mdx lists only the webhook_subscriptions ops

Result: if this PR lands before #3238, both links will 404 in production. The PR body explicitly notes the two-PR coordination, so this is solvable by either (1) waiting for #3238 to merge first, or (2) reverting these two specific links back to /reference/api-reference/webhooks (the hub page that exists today and which the previous version of this PR used).

Note: Docs - Check Links CI is green on 0006e10 — the link checker's populate against getReferenceSource() does enumerate OpenAPI-generated pages, but the catch-all (home)/reference/[[...slug]] validator appears to accept postWebhookEndpoints as a slug match without strict page-existence. Either way, a reader clicking through on the deployed site after this PR ships standalone will 404.

# glossary.mdx:127
-...you configure it yourself once per OAuth app via the [Webhook Endpoints API](/reference/api-reference/webhooks/postWebhookEndpoints).
+...you configure it yourself once per OAuth app via the [Webhook Endpoints API](/reference/api-reference/webhooks).

# creating-triggers.mdx:44
-The walkthrough below uses Slack as the example and walks through the [Webhook Endpoints API](/reference/api-reference/webhooks/postWebhookEndpoints). ...
+The walkthrough below uses Slack as the example and walks through the [Webhook Endpoints API](/reference/api-reference/webhooks). ...

Fix this →


Two unaddressed reviewer comments from @lingalarahul7's earlier review

The reviewer left an APPROVED review with two comments that haven't been addressed in subsequent pushes:

  1. creating-triggers.mdx:15"Can we add a note that this is needed only for webhook triggers and not polling triggers? This will help customers know when to stop reading if they are interested only in polling triggers." The current sentence ("Some webhook triggers also need a webhook endpoint configured first") implies it but doesn't say the page is webhook-only. A reader looking at polling triggers might still read through Configuring before realizing it's not for them.

  2. creating-triggers.mdx:32"nit: please mention in brackets (in future) as we don't have metering right now" — the "Per-project metering" bullet currently reads as a present-tense capability.

Suggested:

# :15
-You can create triggers using the [SDK](#using-the-sdk) or the Composio [dashboard](#using-the-dashboard). Some webhook triggers also need a webhook endpoint configured first — covered in [Configuring the webhook endpoint](#configuring-the-webhook-endpoint) below.
+You can create triggers using the [SDK](#using-the-sdk) or the Composio [dashboard](#using-the-dashboard). Some webhook triggers also need a webhook endpoint configured first — covered in [Configuring the webhook endpoint](#configuring-the-webhook-endpoint) below. Polling triggers don't need this; you can skip straight to [Using the SDK](#using-the-sdk).

# :32
-- **Per-project metering**
+- **Per-project metering** (in future)

Three issues from prior reviews are still unaddressed

1. Secret-callout claim still contradicts the OpenAPI on this branch — highest impact

Still present at webhook-verification.mdx:14 and :64:

Store the webhook secret securely as COMPOSIO_WEBHOOK_SECRET. You can fetch it from the webhook subscription at any time or rotate it if it leaks.

Re-verified docs/public/openapi.json on HEAD:

Line Content
:10529 "The signing secret is returned only on creation." (POST /webhook_subscriptions)
:10759, :10903, :11057 "description": "Masked signing secret (full secret only on create/rotate)" (the secret field on GET, POST, and rotate-secret responses)

A customer who lost their secret follows the new copy, GETs the subscription, gets a masked value, pastes it into COMPOSIO_WEBHOOK_SECRET, and watches HMAC verification fail silently. Pick (1) wait for companion PR #3238 to land an OpenAPI where the GET response's secret description no longer says "Masked", or (2) revert the wording:

-Store the webhook secret securely as `COMPOSIO_WEBHOOK_SECRET`. You can fetch it from the [webhook subscription](/reference/api-reference/webhooks/getWebhookSubscriptionsById) at any time or [rotate it](/reference/api-reference/webhooks/postWebhookSubscriptionsByIdRotateSecret) if it leaks.
+The full secret is only returned when you [create a webhook subscription](/reference/api-reference/webhooks/postWebhookSubscriptions) or [rotate it](/reference/api-reference/webhooks/postWebhookSubscriptionsByIdRotateSecret); the [GET endpoint](/reference/api-reference/webhooks/getWebhookSubscriptionsById) returns a masked value. Store it securely as `COMPOSIO_WEBHOOK_SECRET`; if you lose it, rotate.

2. Three absolute internal URLs in FAQ files (rule #10 violation)

Confirmed via grep 'docs.composio.dev':

File:Line Current
docs/content/toolkits/faq/slack.md:27 https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint
docs/content/toolkits/faq/slack.md:39 https://docs.composio.dev/docs/troubleshooting/triggers
docs/content/toolkits/faq/notion.md:43 https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#using-the-sdk

Per docs/CLAUDE.md rule #10: "Internal links use relative paths, never absolute. The link checker only validates relative links; absolute URLs silently bypass it and rot over time." Strip https://docs.composio.dev from each.

3. Glossary alphabetical ordering (Cursor Bugbot)

docs/content/docs/glossary.mdx re-checked: Webhook Endpoint at line 126, Webhook Subscription at line 130, User ID at line 134. Since U sorts before W and <Glossary> renders entries in source order (no sort, verified in docs/components/glossary.tsx), the visual list reads out of order. Move the User ID block (:134-136) above the Webhook Endpoint block (:126).

Fix all three →


Other things I checked and that are fine

  • The three "real" operation links added in 0006e10 (postWebhookSubscriptions, getWebhookSubscriptionsById, postWebhookSubscriptionsByIdRotateSecret) all match the existing camelCase IDs in content/reference/api-reference/webhooks/index.mdx's <ApiEndpointsTable>.
  • Changelog edit at 02-06-26-webhook-subscriptions-api.mdx:22 — repointing from the hub page to postWebhookSubscriptions is consistent with the rest of 0006e10's pattern, and the operation exists today.
  • Anchors all resolve (re-checked): #configuring-the-webhook-endpoint (creating-triggers.mdx:17), #using-the-sdk (creating-triggers.mdx:174), #using-the-dashboard (creating-triggers.mdx:236), #how-do-i-set-up-slack-event-webhooks (slugifies cleanly from FAQ heading), #how-do-i-set-up-the-notion-webhook-ingress-endpoint (slugifies cleanly).
  • Notion FAQ flow at notion.md:17-43 is logically consistent with Notion's reverse-verification flow (POST endpoint → paste URL → token arrives → paste back). The asymmetry vs. Slack's flow is called out up front.
  • Toolkit FAQ targets (/toolkits/slack, /toolkits/notion) resolve via slugs from public/data/toolkits.json.
  • Twoslash unaffected. Code samples at creating-triggers.mdx:181-227 print triggerType.config only — no field that doesn't exist in the SDK yet.
  • Walkthrough completeness preserved at creating-triggers.mdx:17-172: 4 setup steps (schema → create → store credentials → point provider at URL) + Updating-an-endpoint subsection. The "store credentials before flipping the URL" warning, the Slack ~36-hour auto-disable window, the per-trigger app_token requirement, the re-handshake-rejection security note, and the PATCH-vs-POST update semantics are all intact.
  • End-to-end flow disambiguation between ingress URL (provider → Composio) and subscription URL (Composio → your app) remains consistent across triggers.mdx, subscribing-to-events.mdx, and webhook-verification.mdx.
  • Docs - Check Links CI is green, confirmed locally too (bun run scripts/validate-links.ts → 0 errors). But see the new-issue note above — the link checker happens to accept the postWebhookEndpoints slug today even though the operation page isn't generated.
  • Minor (not blocking): requires_webhook_endpoint_setup is still referenced in 2 places (creating-triggers.mdx:19, glossary.mdx:127) but is not on the SDK or OpenAPI yet. PR body tracks the SDK addition as a follow-up; the field is prose-only here so Twoslash isn't affected.

Once postWebhookEndpoints resolves to a real page (either #3238 merges first, or these two links are reverted to the hub URL), the secret-callout claim is reconciled with the OpenAPI, the three absolute URLs are flipped to relative, and the User ID glossary entry is moved above the Webhook entries, this is good to merge. The two @lingalarahul7 review nits are also worth addressing on the way through.

anshugarg15 and others added 2 commits May 11, 2026 12:56
…bhook Endpoints API pages

Apollo split the Webhooks tag into Webhook Subscriptions + Webhook Endpoints, so /reference/api-reference/webhook-subscriptions and /webhook-endpoints are the canonical pages now. Repoint:

- glossary, creating-triggers, subscribing-to-events, webhook-verification, and the webhook-subscriptions changelog
- delete the orphan /reference/api-reference/webhooks/index.mdx (and its v3 twin) — Apollo's openapi.json no longer routes any operation to the legacy Webhooks tag, but generate-api-index iterates only tags-with-operations, so the orphan never got auto-removed (separate script bug, follow-up)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@claude
Copy link
Copy Markdown
Contributor

claude Bot commented May 11, 2026

Claude finished @anshugarg15's task in 4m 10s —— View job


Docs review (re-review on synchronize)

Re-applied the docs-reviewer checklist to the latest pushes since my previous review (6c7be67 merges next and brings updated OpenAPI; 0006e10 points links to specific operations; 6ed8c74 repoints to the split webhook-subscriptions / webhook-endpoints API pages).

  • Read docs-reviewer guidelines
  • Run git diff origin/next..HEAD
  • Verify referenced links / anchors / icon imports / parent index entries exist
  • Apply the "would a developer get stuck or be misled?" filter
  • Post review

Big news: the secret-callout blocker is resolved by the OpenAPI in this branch

This was the highest-impact item I've been flagging across all the previous reviews. The merge from next (6c7be67) pulled in a fresh OpenAPI where the secret-field description no longer says masked:

File:Line Old New
docs/public/openapi.json:16312 "The signing secret is returned only on creation." "Creates a webhook subscription for the authenticated project. ... The signing secret is returned in subscription responses."
docs/public/openapi.json:16399, 16686, 16840 "Masked signing secret (full secret only on create/rotate)" "Signing secret for HMAC verification"

So the callouts at webhook-verification.mdx:14, 64 — "You can fetch it from the webhook subscription at any time or rotate it if it leaks" — are now factually consistent with the spec. A customer following the docs will GET the subscription, get the real secret, plug it in, and HMAC verification will succeed. Long-running blocker resolved.

6ed8c74 link split is clean

Apollo split the legacy Webhooks tag into separate Webhook Subscriptions + Webhook Endpoints tags. The branch's OpenAPI confirms (docs/public/openapi.json):

  • 7 ops tagged Webhook Subscriptions (postWebhookSubscriptions, getWebhookSubscriptionsById, ..., getWebhookSubscriptionsEventTypes) at lines 16316–17084
  • 5 ops tagged Webhook Endpoints (postWebhookEndpoints, getWebhookEndpoints, ..., patchWebhookEndpointsByNanoId) at lines 17173–17710

Both new index pages exist:

  • docs/content/reference/api-reference/webhook-subscriptions/index.mdx
  • docs/content/reference/api-reference/webhook-endpoints/index.mdx

And grep -rn "/reference/api-reference/webhooks/" docs/content/ returns zero hits — all stale /webhooks/ paths are cleaned up. The orphan webhooks/index.mdx files (root + /v3/) are correctly deleted in this commit, with a documented follow-up note about the generate-api-index script not pruning tags-with-zero-ops on its own. Good.

Anchors I re-checked, all resolve:

  • #configuring-the-webhook-endpoint (creating-triggers.mdx:17)
  • #using-the-sdk (creating-triggers.mdx:174)
  • #using-the-dashboard (creating-triggers.mdx:236)
  • #how-do-i-set-up-slack-event-webhooks (slugifies cleanly from FAQ heading)
  • #how-do-i-set-up-the-notion-webhook-ingress-endpoint (slugifies cleanly)

Two issues from prior reviews are still unaddressed

1. Three absolute internal URLs in FAQ files (rule #10 violation — first raised in my 2026-05-07 11:53Z review)

Confirmed via grep 'https://docs.composio.dev' docs/content/toolkits/faq/:

File:Line Current
docs/content/toolkits/faq/slack.md:50 https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint
docs/content/toolkits/faq/slack.md:62 https://docs.composio.dev/docs/troubleshooting/triggers
docs/content/toolkits/faq/notion.md:43 https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#using-the-sdk

docs/CLAUDE.md rule #10: "Internal links use relative paths, never absolute. The link checker only validates relative links; absolute URLs silently bypass it and rot over time." Strip https://docs.composio.dev from each:

# slack.md:50
-...see [Configuring the webhook endpoint](https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint).
+...see [Configuring the webhook endpoint](/docs/setting-up-triggers/creating-triggers#configuring-the-webhook-endpoint).

# slack.md:62
-See [Triggers troubleshooting](https://docs.composio.dev/docs/troubleshooting/triggers).
+See [Triggers troubleshooting](/docs/troubleshooting/triggers).

# notion.md:43
-Continue with [Creating triggers](https://docs.composio.dev/docs/setting-up-triggers/creating-triggers#using-the-sdk).
+Continue with [Creating triggers](/docs/setting-up-triggers/creating-triggers#using-the-sdk).

2. Glossary alphabetical ordering (Cursor Bugbot)

docs/content/docs/glossary.mdx re-checked: Webhook Endpoint at line 126, Webhook Subscription at line 130, User ID at line 134. U sorts before W and <Glossary> renders entries in source order (no sort, verified in docs/components/glossary.tsx). Move the User ID block (:134-136) above the Webhook Endpoint block (:126).

Fix both →

Also worth addressing in passing — two unaddressed @lingalarahul7 review nits from 2026-05-08:

  • creating-triggers.mdx:15 → mention this section is webhook-trigger-only so polling-trigger readers know to skip
  • creating-triggers.mdx:32 → mark "Per-project metering" as "(in future)" since metering isn't shipped yet

Other things I checked and that are fine

  • OpenAPI now has the split tags. Webhook Subscriptions (7 ops) and Webhook Endpoints (5 ops) are tagged separately at docs/public/openapi.json:16316–17710. Operation pages for all new IDs (postWebhookEndpoints, getWebhookEndpointsByNanoId, etc.) will be auto-generated from these tags at build time. The new-issue note from my prior review (postWebhookEndpoints 404) is resolved — the operation now exists in the spec.
  • Twoslash unaffected. Code samples at creating-triggers.mdx:181-227 print triggerType.config only — no field that doesn't exist in the SDK yet.
  • Walkthrough completeness preserved at creating-triggers.mdx:17-172: 4 setup steps (schema → create → store credentials → point provider at URL) + Updating-an-endpoint subsection. The "store credentials before flipping the URL" warning, the Slack ~36-hour auto-disable window, the per-trigger app_token requirement, the re-handshake-rejection security note, and the PATCH-vs-POST update semantics are all still in place.
  • End-to-end flow disambiguation between ingress URL (provider → Composio) and subscription URL (Composio → your app) remains consistent across triggers.mdx, subscribing-to-events.mdx, and webhook-verification.mdx.
  • requires_webhook_endpoint_setup is still prose-only (creating-triggers.mdx:19, glossary.mdx:127). Re-verified absent from the SDK (ts/packages/core/src/types/triggers.types.ts:152-167) and from docs/public/openapi.json. Prose-only, so Twoslash isn't affected. PR body tracks the SDK addition as a follow-up. Worth confirming the canonical name (requires_webhook_endpoint per the PR body vs. requires_webhook_endpoint_setup in the docs) with whoever owns the SDK addition before merging.
  • Notion FAQ flow at notion.md:17-43 correctly models Notion's reverse-verification flow (POST endpoint → paste URL → token arrives → paste back). Asymmetry vs. Slack is called out up front. No factual issues.

With the masked-secret blocker now resolved by the spec update, the only remaining items are the three absolute URLs and the glossary ordering. Once those are flipped, this is good to merge.

@anshugarg15 anshugarg15 merged commit 0e0b152 into next May 11, 2026
12 checks passed
@anshugarg15 anshugarg15 deleted the docs/triggers-webhook-endpoints branch May 11, 2026 07:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants