Hopp til innhold
skribbskribb

Utviklere

Innlegg

Publikasjon

Innleggene i publikasjonen din. Brødteksten er Portable Text, så content er alltid fasiten, men du kan skrive og lese Markdown i stedet.

Alle sidene

Kodeeksemplene kaller en skribb-funksjon du setter opp selv. Hent klienten for språket ditt og lim den inn én gang, så kan eksemplene under limes rett etter.

GET/v1/posts

posts:read

Hent alle innlegg

Uten brødtekst, og uten paginering: lista gir alt på én gang. Hent ett innlegg for å få innholdet.

Svaret · 200

postsPostSummary[]
Alle innlegg.
Svar
{
  "posts": [
    {
      "id": "pst_4Wm7",
      "slug": "sommerbrev",
      "title": "Sommerbrev",
      "status": "published",
      "updated_at": "2026-07-19T07:30:00.000Z"
    }
  ]
}
# Kaller skribb-klienten: https://skribb.no/utviklere/autentisering#klient
skribb "/posts"

POST/v1/posts

posts:write

Opprett en kladd

Sender du title og content i samme kall, får du et ferdig innlegg av én forespørsel. Send Idempotency-Key, så er det trygt å prøve igjen om svaret går tapt. Går kladden i orden, men innholdet ikke inn, svarer vi 502 og gir deg likevel id-en, så du kan prøve igjen mot den i stedet for å sitte igjen med et tomt innlegg. Sender du slug, blir opprettelsen idempotent på den adressen: neste gang samme slug kommer inn, svarer vi 409 slug-taken i stedet for å lage en tvilling. Det er en annen garanti enn Idempotency-Key, og de finnes begge fordi de svarer på hvert sitt spørsmål: nøkkelen dekker én forespørsel som kanskje ble sendt to ganger, i et døgn. Slugen dekker «har jeg skrevet dette før», på tvers av kjøringer, uker fra hverandre, uten at noe må huskes imellom.

Bodyen du sender

titlestring
Tittelen. Uten den får en ny kladd «Uten tittel».
excerptstring
Ingressen.
slugstring
Adressen. Settes av tittelen om du utelater den. Ved opprettelse er den samtidig dedupen: to kall med samme slug gir ett innlegg og en 409, ikke to innlegg.
contentobject[]
Brødteksten som Portable Text. Kan ikke sendes sammen med markdown.
markdownstring
Brødteksten som Markdown. Vi gjør den om til Portable Text med den samme omskrivingen redigeringsverktøyet bruker. Kan ikke sendes sammen med content.
categoriesstring[]
Kategorinavn. Erstatter dem som står der.
tagsstring[]
Stikkordnavn. Erstatter dem som står der.
paidboolean
Slår betalingsmuren på eller av.
paywall_after_blocksinteger
Hvor mange blokker som vises gratis. 0 eller mer.
required_tierstring
Nivået en leser må ha.
featured_imageFeaturedImageInput | null
Forsidebildet, satt med en media-id du får av å laste opp med purpose=post. null fjerner bildet.
publishboolean
true publiserer. Er innlegget aldri publisert før, går nyhetsbrevet ut til abonnentene i samme slengen.
send_newsletterboolean
false publiserer uten å sende nyhetsbrevet. Bare sammen med publish: true, ellers svarer vi 422. Får vi ikke stanset utsendingen, publiserer vi heller ikke: du får 502 og innlegget står som kladd.

Svaret · 201

postPostRef
Kladden som ble opprettet.
# Kaller skribb-klienten: https://skribb.no/utviklere/autentisering#klient
skribb "/posts" \
  -X POST \
  -H "content-type: application/json" \
  -d '{
    "title": "Sommerbrev",
    "slug": "sommerbrev",
    "markdown": "## Juli\n\nDet ble en lang måned.",
    "tags": [
      "brev"
    ],
    "publish": true
  }'

GET/v1/posts/{id}

posts:read

Hent ett innlegg med brødtekst

Legg til ?format=markdown for å få feltene markdown og markdown_dropped ved siden av content. Markdown kan ikke bære skribbs egne blokker, altså betalingsmur, nivåsperre og abonnent-kort, så markdown_dropped navngir det som ikke ble med. Er lista tom, gikk alt inn. content er der uansett.

?format
markdown, eller utelat for bare Portable Text.

Svaret · 200

postPost
Innlegget.
# Kaller skribb-klienten: https://skribb.no/utviklere/autentisering#klient
post_id="pst_4Wm7"

skribb "/posts/$post_id?format=markdown"

PATCH/v1/posts/{id}

posts:write

Endre, eventuelt publiser

Ekte delvis endring: felt du ikke sender, blir stående. Retter du en tittel, står brødteksten der etterpå. Send minst ett felt, ellers svarer vi 422 empty-update.

Bodyen du sender

titlestring
Tittelen. Uten den får en ny kladd «Uten tittel».
excerptstring
Ingressen.
slugstring
Adressen. Settes av tittelen om du utelater den. Ved opprettelse er den samtidig dedupen: to kall med samme slug gir ett innlegg og en 409, ikke to innlegg.
contentobject[]
Brødteksten som Portable Text. Kan ikke sendes sammen med markdown.
markdownstring
Brødteksten som Markdown. Vi gjør den om til Portable Text med den samme omskrivingen redigeringsverktøyet bruker. Kan ikke sendes sammen med content.
categoriesstring[]
Kategorinavn. Erstatter dem som står der.
tagsstring[]
Stikkordnavn. Erstatter dem som står der.
paidboolean
Slår betalingsmuren på eller av.
paywall_after_blocksinteger
Hvor mange blokker som vises gratis. 0 eller mer.
required_tierstring
Nivået en leser må ha.
featured_imageFeaturedImageInput | null
Forsidebildet, satt med en media-id du får av å laste opp med purpose=post. null fjerner bildet.
publishboolean
true publiserer. Er innlegget aldri publisert før, går nyhetsbrevet ut til abonnentene i samme slengen.
send_newsletterboolean
false publiserer uten å sende nyhetsbrevet. Bare sammen med publish: true, ellers svarer vi 422. Får vi ikke stanset utsendingen, publiserer vi heller ikke: du får 502 og innlegget står som kladd.

Svaret · 200

postPostRef
Innlegget slik det nå står.
# Kaller skribb-klienten: https://skribb.no/utviklere/autentisering#klient
post_id="pst_4Wm7"

skribb "/posts/$post_id" \
  -X PATCH \
  -H "content-type: application/json" \
  -d '{
    "publish": true,
    "send_newsletter": false
  }'

POST/v1/posts/{id}/send

newsletter:send

Send innlegget som nyhetsbrev

Et publisert innlegg går ut til abonnentene som har bedt om å få det, med det samme, og en utsending kan ikke tas tilbake. Derfor har ruta sin egen tilgang, som aldri følger med posts:write, og derfor krever den Idempotency-Key: går svaret tapt underveis, er du den eneste som vet at de to forespørslene var den samme. Hvert innlegg går ut én gang. Har det gått ut før, svarer vi 409 already-sent, og det finnes ingen force. Publiserte du med send_newsletter: false, teller sperren som en utsending. dry_run: true svarer med hvor mange brevet ville gått til, uten å sende noe og uten å kreve en nøkkel, og avviser det samme en ekte utsending ville avvist, så en prøve er et ekte svar på «hva skjer om jeg gjør dette».

Idempotency-Key:
En verdi du finner på selv, unik for denne utsendingen. Påkrevd for en ekte utsending, unødvendig på en prøve. Prøver du igjen med den samme, får du svaret fra første gang i stedet for et brev til.

Bodyen du sender

dry_runboolean
true teller mottakerne og sender ingenting.

Svaret · 200

sendNewsletterSend
Hva som gikk ut, eller ville gått.
Svar
{
  "send": {
"post_id": "sommerbrev",
"dry_run": false,
"recipient_count": 412,
"sent_count": 411,
"failed_count": 1
  }
}
# Kaller skribb-klienten: https://skribb.no/utviklere/autentisering#klient
post_id="pst_4Wm7"

skribb "/posts/$post_id/send" \
  -X POST \
  -H "content-type: application/json" \
  -d '{
    "dry_run": true
  }'

Sett en kladd i kø

Kladden publiseres av seg selv på tidspunktet du oppgir, av den samme jobben som publiserer det du planlegger i oversikten. publish_at er ISO 8601, som alle andre tidspunkt her: oversikten leser Oslo-tid fra en datovelger fordi et menneske som skriver 14:30, mener 14:30 der det står, mens du som sender JSON, mener et øyeblikk. Å gjette en tidssone på dine vegne er slik et innlegg går ut to timer for tidlig to ganger i året. Ett innlegg kan bare stå i kø én gang: står det allerede i kø, svarer vi 409 og sier når. Planlegging krever en betalt pakke på publikasjonen.

Bodyen du sender

publish_atstringpåkrevd
ISO 8601 i UTC. Må ligge fram i tid.
send_newsletterboolean
false setter innlegget i kø uten at nyhetsbrevet går når det publiseres. Utsendingen stanses med det samme, ikke når cron-jobben kjører: da er det ingen å svare til, og en sperre som feilet i det øyeblikket, ville blitt en e-post ingen ba om og ingen kunne stoppe. Får vi den ikke stanset nå, blir innlegget ikke satt i kø.

Svaret · 201

scheduleSchedule
Køplassen.
# Kaller skribb-klienten: https://skribb.no/utviklere/autentisering#klient
post_id="pst_4Wm7"

skribb "/posts/$post_id/schedule" \
  -X POST \
  -H "content-type: application/json" \
  -d '{
    "publish_at": "2026-08-01T06:00:00Z"
  }'

Se når et innlegg går ut

404 betyr at innlegget ikke står i kø, ikke at innlegget ikke finnes. Et innlegg som allerede er publisert, eller som ble avlyst, står ikke i kø lenger.

Svaret · 200

scheduleSchedule
Køplassen.
# Kaller skribb-klienten: https://skribb.no/utviklere/autentisering#klient
post_id="pst_4Wm7"

skribb "/posts/$post_id/schedule"

DELETE/v1/posts/{id}/schedule

posts:write

Avlys en køplass

Kladden blir stående urørt og kan settes i kø igjen. Dette er også veien til å flytte et tidspunkt: avlys, og legg det inn på nytt.

Svaret · 200

canceledstring
Id-en til innlegget som ble tatt ut.
# Kaller skribb-klienten: https://skribb.no/utviklere/autentisering#klient
post_id="pst_4Wm7"

skribb "/posts/$post_id/schedule" \
  -X DELETE

Objekter

Post

Et innlegg med brødtekst.

Felter

idstring
Innleggets id.
slugstring
Adressen innlegget ligger på.
titlestring
Tittelen.
statusstring
draft eller published.
updated_atstring | null
Alltid null her. Publikasjonen sender ikke tidspunktet med et enkelt innlegg. Lista har den ekte verdien.
excerptstring
Ingressen.
contentobject[]
Brødteksten som Portable Text: en liste med blokker. Dette er fasiten, og det eneste som runder tur-retur uten å miste noe.
markdownstringikke alltid med
Bare med ?format=markdown. En visning av content, ikke en erstatning for den.
markdown_droppedstring[]ikke alltid med
Bare med ?format=markdown. Blokktypene Markdown ikke kunne bære. Tom liste betyr at alt gikk inn.
paidboolean
Om innlegget har betalingsmur.
paywall_after_blocksinteger
Hvor mange blokker som vises gratis før muren.
required_tierstring
Nivået en leser må ha for å komme inn.
series_partinteger | null
Nummeret i en serie, om det er i en.
featured_imageFeaturedImage | null
Forsidebildet, eller null når innlegget ikke har noe.
categoriesstring[]
Kategorinavn, ikke slugger.
tagsstring[]
Stikkordnavn.

PostSummary

Et innlegg uten brødtekst, slik lista gir det.

Felter

idstring
Innleggets id. Den du bruker i ruta.
slugstring
Adressen innlegget ligger på.
titlestring
Tittelen.
statusstring
draft eller published.
updated_atstring | null
ISO 8601 i UTC.

FeaturedImage

Forsidebildet på et innlegg.

Felter

idstring
Media-id-en bildet ligger under i publikasjonens eget bibliotek. Tom streng for et bilde som ble lagt inn før idene fantes.
urlstring
Adressen bildet vises fra.
altstring
Alternativteksten. Tom når ingen er satt.

FeaturedImageInput

Forsidebildet slik du setter det.

Felter

idstringpåkrevd
Media-id-en du fikk da du lastet opp med purpose=post. En url går ikke an: innlegget viser til bildet sitt med en id, og en adresse er ikke noe det kan slå opp.
altstring
Alternativtekst. Utelat for å la den stå.

PostRef

Det skrivingene svarer med. Hent innlegget om du vil ha hele.

Felter

idstring
Innleggets id.
publishedbooleanikke alltid med
Om innlegget står som publisert etterpå. Utelatt når kallet bare opprettet en tom kladd.

Schedule

Et innlegg som står i kø for å bli publisert.

Felter

post_idstring
Innlegget som venter.
publish_atstring
Tidspunktet det går ut. ISO 8601 i UTC.
statusstring
pending eller failed. Et innlegg som allerede er gått ut, eller som ble avlyst, står ikke i kø lenger og svarer 404 her.
last_errorstring | null
Hvorfor siste forsøk ikke gikk gjennom. Cron-jobben prøver igjen, så failed betyr ikke nødvendigvis tapt, men dette er det ene du ikke kan regne ut selv.

NewsletterSend

Resultatet av en utsending, eller av en prøve på en.

Felter

post_idstring
Adressen innlegget ligger på.
dry_runboolean
true når ingenting ble sendt, fordi du ba om en prøve.
recipient_countinteger
Hvor mange abonnenter brevet gikk til, eller ville gått til. Sender publikasjonen bare til betalende, er det de betalende som telles.
sent_countinteger
Hvor mange som fikk brevet. 0 på en prøve.
failed_countinteger
Hvor mange adresser vi ikke kom fram til. De teller som sendt: innlegget er ute, og det går ikke ut igjen.
quota_remainingintegerikke alltid med
Bare på en prøve. Hvor mange e-poster publikasjonen har igjen denne måneden.

← Alle rutene