Webhooks
WUDO uses MQTT for real-time event notifications. Subscribe to topics to receive updates about blog generation progress, publishing events, product optimization progress, and visual check results.
This page covers real-time MQTT events for monitoring progress in your UI. If you want WUDO to automatically push published blogs and optimized products to your website via HTTP, see the Auto-Publish Webhook Setup guide instead.
Connection
WUDO uses MQTT over WebSocket for real-time notifications. Connect using any MQTT client library.
Protocol:
mqtt:// or ws://Port:
1883 (MQTT) / 9001 (WebSocket)Event Topics
blog/{blogId}/progressEmitted during blog generation to report pipeline progress.
{
"blogId": "abc-123",
"status": "generating",
"progress": 65,
"currentStep": "Writing section 3 of 5",
"estimatedSecondsRemaining": 45
}blog/{blogId}/publishedEmitted when a blog is published and available via the API.
{
"blogId": "abc-123",
"slug": "10-web-design-trends-2026",
"title": "10 Web Design Trends for 2026",
"publishedAt": "2026-01-29T10:00:00Z"
}blog/{blogId}/visual-check-completeEmitted when an AI visual quality check completes (auto or manual).
{
"blogId": "abc-123",
"overallScore": 85,
"issueCount": 2,
"hasCriticalIssues": false,
"checkedUrl": "https://yoursite.com/blog/your-post"
}blog/{blogId}/failedEmitted when blog generation encounters an unrecoverable error.
{
"blogId": "abc-123",
"error": "AI provider timeout",
"step": "content_writing",
"failedAt": "2026-01-29T10:05:00Z"
}optimization/{domainId}/progressEmitted during product optimization to report batch progress.
{
"domainId": "domain-456",
"status": "optimizing",
"progress": 40,
"totalProducts": 50,
"completedProducts": 20
}optimization/{domainId}/completeEmitted when a product optimization batch completes.
{
"domainId": "domain-456",
"totalProducts": 50,
"optimizedCount": 48,
"failedCount": 2,
"completedAt": "2026-02-15T14:30:00Z"
}JavaScript Example
mqtt.js
import mqtt from 'mqtt';
const client = mqtt.connect('ws://wudoseo.com:9001');
client.on('connect', () => {
// Subscribe to all blog events for a specific blog
client.subscribe('blog/abc-123/#');
});
client.on('message', (topic, message) => {
const data = JSON.parse(message.toString());
if (topic.endsWith('/progress')) {
console.log(`Progress: ${data.progress}% - ${data.currentStep}`);
}
if (topic.endsWith('/published')) {
console.log(`Blog published at /blog/${data.slug}`);
}
if (topic.endsWith('/visual-check-complete')) {
console.log(`Visual check score: ${data.overallScore}/100`);
}
});