Hopp til innhold
skribbskribb

Utviklere

Endringer

Hva du kan bygge på, og hva som har endret seg.
Alle sidene

Hva vi lover om v1

Det er én versjon, v1, og den ligger i adressen. Reglene under gjelder alle kall til den.

Nye felt kan komme
Vi kan legge til felt i et svar når som helst, uten å si fra på forhånd. Klienten din må tåle felt den ikke kjenner igjen, i stedet for å avvise hele svaret. Det teller ikke som et brudd.
Nye verdier kan komme
Et felt som i dag har tre mulige verdier, kan få en fjerde. Nye statuser, nye fraktselskaper, nye hendelsestyper. Skriv koden så en ukjent verdi havner i en fornuftig gren i stedet for å velte.
Nye ruter og nye tilganger kan komme
En ny rute rører ikke de som finnes. En ny tilgang må hukes av på en nøkkel for å virke, så nøklene du har, fortsetter å gjøre nøyaktig det de gjorde.
error er kontrakten
Koden i error er den vi holder fast. message er skrevet for et menneske og kan bli bedre formulert når som helst, så ikke bygg logikk på teksten. Det samme gjelder rekkefølgen på felt og på rader vi ikke har lovet en sortering for.
Dette ville vært et brudd
Å fjerne eller døpe om et felt, å fjerne en rute, å stramme inn hva som godtas i en body, å endre hva en kode betyr eller å kreve en tilgang en rute ikke krevde før. Slikt gjør vi ikke i v1.
Hvis v2 kommer
Den ville kommet ved siden av, på sin egen adresse, mens v1 fortsetter å svare. Du ville fått beskjed på e-posten som eier nøkkelen, i god tid og med minst seks måneder på å flytte deg. Vi har ingen planer om en v2.

Bygg en klient som tåler at det kommer mer enn den vet om, og skill på error, ikke på tekst.

Endringslogg

Her står alt en kobling kan merke, med datoen det gikk i produksjon. Rene omskrivinger på vår side står ikke her, for det er ingenting du kan observere.

2026-08-17

  • EndretEn side som ligger i menyen, kan ikke slettes

    DELETE /api/v1/pages/{slug} svarer 409 page-in-menu når menyen fortsatt peker på sida, og menu i svaret sier hvilke lenker det gjelder. Før slettet den sida og lot lenka bli stående, så toppen av nettstedet pekte til ingenting. PUT /v1/menu har hele tiden nektet å lage den tilstanden, og en regel som bare gjelder den ene veien, er en regel med hull i. Rekkefølgen er nå: ta lenka ut av menyen, så slett sida. Vi rydder ikke menyen for deg, for hva som skal stå der, er ditt valg. Nettstedbyggeren gjør det samme, med en lenke rett til menyen.

  • Lagt tilHente et bilde fra en adresse

    POST /api/v1/media/from-url henter et bilde du peker på, og legger det der du sier. Svaret er det samme som fra opplastingsruta, så id-en du får med purpose=post, er den du setter som featured_image på et innlegg. Nytten er størst for et program som skriver JSON og ikke har bildet på disk: opplastingsruta tar multipart, og det er derfor den er den eneste ruta uten et verktøy i MCP-serveren. Vi henter bare over https, følger inntil tre videresendinger og sjekker hver adresse på veien, tar PNG, JPG, WebP og GIF etter innholdstype og ikke etter filendelse, og leser aldri mer enn 5 MB. SVG tar vi ikke. Tilgangen er media:write, den du har fra før. Verktøyet heter add_image.

2026-08-16

  • Lagt tilAdressen publikasjonen svarer på

    GET /api/v1/domain sier hvilket domene publikasjonen svarer på, om det er i drift, og hva som eventuelt mangler. Er domenet kjøpt et annet sted og koblet til, får du postene du skal legge inn hos leverandøren din, og mens vi venter på dem slår vi dem opp: state på hver post sier om vi fant den, om det står noe annet der, eller om det ikke er lagt inn ennå. Er domenet kjøpt gjennom skribb, ligger DNS-en hos oss, og du får registreringen i stedet, med fornyelsesdato. Ny tilgang domain:read. Ruta leser bare. Å kjøpe, flytte eller si opp et .no er en erklæring fra den som eier navnet, så noe skrivende motstykke kommer ikke.

  • Lagt tilMenyen på nettstedet

    Sider kunne lages, men ingenting kunne lenke til dem. GET /api/v1/menu henter menyen øverst på nettstedet, og PUT erstatter hele lista, der rekkefølgen du sender, er rekkefølgen som vises. En lenke går til en sti på ditt eget nettsted eller til en full nettadresse. Peker den på en side du ikke har, blir kallet avvist med no-such-page, og svaret lister sidene som finnes. Menyen ligger under tilgangene pages:read og pages:write, de samme som sidene, så en nøkkel som kan lage sider, kan også lenke til dem.

  • Lagt tilSette utseendet på publikasjonen

    Utseendet er nå noe en integrasjon kan lese og sette. GET /api/v1/style gir tema, fargemodus, aksentfarge, skrifter og leseflate, og PATCH endrer det du sender. Verdiene er de faste nøklene fra palettene våre, og en verdi utenfor dem blir avvist med et svar som lister alt ruta tar imot. Fargekoder tar den ikke: hver nøkkel er målt mot WCAG AA før den ble lagt til, og egne farger setter du under Finjustering, der vi kan måle dem mens du velger. Tilgangene heter style:read og style:write, og en nøkkel du har fra før har ingen av dem.

  • Lagt tilEndre innstillingene for publikasjonen

    GET /api/v1/publication henter tittelen, undertittelen, «Om»-teksten i bunnen og om publikasjonen skal finnes i søk. PATCH endrer feltene du sender og lar resten stå. To nye tilganger følger med, publication:read og publication:write. Nøkler du allerede har laget, har ingen av dem og virker som før. Skal en integrasjon endre innstillinger, huker du av for tilgangen på en ny nøkkel, eller ber om den i godkjenningen.

  • Lagt tilBe om tilgang på vegne av en skaper

    Bygger du noe andre skal bruke, slipper de å lime inn en nøkkel hos deg. Programmet registrerer seg selv på POST api.skribb.no/oauth/register, sender skaperen til skribb.no/gi-tilgang for å godkjenne, og bytter koden i et token på api.skribb.no/oauth/token. Tokenet varer én time og sendes som bearer akkurat som en nøkkel, så ingenting du har bygget mot API-et, endrer seg. Flyten står beskrevet på /.well-known/oauth-authorization-server og /.well-known/oauth-protected-resource, så en klient som bare kjenner adressen vår, finner fram selv. Nøkler du lager i Innstillinger, virker som før.

  • Endret401 peker på hvor tilgang fås

    WWW-Authenticate på et 401-svar bærer nå resource_metadata med adressen til /.well-known/oauth-protected-resource, slik RFC 9728 beskriver. Der står det hvilken tjeneste som gir tilgang, så en klient kan gå fra et 401 til en godkjenning uten at noen leser en side først. Bodyen og error="invalid_token" er uendret.

2026-07-28

  • EndretEnkel låser opp meldingene

    Kontaktskjemaet følger nå med begge nettsted-pakkene, ikke bare Komplett. Meldingsrutene svarer tilsvarende: har publikasjonen Enkel, får du 200 der du før fikk 409. Chat krever fortsatt Komplett, så på Enkel er chat-lista bare tom. Feilkoden for et nettsted helt uten abonnement heter fremdeles komplett-plan-required: navnet er fra da skjemaet fulgte Komplett, og det står fordi noen kan ha bygget mot det.

2026-07-27

  • Lagt tilPlanlegg uten å sende nyhetsbrevet

    send_newsletter: false virker nå også når du setter et innlegg i kø. Utsendingen stanses med det samme, ikke når cron-jobben publiserer: 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, blir innlegget ikke satt i kø.

  • Lagt tilPubliser uten å sende nyhetsbrevet

    send_newsletter: false sammen med publish: true publiserer stille. Standarden er uendret: publiserer du et innlegg som aldri har vært ute, går nyhetsbrevet fortsatt. Får vi ikke stanset utsendingen, publiserer vi heller ikke. Du får 502 og innlegget står som kladd, så en sperre som ikke virket, aldri blir til en e-post til alle. Sender du feltet uten publish, svarer vi 422 i stedet for å overse det.

  • Lagt tilPlanlegg et innlegg

    POST /api/v1/posts/{id}/schedule setter en kladd i kø, GET viser når den går ut og hva som eventuelt gikk galt, DELETE avlyser. Det er den samme jobben som publiserer det du planlegger i oversikten, ikke en ny. publish_at er ISO 8601, ikke Oslo-tid: du sender et øyeblikk, og vi gjetter ingen tidssone på dine vegne. Krever en betalt pakke på publikasjonen, ellers 409 plan-required.

  • Lagt tilslug gjør opprettelse av innlegg idempotent

    Sender du slug til POST /api/v1/posts, eier den adressen: kommer samme slug inn igjen, svarer vi 409 slug-taken i stedet for å lage en tvilling. Det er en annen garanti enn Idempotency-Key, som dekker én forespørsel i et døgn; slugen dekker «har jeg skrevet dette før» på tvers av kjøringer. Utelater du slug, er alt som før, og adressen settes av tittelen.

  • Lagt tilForsidebilde på et innlegg

    Last opp med purpose=post, og sett id-en du får som featured_image på innlegget. Innlegg svarer nå også med featured_image når de har ett. purpose=image er uendret og fortsatt det du bruker på et produkt: de to bildene ligger ikke samme sted, og et innlegg viser til sitt med en id, ikke en adresse.

  • Lagt tilMeldinger kan svares på, arkiveres og slettes

    Ny tilgang messages:write. Du kan flytte et kontaktskjema til replied eller archived, åpne og lukke en chat-samtale, svare den besøkende i chat, og slette begge deler. Chat-svaret går i tråden og vises neste gang widgeten spør. Et svar på et kontaktskjema er fortsatt ikke med: det går ut som e-post, og hvilken adresse den besøkende svarer tilbake til, er ikke et valg en nøkkel skal ta. Har du svart fra ditt eget system, sier du fra med status replied.

  • Lagt tilMeldinger blar, og kan hentes én om gangen

    /messages/kontakt og /messages/chat er nye lister med cursor, statusfilter og, for chat, updated_since. /messages selv er uendret, men blar ikke og gjør det aldri: to lister i én body kan ikke dele én cursor. Chat-lista svarer uten meldingene, så hent den enkelte samtalen for tråden.

  • Lagt til/me sier hvilke produkter publikasjonen har

    Svaret har fått products, med publikasjon, nettsted og nettbutikk, og pakken på hver: pro, enkel eller komplett, eller null for gratisnivået. Da slipper du å kalle en rute for å finne ut at den svarer 409, og du kan endelig se forskjell på Enkel og Komplett. kind og shop_enabled står som før, så ingenting som leser dem, merker noe.

  • EndretMeldinger svarer 409 uten Komplett

    GET /api/v1/messages svarte 200 med tomt svar for en publikasjon som ikke har kontaktskjema og chat i det hele tatt, altså det samme som en rolig uke. Nå kommer 409 komplett-plan-required. Har publikasjonen Komplett-pakken, er ingenting endret for deg.

  • EndretBestillingsrutene krever at nettbutikken er slått på

    GET /api/v1/orders, GET /api/v1/orders/{id} og POST /api/v1/orders/{id}/fulfill svarte 200 med tom liste når butikken var av, som er umulig å skille fra «ingen bestillinger ennå». Nå svarer de 409 shop-not-enabled, slik produktrutene og refusjonsruta alltid har gjort. Er butikken på, er ingenting endret for deg.

  • Rettetbearer med liten forbokstav ble avvist

    Authorization: bearer <nøkkel> svarte 401 missing-bearer, altså at forespørselen ikke hadde noen nøkkel i det hele tatt. Navnet på metoden er ikke skiftsensitivt, så begge skrivemåter virker nå. Har du skrevet Bearer med stor B, er ingenting endret for deg.

  • Endret401 svarer med WWW-Authenticate

    Et 401-svar bærer nå WWW-Authenticate: Bearer, og error="invalid_token" når nøkkelen fantes, men ikke holdt. Bodyen er den samme, så ingenting som leser error, merker noe.

  • Rettetfield navnga et felt som ikke fantes i bodyen

    bad-price svarte med field: "price" og bad-weight med field: "weight". Feltene heter price_ore og weight_grams på wire, så svaret pekte på en nøkkel du ikke ville finne i din egen body. Kodene er uendret; det er bare field som nå navngir det ekte feltet.

  • RettetTre koder svarte med en generisk melding

    digital-needs-delivery, not-configured og no-pat kom med «Forespørselen kunne ikke behandles» i stedet for noe som forklarte hva som var galt. Alle tre har nå en egen melding. Kodene er uendret.

  • Endretdocs i feilsvaret peker på en mer presis side

    Referansen er delt i en side per ting du kan gjøre, så docs peker nå på den siden, og på raden for den enkelte koden når det ikke finnes en mer forklarende side. Gamle lenker med #anker leder fortsatt til riktig sted via oversikten.

  • DokumentasjonOpenAPI beskriver bodyene, ikke bare rutene

    /api/v1/openapi.json har nå requestBody, svarskjema per rute og ett komponentskjema per objekt. En klientgenerator gir deg typede kall i stedet for URL-stubber. Ingenting i API-et er endret; dokumentet beskriver bare mer av det som alltid har vært der.

  • Lagt tilNotater, meldinger, innsikt, kategorier og filopplasting

    POST og GET /notes under posts-tilgangene. GET /messages under messages:read. GET /insights under analytics:read. GET og PUT /shop/categories. POST /media, det ene stedet som tar imot multipart i stedet for JSON.

  • Lagt tilMarkdown inn og ut på innlegg

    Du kan sende markdown i stedet for content, og lese med ?format=markdown. content er fortsatt fasiten: markdown_dropped navngir blokkene Markdown ikke kunne bære.

2026-07-26

  • Lagt tilWebhooks

    Signerte POST-er på order.paid, order.fulfilled, order.refunded, subscriber.confirmed og post.published, med fem forsøk over rundt åtte timer.

  • Lagt tilIdempotency-Key, paginering og ?updated_since=

    Opprettingsrutene husker svaret i et døgn per nøkkel. Lister svarer med has_more og next_cursor. Produkter og bestillinger kan hentes etter når de sist ble endret.

  • EndretFeilsvaret fikk message, field og docs

    Den var {"error": "bad-slug"} og ingenting mer. error er uendret og fortsatt det eneste du bør bygge logikk på, så ingenting som leste den, sluttet å virke.

  • RettetTidspunkter kommer som ekte ISO 8601

    Datofeltene svarte med SQLites eget format, som ingen dato-parser tar imot uten hjelp. Nå er alt ISO 8601 i UTC.

  • Lagt tilGET /api/v1/me

    Svarer på enhver gyldig nøkkel og forteller hvilken publikasjon den gjelder og hva den får lov til. Det første kallet i en ny integrasjon.

  • Lagt tilv1 åpnet

    Nøkler med avhuking per tilgang, og de første rutene: produkter og lager, bestillinger med frakt og refusjon, innlegg, sider, abonnenter og butikkinnstillinger.