Pre-built integrations for Claude AI, ChatGPT, GitHub, Google Workspace, Jira, Linear, and Zapier. Install with one click.
On this page
@claude mention + /claude commands. Summarize threads, translate, ask questions, analyze sentiment.
@chatgpt mention + /gpt commands. Same capabilities, OpenAI backend.
PR/issue notifications, CI status, /github commands. OAuth for per-user access.
Calendar reminders, Drive search, Gmail unread count. OAuth per-user.
Issue notifications, /jira create + status commands. Webhook-based.
Connect to 6,000+ apps. Incoming + outgoing webhooks for any automation.
/claude summarize — Summarize the current thread
/claude translate de — Translate last 5 messages to German
/claude ask — Ask a question with channel context
/jira create Bug — Create a Jira issue
/jira status PROJ-123 — Check issue status
/github status — Show repo info
/github pr-list — List open pull requests
Your platform POSTs a small JSON body and a message appears in a Disqua channel within about 100 ms. This is the quickest way to pipe product events — sign-ups, new listings, records created or updated — into a team channel. The contract mirrors Slack’s incoming webhooks, so an existing Slack integration usually needs nothing but a new URL. GitHub, Jira, and Zapier use the same mechanism.
In your workspace open Settings → Connectors → Incoming Webhook → Install. Choose a default channel and — strongly recommended — set a signing secret. Installing mints a unique URL:
POST https://api.disqua.com/v1/connectors/incoming/<token>
text is the only required field.
| Field | Required | Meaning |
|---|---|---|
| text | yes | Message body. Markdown is rendered. |
| channel | no | Channel slug. Overrides the default — this is how one webhook feeds several channels. |
| username | no | Rendered in bold before the text. Useful when several systems post to one channel. |
| icon_url | no | Accepted for Slack compatibility; not rendered today. |
curl -X POST https://api.disqua.com/v1/connectors/incoming/<token> \
-H 'Content-Type: application/json' \
-d '{"text":"New sign-up: jane@example.com","username":"platform"}'
Create one channel per event stream (for example new-users and
new-listings) and set channel
per message. Four patterns that cover most platforms:
// user registered
{ "channel": "new-users", "username": "platform",
"text": "**New registration** — jane@example.com (plan: Free, country: CZ)" }
// listing created
{ "channel": "new-listings", "username": "platform",
"text": "**New listing** — Skoda Octavia 2019, 289 000 CZK" }
// record created
{ "channel": "new-listings", "username": "platform",
"text": "**New item** — Order #8412 created by jane@example.com" }
// record updated — say WHAT changed, not just that something did
{ "channel": "new-listings", "username": "platform",
"text": "**Listing updated** — #8412 price 289 000 → 265 000 CZK" }
If a channel slug does not exist in the workspace the event is
dropped rather than posted somewhere unexpected, and the reason is recorded in the connector event log.
Without a signing secret, anyone holding the URL can post to your channel — the same trade-off Slack makes. Once a secret is configured, Disqua requires an HMAC-SHA256 over the timestamp and the raw request body. The timestamp must be within 5 minutes of Disqua’s clock and each signature is accepted only once, so a captured request cannot be replayed:
X-Disqua-Timestamp: <unix seconds>
X-Disqua-Signature: sha256=<hex(hmac_sha256(secret, "<timestamp>." + raw_body))>
// Node.js
const body = JSON.stringify({ text: 'New sign-up: jane@example.com' });
const ts = Math.floor(Date.now() / 1000);
const sig = 'sha256=' + require('crypto')
.createHmac('sha256', process.env.DISQUA_WEBHOOK_SECRET)
.update(`${ts}.${body}`).digest('hex'); // timestamp is INSIDE the signature
await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Disqua-Timestamp': String(ts),
'X-Disqua-Signature': sig,
},
body, // sign and send the SAME string
});
// PHP
$body = json_encode(['text' => 'New sign-up: jane@example.com']);
$ts = time();
$sig = 'sha256=' . hash_hmac('sha256', "$ts.$body", getenv('DISQUA_WEBHOOK_SECRET'));
// send both X-Disqua-Timestamp: $ts and X-Disqua-Signature: $sig
Sign the exact bytes you transmit. Re-serialising the payload after signing — middleware that re-encodes JSON, or a framework that reorders keys — changes the body, and the signature no longer matches. That is the most common reason a correct-looking integration is rejected.
Success returns 200 with
{"ok":true,"data":{"processed":true}}. An unknown or revoked
token also returns 200, but with
"processed":false — deliberately, so the endpoint cannot
be used to probe which tokens are valid. Check that field, not the status code, when you need to know an event
actually landed.
Delivery is fire-and-forget and Disqua does not de-duplicate. If your platform retries on network errors, include your own event ID in the text, or retry only on connection failure rather than on a 200, so a repeated delivery stays recognisable.
Implementing this with an AI agent?
Point it at the machine-readable capability catalog —
GET https://api.disqua.com/v1/ai/catalog — which lists
every resource type an agent can operate on, with request examples. A deeper agent-oriented reference lives at
forai.disqua.com
(access key required).
Configure a Zapier webhook URL and select events (message.new, ticket.created, ticket.resolved, etc.). Disqua POSTs event payloads automatically.
Full reference for this direction — event catalog, delivery headers, signature verification and retry behaviour — is on the Outgoing webhooks page.