Hopp til innhold
skribbskribb

Utviklere

Publiser fra din egen editor

Skriv i Markdown der du vil, og la innlegget lande i publikasjonen med nyhetsbrevet på riktig sted.
Alle sidene

Nøkkelen trenger

posts:writeposts:read

Huk av for disse når du lager nøkkelen. Mangler én, svarer ruta 403 og sier hvilken. Lag en nøkkel →

Hele innlegget i ett kall

Du trenger ikke opprette en kladd først og fylle den etterpå. Sender du tittel og brødtekst i det samme kallet, får du et ferdig innlegg av én forespørsel. Svaret er 201 og id-en.

Send Idempotency-Key. Går svaret tapt på veien tilbake, er det trygt å sende nøyaktig den samme forespørselen om igjen: du får det opprinnelige svaret i stedet for et innlegg til. Velg en ny nøkkel per innlegg, ikke per forsøk.

Opprett fra Markdown
curl -X POST https://api.skribb.no/v1/posts \
  -H "Authorization: Bearer skribb_sk_…" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: sommerbrev-2026-07-27" \
  -d '{
        "title": "Sommerbrev",
        "excerpt": "Om det som skjedde i juli.",
        "markdown": "Det ble en lang måned.\n\n## Det som skjedde\n\nMye.",
        "tags": ["brev"]
      }'

Hva Markdown ikke kan bære

Publikasjonen lagrer Portable Text, altså en liste med blokker. Det er derfor content alltid er fasiten: det runder tur-retur uten å miste noe. Markdown gjør vi om med den samme omskrivingen som redigeringsverktøyets egen Markdown-modus bruker.

Send enten content eller markdown, aldri begge. Sender du begge, svarer vi 422 content-and-markdown i stedet for å velge for deg. Vi vet ikke hvilken av dem du mente, og den vi ikke valgte, ville blitt kastet.

Markdown kan ikke bære skribbs egne blokker: betalingsmur, nivåsperre og abonnent-kort. Leser du et innlegg med ?format=markdown, kommer markdown_dropped ved siden av og navngir det som ikke ble med. Er lista tom, gikk alt inn.

Det betyr at en redigeringssløyfe gjennom Markdown flater ut en betalingsmur uten å si fra, hvis du ikke ser etter. Skal du endre et innlegg som har en, gå via content.

Se hva Markdown ikke klarte å bære
curl "https://api.skribb.no/v1/posts/pst_4Wm7?format=markdown" \
  -H "Authorization: Bearer skribb_sk_…"

# {
#   "post": {
#     "markdown": "…",
#     "markdown_dropped": ["paywall"],
#     "content": [ … ]
#   }
# }

Publisering sender nyhetsbrevet

{"publish": true} på et innlegg som aldri har vært publisert, sender nyhetsbrevet ut til abonnentene. Det skjer som en del av publiseringen, ikke som et eget kall du kan glemme.

Å publisere et innlegg som alt er sendt, sender ikke på nytt. Så en sløyfe som publiserer det samme innlegget om igjen, spammer ingen. Men et skript som oppretter og publiserer i én omgang, sender e-post hver gang det kjører på noe nytt. Behandle publisering som en handling du gjør bevisst.

Vil du legge inn innholdet nå og sende senere, oppretter du uten publish, og gjør publiseringen til et eget kall når det er klart.

Publiser når du er klar
curl -X PATCH https://api.skribb.no/v1/posts/pst_4Wm7 \
  -H "Authorization: Bearer skribb_sk_…" \
  -H "Content-Type: application/json" \
  -d '{"publish": true}'

Kladden ble laget, innholdet ikke lagret

Å opprette et innlegg er to steg hos oss: kladden lages, så skrives innholdet til publikasjonen. Går det første i orden og det andre ikke, svarer vi 502 og gir deg likevel id-en i post.

Uten den ville du sittet igjen med et tomt innlegg du ikke kjente id-en til, og et nytt forsøk ville lagt et til ved siden av. Prøv igjen mot den samme id-en med PATCH.

Opprett, og rydd opp hvis bare halve gikk
async function publish({ title, excerpt, markdown, tags, key }) {
  let id;
  try {
    const res = await api("/posts", {
      method: "POST",
      headers: { "Idempotency-Key": key },
      body: JSON.stringify({ title, excerpt, markdown, tags }),
    });
    id = res.post.id;
  } catch (err) {
    // Kladden finnes, innholdet gjorde ikke. Fortsett mot den.
    if (err.status !== 502 || !err.body?.post?.id) throw err;
    id = err.body.post.id;
    await api(`/posts/${id}`, {
      method: "PATCH",
      body: JSON.stringify({ title, excerpt, markdown, tags }),
    });
  }

  // Eget kall, så utsendingen er en beslutning og ikke en bivirkning.
  await api(`/posts/${id}`, { method: "PATCH", body: JSON.stringify({ publish: true }) });
  return id;
}

Bilder

Markdown som peker på bilder hos deg selv, fortsetter å peke dit, og innlegget knekker den dagen den serveren ikke svarer. Last dem opp først med POST /v1/media og purpose=image, og bruk adressen du får tilbake. Det er en egen tilgang, media:write.

Delvise endringer

PATCH på et innlegg rører bare feltene du sender. Retter du en tittel, står brødteksten der etterpå. Det skiller innlegg fra produkter, der du må sende hele produktet hver gang.

Sender du ingen felt, svarer vi 422 empty-update. Kommer den når du trodde du sendte noe, mangler som regel Content-Type: application/json, og da ble bodyen aldri lest.

Videre

Referansen for det denne guiden bruker: