IndexNOW-Benachrichtigung (Integrator-Endpunkt)
Wenn Blog- oder Market-Inhalte veröffentlicht, aktualisiert, depubliziert oder gelöscht werden, kann Mailoo IDs per POST an Ihre Website senden. Sie erstellen die öffentlichen Seiten-URLs und übermitteln sie an IndexNow. Mailoo ruft IndexNOW nicht direkt auf und sendet keine absoluten URLs.
Veröffentlichungen und Katalogschreibvorgänge in Mailoo sind immer erfolgreich, auch wenn Ihr Endpunkt fehlt oder einen Fehler zurückgibt (Fire-and-Forget). Mailoo zeichnet das Ergebnis auf dem Inhaltsdatensatz als indexNowStatus auf.
Verwandt: Blog-CMS --- blog-headless-cms{.interpreted-text role="doc"}; Marktkatalog --- market-catalog-external-api{.interpreted-text role="doc"}; Next.js-Blog-Beispiel --- blog-nextjs-example{.interpreted-text role="doc"}; Delivery-Webhook-HMAC (gleiche Signierformel) --- transactional-email{.interpreted-text role="doc"}.
- Auslöser: Nach einem erfolgreichen Blog-Artikel- oder Market-Produkt-Schreibvorgang (oder veröffentlichte Produktvariante).
- Nutzlast: Projekt-/Integrations-/Inhalts-IDs, optionaler Blog-
slug,localesundaction--- keine Seiten-URLs. - Ihre Aufgabe: IDs → öffentliche URLs → IndexNOW-API mit Ihrem Schlüssel zuordnen.
- Status am Inhalt:
PENDING→NOTIFIED|FAILEDoderSKIPPEDwennindexNownicht konfiguriert ist.nullbedeutet nie versucht (z. B. nur Entwurf).
Pro BLOG- oder MARKET-Integration:
- Dashboard → Connection & settings → IndexNOW notify
- BLOG + MCP / Verwaltungs-API:
GET/PATCH /api/v1/blog/{projectUid}/integrations/{integrationId}/settings(FeldindexNow; sanitisiertes GET zeigtnotifyUrl+hasSecret). MCP-Toolmanage_blog_integration_settings--- siehemailoo-mcp{.interpreted-text role="doc"}. - Oder
PATCH /api/v1/projects/{uid}/integrations/{id}mit Body:
{
"indexNow": {
"notifyUrl": "https://www.example.com/api/indexnow/notify",
"secret": "your-signing-secret"
}
}
Senden Sie "indexNow": null zum Zurücksetzen. Sanitisierte API-Antworten zeigen notifyUrl und hasSecret (niemals das rohe Secret).
Wenn notifyUrl / secret nicht gesetzt sind, setzt Mailoo indexNowStatus auf ``SKIPPED`` und führt keinen HTTP-Aufruf an Ihre Website durch.
Methode / URL: POST an die konfigurierte notifyUrl.
Header:
Content-Type: application/jsonX-Mailoo-Event: indexnow.notifyX-Mailoo-Signature: t={unixSeconds},v1={hex}---v1ist HMAC-SHA256 von"{timestamp}.{rawBody}"mitindexNow.secret(gleiche Formel wie Transaktions-Delivery-Webhooks).
Body (JSON):
{
"event": "indexnow.notify",
"kind": "blog_post",
"action": "published",
"projectUid": "…",
"integrationId": "…",
"contentId": "…",
"slug": "my-post",
"locales": ["en", "de"],
"timestamp": "2026-08-03T09:00:00.000Z"
}
Felder nach Kind
kind---blog_postodermarket_productcontentId--- Artikel-ID oder Produkt-IDslug--- Artikel-Slug (nur Blog; bei Market weggelassen)locales--- Blog:enplus Schlüssel aus dem Artikel-locales-JSON; Market:defaultCatalogLocaleoderenaction---published,updated,unpublishedoderdeleted
Wann Mailoo sendet
- Erstellen mit
PUBLISHED→published - Aktualisierung, die
PUBLISHEDwird oder bleibt →published/updated - Status verlässt
PUBLISHED→unpublished - Löschen im veröffentlichten Zustand →
deleted(danach keine Statuszeilen-Aktualisierung) - Nur-Entwurf-Schreibvorgänge → keine Benachrichtigung;
indexNowStatusbleibtnull
Erwartete Antworten
- 2xx --- akzeptiert (Sie können IndexNOW asynchron in die Warteschlange stellen). Mailoo setzt
NOTIFIED. - 404 / 5xx / Netzwerk / Timeout --- Mailoo setzt
FAILED. Inhaltsveröffentlichung wurde bereits committed. - Fehlende Konfiguration ---
SKIPPEDohne Anfrage.
PENDING--- Benachrichtigung unterwegsNOTIFIED--- Integrator hat 2xx zurückgegebenSKIPPED--- keineindexNow-Konfiguration auf der IntegrationFAILED--- Anfrage fehlgeschlagen oder Nicht-2xxnull--- nicht anwendbar / nie versucht
Integrator-Verantwortlichkeiten
X-Mailoo-Signatureverifizieren (ungültige Signaturen ablehnen).- Öffentliche URL(s) aus
kind,contentId/slugundlocalesauflösen. - IndexNOW mit Ihrem Schlüssel aufrufen (und Host-Schlüsseldatei wie von IndexNOW gefordert).
- 2xx schnell zurückgeben; rechenintensive Arbeit bei Bedarf asynchron erledigen.
// app/api/indexnow/notify/route.ts
import { createHmac, timingSafeEqual } from 'node:crypto'
import { NextRequest, NextResponse } from 'next/server'
const SECRET = process.env.MAILOO_INDEXNOW_SECRET!
function verify(signatureHeader: string | null, body: string): boolean {
if (!signatureHeader) return false
const m = /^t=(\d+),v1=([a-f0-9]+)$/i.exec(signatureHeader.trim())
if (!m) return false
const [, t, v1] = m
const expected = createHmac('sha256', SECRET)
.update(`${t}.${body}`)
.digest('hex')
try {
return timingSafeEqual(Buffer.from(v1, 'hex'), Buffer.from(expected, 'hex'))
} catch {
return false
}
}
export async function POST(req: NextRequest) {
const raw = await req.text()
if (!verify(req.headers.get('x-mailoo-signature'), raw)) {
return NextResponse.json({ error: 'invalid signature' }, { status: 401 })
}
const payload = JSON.parse(raw) as {
kind: string
action: string
contentId: string
slug?: string
locales: string[]
}
// URLs aus Payload erstellen, dann POST an https://api.indexnow.org/indexnow
void payload
return NextResponse.json({ ok: true })
}
- BLOG- oder MARKET-Integration
indexNow.notifyUrl+secretkonfiguriert (optional; ohne wird der StatusSKIPPED)- Ihre Website implementiert den Notify-Endpunkt und das IndexNOW-Schlüssel-Hosting
Beispiel: mailoo.app als Integrator
Die Mailoo-Marketing-Website ist sowohl ein Blog-Konsument als auch ein IndexNOW-Integrator für diese Blog-Integration. Muster zum Nachahmen:
- Nur-Server-Umgebung auf der Website: gemeinsames Signier-Secret, IndexNOW-Schlüssel und öffentliche
SITE_URL. - IndexNOW-Schlüsseldatei unter
https://{your-domain}/{key}.txthosten. POST /api/indexnow/notifyimplementieren, der HMAC verifiziert, öffentliche URLs aus der Nutzlast erstellt und sie anhttps://api.indexnow.org/indexnowübermittelt.- Auf der Blog-Integration
notifyUrlauf diesen Endpunkt undsecretauf dasselbe Signier-Secret setzen (Dashboard oder MCPmanage_blog_integration_settings).