Developers
MentionOwl API
BetaRead MentionOwl data and manage signed outbound webhooks with scoped, expiring API keys.
Quick start
Create a named key under Profile → API Key. Choose read-only, site-management, or webhook-management access for the integration’s actual work. Keys expire, can be revoked independently, and are shown only once.
curl https://www.mentionowl.com/api/me \ -H "Authorization: Bearer mo_live_your_key"
Successful requests return { "data": ... }. Errors return { "error": "..." }. Missing credentials use 401, invalid permissions or entitlements use 403, inaccessible resources use 404, conflicting transitions use 409, oversized or unsupported bodies use 413/415, limits use 429, and unexpected failures use 500.
Create a webhook
BetaUse a key with webhook access. The response includes a whsec_… signing secret once; store it in your secrets manager.
curl -X POST https://www.mentionowl.com/api/webhooks \
-H "Authorization: Bearer mo_live_your_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Production",
"url": "https://example.com/webhooks/mentionowl",
"events": ["site.created", "monitoring.completed"]
}'MentionOwl accepts public HTTPS destinations only. Every delivery is persisted, attempted immediately, retried up to three times, and carries a stable delivery ID for receiver-side deduplication.
Webhook events
user.createdA MentionOwl user account was created.
site.createdA site was added to the account.
site.deletedA site was removed from the account.
monitoring.completedA scheduled monitoring run completed.
visibility.droppedVisibility fell past the configured alert threshold.
subscription.startedA paid subscription started.
subscription.updatedA paid subscription changed status or configuration.
subscription.cancelledA paid subscription ended.
webhook.testA test requested for a webhook endpoint.
Verify a webhook signature
Read the raw request body. Sign deliveryId.timestamp.rawBody with HMAC-SHA256, compare it to the hexadecimal value after v1=, reject old timestamps, and deduplicate the delivery ID.
import crypto from "node:crypto";
const deliveryId = req.headers["x-mentionowl-delivery"];
const timestamp = req.headers["x-mentionowl-timestamp"];
const received = req.headers["x-mentionowl-signature"];
if (typeof deliveryId !== "string" || typeof timestamp !== "string" ||
typeof received !== "string") throw new Error("Missing webhook signature");
const age = Math.abs(Math.floor(Date.now() / 1000) - Number(timestamp));
if (!Number.isFinite(age) || age > 300) throw new Error("Stale webhook");
const signed = `${deliveryId}.${timestamp}.${rawBody}`;
const expected = "v1=" + crypto
.createHmac("sha256", process.env.MENTIONOWL_WEBHOOK_SECRET)
.update(signed)
.digest("hex");
const valid = received.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(received), Buffer.from(expected));REST contract
Endpoints
/api/meAccountGet the current account
Returns the API-key owner and every owned or shared site.
/api/user/{id}AccountGet a user
Returns the key owner, or any user when called by an administrator.
/api/site/{domain}SitesGet site metadata
Returns a site visible to the API-key owner.
/api/site/{domain}/metricsSitesGet visibility metrics
Returns the canonical current and previous visibility read model.
/api/site/{domain}/queriesSitesGet monitored answers and citations
Returns recent runs inside the site owner's history entitlement.
/api/admin/usersAdministrationList users
Administrator-only account operations view.
/api/admin/cronAdministrationGet cron health
Administrator-only scheduled job status and history.
/api/admin/usageAdministrationGet service usage
Administrator-only usage, queue, and account aggregates.
/api/webhooksWebhooksList webhook endpoints
Lists redacted endpoint metadata.
/api/webhooksWebhooksCreate a webhook endpoint
Creates an endpoint. The signing secret is returned once.
/api/webhooks/{id}WebhooksUpdate a webhook endpoint
Updates an owner-scoped endpoint.
/api/webhooks/{id}WebhooksDelete a webhook endpoint
Deletes an endpoint and its delivery history.
/api/webhooks/{id}/testWebhooksSend a test webhook
Immediately sends a webhook.test event.
/api/webhooks/{id}/rotate-secretWebhooksRotate a signing secret
Replaces the secret and returns it once.
/api/webhooks/{id}/deliveriesWebhooksList webhook deliveries
Returns the latest 100 delivery attempts.
/api/webhooks/{id}/deliveries/{deliveryId}/retryWebhooksReplay a failed delivery
Creates and immediately attempts a linked replay without mutating the original FAILED or RETRY audit row.