Webhook API-dokumentasjon

Framtid Innhold sender en HTTP POST-forespørsel til din webhook-URL hver gang en artikkel publiseres. Denne guiden viser payload-formatet og hvordan du verifiserer signaturen.

Payload-format

Forespørselen sendes som POST med Content-Type: application/json.

{
  "article_id": "550e8400-e29b-41d4-a716-446655440000",
  "tittel": "10 tips for bedre SEO i 2026",
  "meta_tittel": "SEO-tips 2026 | Din Bedrift",
  "meta_beskrivelse": "Lær de 10 viktigste SEO-tipsene for å rangere høyere i Google i 2026.",
  "innhold_html": "<h2>1. Optimaliser for AI</h2><p>...</p>",
  "innhold_markdown": "## 1. Optimaliser for AI\n\n...",
  "nokkelord": ["seo", "søkemotoroptimalisering", "2026"],
  "bilde_urls": ["https://qkmbbzuufcrcykgamoff.supabase.co/storage/v1/object/public/article-images/..."],
  "publisert_at": "2026-04-06T12:00:00.000Z",
  "destinasjon": null
}

Feltbeskrivelser

FeltTypeBeskrivelse
article_idUUIDUnik ID for artikkelen
tittelstringArtikkeltittel
meta_tittelstring | nullSEO-tittel for title-tag
meta_beskrivelsestring | nullMeta description for SEO
innhold_htmlstringFullt artikkelinnhold i HTML
innhold_markdownstringSamme innhold som Markdown
nokkelordstring[]SEO-nøkkelord
bilde_urlsstring[]URL-er til tilhørende bilder (fra AI-generering, opplasting, eller hentet fra HTML-innholdet)
destinasjonstring | nullValgfritt mål (f.eks. spesifikk blogg-ID) — satt fra publiseringsvalg i appen
publisert_atISO 8601Tidspunkt for publisering

HMAC-signaturverifisering

Om du har konfigurert en Webhook Secret under Innstillinger, signeres hver forespørsel med HMAC-SHA256. Signaturen sendes i headeren X-Webhook-Signature med prefiks sha256=.

Node.js-eksempel

const crypto = require('crypto');

function verifiserWebhook(req, secret) {
  const signatur = req.headers['x-webhook-signature'];
  if (!signatur) return false;

  const forventet = 'sha256=' +
    crypto.createHmac('sha256', secret)
      .update(JSON.stringify(req.body))
      .digest('hex');

  return crypto.timingSafeEqual(
    Buffer.from(signatur),
    Buffer.from(forventet)
  );
}

// Express-eksempel:
app.post('/webhook', express.json(), (req, res) => {
  if (!verifiserWebhook(req, process.env.WEBHOOK_SECRET)) {
    return res.status(401).send('Ugyldig signatur');
  }

  const { tittel, innhold_html, meta_tittel } = req.body;
  // Lagre artikkelen i ditt CMS...

  res.status(200).json({ ok: true });
});

PHP-eksempel

<?php
$secret = getenv('WEBHOOK_SECRET');
$payload = file_get_contents('php://input');
$signatur = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '';

$forventet = 'sha256=' . hash_hmac('sha256', $payload, $secret);

if (!hash_equals($forventet, $signatur)) {
    http_response_code(401);
    die('Ugyldig signatur');
}

$data = json_decode($payload, true);
// $data['tittel'], $data['innhold_html'], osv.

http_response_code(200);
echo json_encode(['ok' => true]);

Retry-logikk

Om endepunktet ditt returnerer en feil eller ikke svarer innen 15 sekunder, prøver vi på nytt opptil 3 ganger med økende forsinkelse:

Alle forsøk logges og kan ses i artikkeldetalj-visningen. Ved HTTP 401/403 stoppes retrying umiddelbart.

Forventet respons

Endepunktet ditt må returnere en HTTP 2xx-statuskode for å indikere suksess. Responskroppen logges men tolkes ikke.

Brukseksempler

Sanity CMS

Bygg en liten Node.js-server som mottar webhook, konverterer HTML til Portable Text med @portabletext/toolkit, og oppretter dokumentet via Sanity Client.

Statisk nettside (Vercel/Netlify)

Bruk webhook-URL-en til å trigge en rebuild av din statiske side. Lagre artikkeldata i en JSON-fil eller database, og bygg om nettsiden automatisk.

Egenutviklet CMS

Motta artikkeldata og lagre direkte i din egen database. Bruk innhold_html for rik tekst eller innhold_markdown om systemet ditt foretrekker Markdown.