Integration

Zikit + Custom Webhooks

Every meaningful change Zikit detects can be POSTed as JSON to an HTTPS endpoint you own. Use it to trigger a pipeline, open a ticket, write to your data warehouse, or forward to Zapier / n8n / Make. The payload is small, documented, and versioned via theevent field.

Payload shape

On every meaningful change (above your importance threshold), Zikit sends onePOST withContent-Type: application/json:

{
  "event": "change_detected",
  "monitor": {
    "name": "Competitor Pricing - OpenAI",
    "url": "https://openai.com/chatgpt/pricing"
  },
  "change": {
    "summary": "ChatGPT Plus moved from $20/mo flat to $20/mo + usage credits. New Business tier at $25/user/mo.",
    "importance": 8,
    "changeType": "content"
  },
  "timestamp": "2026-04-23T14:41:00.000Z",
  "source": "zikit.ai"
}
  • event - currently always change_detected. New event types will land as additive values.
  • monitor.name / monitor.url - the page that changed.
  • change.summary - plain-English AI summary (same text that appears in your dashboard).
  • change.importance - integer 1-10. Zikit only POSTs changes at or above your configured threshold.
  • change.changeType - content, price, status, etc.
  • timestamp - ISO 8601 UTC, when the change was detected.

Example handlers

Node / Express

// Example: Express handler
import express from "express";
const app = express();
app.use(express.json());

app.post("/zikit-hook", (req, res) => {
  const { monitor, change } = req.body;
  if (change.importance >= 7) {
    // route high-severity changes to on-call
    notifyOnCall(`${monitor.name}: ${change.summary}`);
  }
  res.status(200).end();
});

app.listen(3000);

Python / FastAPI

# Example: FastAPI handler
from fastapi import FastAPI, Request

app = FastAPI()

@app.post("/zikit-hook")
async def zikit(req: Request):
    payload = await req.json()
    monitor = payload["monitor"]
    change = payload["change"]
    if change["importance"] >= 7:
        notify_on_call(f"{monitor['name']}: {change['summary']}")
    return {"ok": True}

Reply with any 2xx status to acknowledge. If your endpoint returns non-2xx or times out after 10 seconds, Zikit logs the failure and marks the alert for review - it does not retry automatically (by design, to avoid duplicate-event hell).

Setup

1

Expose an HTTPS endpoint

Any public HTTPS URL that accepts a JSON POST. Cloud Functions, Lambda behind API Gateway, a Rails controller, Zapier Webhook - all fine. Must be HTTPS; HTTP is rejected. Private IPs and localhost are rejected by our SSRF protection.

2

Paste the URL into your monitor

In your dashboard, open a monitor’s Alert preferences → Add alert → Webhook, paste the URL, and pick your importance threshold. Save.

3

Verify with a real change

The next meaningful change on that monitor triggers a POST. Usewebhook.sitefor a throwaway inspection URL during development.

Requirements & limits

  • Zikit Business plan ($49/mo) - Webhooks are a Business-tier feature
  • HTTPS endpoint with a valid TLS certificate (self-signed not supported)
  • Endpoint must respond with a 2xx status within 10 seconds
  • One POST per meaningful change - no retries, no ordering guarantee between monitors
  • SSRF protection blocks private IPs, loopback, link-local, and non-HTTPS URLs

FAQ

Does Zikit sign requests with HMAC?

Not yet. For now, protect your endpoint with a secret path segment (e.g. /zikit-hook/<random-token>) or an auth header. HMAC signatures are on our roadmap; drop a note at support@zikit.ai if you need them sooner.

Can I forward webhooks to Zapier / n8n / Make?

Yes. Create a “Webhook by Zapier” trigger (or equivalent) in your automation tool, copy its URL, and paste it as the Zikit webhook destination. Works identically to a custom endpoint.

What happens if my endpoint is down?

The delivery is logged as failed and the change is marked un-notified in your dashboard. You can see delivery failures per monitor. We do not queue-and-retry to avoid duplicate events; if you need at-least-once semantics, put a queue (SQS / PubSub) in front of your handler.

Can the payload change?

We only add fields, never remove or rename them. New event types will land as new event values so you can ignore them safely.

Other integrations

See all integrations