Real-time notifications for moderation events
{ "url": "https://your-app.com/webhooks/pixel-patrol", "secret": "your-webhook-secret-key", "events": ["media.created", "media.moderated"], "active": true }
X-PixelPatrol-Signature: 3f3d7c4b5e6789abcdef1234567890abcdef1234567890abcdef1234567890ab X-PixelPatrol-Timestamp: 1705745400000 X-PixelPatrol-Event: media.moderated
import { createHmac } from 'crypto'; function verifyWebhookSignature( payload: string, signature: string, secret: string ): boolean { const expected = createHmac('sha256', secret) .update(payload) .digest('hex'); return expected === signature; }
{ "id": "webhook_123", "event": "media.moderated", "created_at": "2024-01-20T10:30:00Z", "data": { "media_id": "media_456", "site_id": "site_789", "status": "approved", "ai_results": { "labels": [] }, "applied_rules": [] } }
{ "media_id": "media_456", "status": "approved|rejected|flagged", "ai_results": {}, "applied_rules": [], "moderated_at": "2024-01-20T10:30:00Z" }
{ "media_id": "test_456", "status": "test", "is_test": true, "message": "Test webhook received successfully" }
import express from 'express'; const app = express(); app.post('/webhooks/pixel-patrol', express.raw({ type: 'application/json' }), (req, res) => { const signature = req.headers['x-pixelpatrol-signature']; const payload = req.body.toString(); // Verify signature if (!verifyWebhookSignature(payload, signature, process.env.WEBHOOK_SECRET)) { return res.status(401).send('Invalid signature'); } const event = JSON.parse(payload); // Handle event switch (event.event) { case 'media.moderated': handleMediaModerated(event.data); break; case 'test.webhook': console.log('Test webhook received'); break; } // Acknowledge receipt res.status(200).send('OK'); });