{"openapi":"3.1.0","info":{"title":"skribb","version":"1.0.0","description":"Det offentlige API-et til skribb. Nøkkelen bestemmer hvilken publikasjon den når, så det finnes ingen publikasjonsparameter noe sted. Full referanse med eksempler på https://skribb.no/utviklere.","contact":{"name":"skribb","url":"https://skribb.no/utviklere","email":"post@skribb.no"}},"servers":[{"url":"https://api.skribb.no/v1"}],"tags":[{"name":"Nøkkelen","description":"Hva nøkkelen er, hvilken publikasjon den når og hva den får lov til. Enhver gyldig nøkkel når denne ruta, også en som bare har én tilgang."},{"name":"Filer","description":"Her laster du opp bilder og nedlastingsfiler. Opplastingsruta tar multipart/form-data i stedet for JSON, fordi bodyen er en fil. Har du bildet liggende på en adresse i stedet for på disk, henter from-url det for deg, og den ruta er vanlig JSON."},{"name":"Publikasjonen","description":"Tittelen, undertittelen, «Om»-teksten i bunnen og om publikasjonen skal finnes i søk. Det du ellers ville endret under Innstillinger."},{"name":"Domene","description":"Adressen publikasjonen svarer på, og hva som eventuelt står igjen før den virker. Ruta leser bare. Den kan verken kjøpe, flytte eller si opp et domene. Et .no-kjøp er en erklæring fra den som skal eie navnet, og det er ikke noe en integrasjon gjør på vegne av noen. Et domene kommer hit på én av to måter, og de svarer ulikt. Er det kjøpt gjennom skribb, ligger DNS-en hos oss, og da står dns null mens registration sier når det fornyes. Er det kjøpt et annet sted og koblet til, er det omvendt: dns viser postene du legger inn hos leverandøren din, og registration står null. Egen adresse følger med skribb Pro og begge nettsted-pakkene, men ruta svarer uansett: uten et eget domene får du domain null og skribb-adressen."},{"name":"Utseende","description":"Tema, fargemodus, aksentfarge, skrifter og selve leseflaten, slik de står under Utseende i Innstillinger. Verdiene er faste nøkler fra palettene våre. Hver av dem er målt mot WCAG AA før den ble lagt til, og det er derfor ruta ikke tar imot en fargekode. Egne farger setter du under Finjustering, der vi kan måle dem mens du velger."},{"name":"Innlegg","description":"Innleggene i publikasjonen din. Brødteksten er Portable Text, så content er alltid fasiten, men du kan skrive og lese Markdown i stedet."},{"name":"Notater","description":"Korte notater: det som lander i notatstrømmen på tvers av publikasjoner. De deler tilgang med innlegg. Et notat er et kort innlegg og publiserer samme vei."},{"name":"Abonnenter","description":"Lista over dem som får nyhetsbrevet. Den kan bare leses: påmelding er en samtykkehandling som skal gjennom den vanlige bekreftelsen. Hvert oppslag logges med nøkkelens id."},{"name":"Innsikt","description":"Tallene bak Innsikt i oversikten. Fordi reads teller innloggede lesere, er dette atferdsdata om mennesker, og det ligger derfor bak analytics:read og ikke posts:read."},{"name":"Sider","description":"De frie sidene i nettstedbyggeren, altså ikke forsida, bloggen, butikken eller forhåndsvisningen, som skribb eier selv. Finnes bare på en publikasjon av typen nettsted; en blogg svarer 409 not-a-site-publication. Krever en publikasjon satt opp som nettsted. Meldinger krever i tillegg et abonnement, Enkel eller Komplett."},{"name":"Meny","description":"Lenkene øverst på nettstedet, i den rekkefølgen de vises. Er menyen tom, viser nettstedet standardmenyen, og da svarer ruta med en tom liste. Det er plass til 12 lenker. Menyen finnes bare på en publikasjon av typen nettsted; en blogg svarer 409 not-a-site-publication. Krever en publikasjon satt opp som nettsted. Meldinger krever i tillegg et abonnement, Enkel eller Komplett."},{"name":"Meldinger","description":"Det besøkende har skrevet til deg: innsendte kontaktskjemaer og chat-samtaler. Du kan lese dem, si fra at du har tatt hånd om en av dem, svare i chat og slette. Uten abonnement svarer rutene 409 komplett-plan-required i stedet for en tom liste. Chat finnes bare på Komplett, så på Enkel er chat-lista tom uten at noe er galt. Hvert oppslag og hver sletting logges med nøkkelens id, som på abonnentlista. Krever en publikasjon satt opp som nettsted. Meldinger krever i tillegg et abonnement, Enkel eller Komplett. Krever et abonnement på nettstedet. Kontaktskjemaet følger med både Enkel og Komplett, chat bare med Komplett."},{"name":"Produkter og lager","description":"Varene i nettbutikken. Uten en påslått butikk svarer rutene 409 shop-not-enabled. Krever at nettbutikken er slått på."},{"name":"Kategorier","description":"Registeret som gir kategori-sluggene på et produkt et navn. Uten en rad her har slugen ingenting å slå opp, og produktet viser seg ikke under noen kategori. Krever at nettbutikken er slått på."},{"name":"Kampanjer","description":"Rabattkodene og tilbudene i butikken. Én regel dekker alle formene: en kode kunden skriver inn, et tilbud som slår inn av seg selv, fri frakt over et beløp, en pris bare for abonnenter. Lesing og skriving er to ulike tilganger, fordi en rabattkode er penger. Krever at nettbutikken er slått på."},{"name":"Bestillinger","description":"Betalte kjøp. En bestilling bærer kjøperens e-post, og for fysiske varer navn og adresse, så orders:read gir mer personopplysninger enn noen annen tilgang. Som resten av nettbutikken krever rutene at butikken er slått på, ellers svarer de 409 shop-not-enabled. Krever at nettbutikken er slått på."},{"name":"Butikkinnstillinger","description":"Frakt og nedlastingsgrenser. Frakt har sin egen tilgang: en fraktrad er en pris kjøperen ender opp med å betale. Krever at nettbutikken er slått på."}],"x-tagGroups":[{"name":"Plattform","tags":["Nøkkelen","Filer"]},{"name":"Publikasjon","tags":["Publikasjonen","Domene","Utseende","Innlegg","Notater","Abonnenter","Innsikt"]},{"name":"Nettsted","tags":["Sider","Meny","Meldinger"]},{"name":"Nettbutikk","tags":["Produkter og lager","Kategorier","Kampanjer","Bestillinger","Butikkinnstillinger"]}],"paths":{"/me":{"get":{"operationId":"getMe","summary":"Hvilken publikasjon nøkkelen gjelder, og hva den får lov til","description":"Bruk den til å bekrefte at oppsettet er riktig før du bygger videre. products sier hvilke av de tre produktene publikasjonen faktisk har, så du slipper å kalle en rute for å finne ut at den svarer 409. Nøkkelen vises med navnet du ga den og de første tegnene, aldri i sin helhet.\n\nEnhver gyldig nøkkel når denne ruta.","tags":["Nøkkelen"],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"publication":{"$ref":"#/components/schemas/Publication","description":"Publikasjonen nøkkelen når."},"products":{"$ref":"#/components/schemas/ProductLines","description":"Hvilke produkter publikasjonen har, og hvilken pakke de går på."},"key":{"$ref":"#/components/schemas/Key","description":"Nøkkelen selv."}},"required":["publication","products","key"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/media":{"post":{"operationId":"postMedia","summary":"Last opp et bilde eller en nedlastingsfil","description":"purpose=image legger filen i det åpne mediebiblioteket og svarer med en url du kan legge inn i images på et produkt. purpose=post legger den i publikasjonens eget mediebibliotek og svarer med en id du kan sette som featured_image.id på et innlegg. De to er ikke samme sted, og det er derfor det er to: et innlegg viser til forsidebildet sitt med en id fra sitt eget bibliotek, så en url herfra er ikke noe featured_image kan holde. purpose=delivery legger filen i den private butikkbøtta og svarer med en key du kan sette som delivery_file_key, og med vilje uten url: filen er det kjøperen betaler for, og den serveres bare gjennom nedlastingsruta etter et betalt kjøp.\n\nKrever tilgangen `media:write`.","tags":["Filer"],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"purpose":{"type":"string","description":"image for et produktbilde, post for et forsidebilde til et innlegg, delivery for en fil kjøperen laster ned."},"file":{"type":"string","format":"binary","description":"Selve filen. Bilder kan være inntil 5 MB, og må være PNG, JPG, WebP, SVG eller GIF."}},"required":["purpose","file"]}}}},"responses":{"201":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"media":{"$ref":"#/components/schemas/Media","description":"Filen slik den ble lagret."}},"required":["media"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/media/from-url":{"post":{"operationId":"postMediaFromUrl","summary":"Hent et bilde fra en adresse","description":"Ligger bildet allerede på en adresse, henter vi det og legger det der du sier, så du slipper å laste det ned selv for å laste det opp igjen. Svaret er det samme som fra opplastingsruta, pluss source. purpose er post eller image, ikke delivery: å hente en adresse inn i den private butikkbøtta er noe annet enn å gi et innlegg et forsidebilde. Vi henter bare over https, følger inntil tre videresendinger og sjekker hver eneste adresse på veien, tar bare PNG, JPG, WebP og GIF, og aldri SVG, som er et dokument som kan kjøre kode. Det er innholdstypen som avgjør, ikke hva adressen slutter på, og vi leser aldri mer enn 5 MB. Adresser som peker inn i vårt eget eller ditt eget nett, blir avvist.\n\nKrever tilgangen `media:write`.","tags":["Filer"],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Sender du den, henter vi bildet én gang selv om kallet kommer to ganger. Svaret på det andre kallet er det samme som på det første.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"https-adressen bildet ligger på."},"purpose":{"type":"string","description":"post for et forsidebilde til et innlegg, image for et produktbilde. Standard er post."}},"required":["url"]}}}},"responses":{"201":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"media":{"$ref":"#/components/schemas/Media","description":"Bildet slik det ble lagret."}},"required":["media"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/publication":{"get":{"operationId":"getPublication","summary":"Hent innstillingene for publikasjonen","description":"Her står bare det du kan endre. Kortnavnet i adressen, hva slags publikasjon det er og hvilke produkter den har, får du fra /v1/me, og ingenting av det kan settes herfra.\n\nKrever tilgangen `publication:read`.","tags":["Publikasjonen"],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"settings":{"$ref":"#/components/schemas/PublicationSettings","description":"Innstillingene."}},"required":["settings"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"patchPublication","summary":"Endre en eller flere av dem","description":"Felt du ikke sender, står som de er. Send minst ett, ellers svarer vi 422 empty-update. En verdi som er for lang, blir avvist med en kode som navngir feltet. Vi kutter den aldri for deg, for du ville ikke sett hva som forsvant. Endringen går ut til publikasjonen med det samme, og hvis vi ikke når fram akkurat da, står den lagret her og går ut ved neste lagring.\n\nKrever tilgangen `publication:write`.","tags":["Publikasjonen"],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"2 til 120 tegn. Vi trimmer mellomrom i endene."},"tagline":{"type":["string","null"],"description":"Inntil 200 tegn. Send null eller tom streng for å fjerne undertittelen."},"footer_about":{"type":"string","description":"Inntil 280 tegn. Tom streng fjerner den."},"search_visible":{"type":"boolean","description":"true lar publikasjonen finnes i søk, false skjuler den."}}}}}},"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"settings":{"$ref":"#/components/schemas/PublicationSettings","description":"Innstillingene slik de nå er."}},"required":["settings"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/domain":{"get":{"operationId":"getDomain","summary":"Hent adressen publikasjonen svarer på","description":"Venter et tilkoblet domene fortsatt, slår vi opp postene mens du spør, og state på hver post sier om vi fant den. Det er den delen som svarer på hvorfor et domene ikke virker ennå: en post som står missing eller other, er en post som er skrevet feil eller lagt inn på feil navn. Er domenet i drift, slår vi ikke opp noe, og postene står unchecked. Når vi ikke fram til tjenesten som kjenner statusen, svarer vi 502 domain-status-unavailable i stedet for å svare uten poster.\n\nKrever tilgangen `domain:read`.","tags":["Domene"],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"anyOf":[{"$ref":"#/components/schemas/Domain"},{"type":"null"}],"description":"Domenet, eller null når publikasjonen ikke har koblet til noe eget."},"skribb_url":{"type":"string","description":"skribb-adressen. Den svarer alltid, også når et eget domene er koblet til, og innlogging og administrasjon ligger uansett her."}},"required":["domain","skribb_url"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/style":{"get":{"operationId":"getStyle","summary":"Hent utseendet","description":"Tema, fargemodus, aksent og skrifter gjelder alt publikasjonen viser leserne: bloggen, nettstedet og butikken. Resten former lesesidene. skribbs egne sider er monokrome uansett hva publikasjonen velger.\n\nKrever tilgangen `style:read`.","tags":["Utseende"],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"style":{"$ref":"#/components/schemas/PublicationStyle","description":"Utseendet."}},"required":["style"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"patchStyle","summary":"Endre en eller flere av dem","description":"Send de feltene du vil endre. Resten står. Sender du ingen av dem, svarer vi 422 empty-update. En verdi utenfor paletten blir avvist med en kode som navngir feltet, og svaret lister i allowed alt ruta ville tatt imot, så du kan rette den uten å slå opp. Det nye utseendet går ut til publikasjonen med en gang. Skulle vi ikke nå fram akkurat da, ligger det lagret her og går ut ved neste lagring.\n\nKrever tilgangen `style:write`.","tags":["Utseende"],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"theme":{"type":"string","enum":["default","warm","whimsical","sober","midnight","forest","editorial","clinical","mono","sand","high-contrast","dusk","slate","ocean"],"description":"Fargetemaet. Det tinter hele flaten og bestemmer om siden starter lys eller mørk. default er den nøytrale flaten uten farge. Bytter du tema, nullstiller vi fargene publikasjonen har satt selv under Finjustering, og svaret sier fra med custom_colors_cleared."},"color_mode":{"type":"string","enum":["auto","light","dark"],"description":"Lys eller mørk som utgangspunkt. auto følger temaets egen standard og deretter leserens system. Leserens egen bryter vinner uansett."},"accent":{"type":"string","enum":["default","blue","green","rust","plum","crimson","teal","amber","indigo"],"description":"Aksentfargen: lenker, knapper og de små detaljene som skal skille seg ut. default er monokrom. En aksent du velger her, overstyrer den temaet kommer med."},"font":{"type":"string","enum":["default","serif","warm-serif","sans","mono","literata","newsreader","fraunces","work-sans","custom"],"description":"Brødtekstskriften. default er Georgia. custom er skriftfilen publikasjonen har lastet opp selv, og den kan bare velges når det ligger en der."},"heading_font":{"type":"string","enum":["default","serif","warm-serif","sans","mono","literata","newsreader","fraunces","work-sans","custom"],"description":"Overskriftsskriften. default lar overskriftene følge brødteksten."},"link_style":{"type":"string","enum":["default","subtle","bold"],"description":"Hvordan lenker i teksten ser ut."},"home_layout":{"type":"string","enum":["posts-first","mix","notes-first","notes-only"],"description":"Hvordan forsiden settes sammen av innlegg og notater. Med notes-only står bare notatstrømmen på forsiden. Innleggene ligger fortsatt under Innlegg."},"header_style":{"type":"string","enum":["default","centered"],"description":"Toppen av siden: logo til venstre, eller logo over en sentrert menyrad."},"cover_style":{"type":"string","enum":["default","compact","hidden"],"description":"Hvordan forsidebildet vises øverst i et innlegg."},"reader_width":{"type":"string","enum":["default","narrow","wide"],"description":"Bredden på tekstspalten. default er 680 px."},"reader_size":{"type":"string","enum":["default","small","large"],"description":"Størrelsen på brødteksten. default er 18 px."},"reader_leading":{"type":"string","enum":["default","tight","airy"],"description":"Linjeavstanden i brødteksten."},"syntax_highlight":{"type":"boolean","description":"Fargelegging av kodeblokker. Den laster et bibliotek hos leseren, og er derfor av som standard."},"recipe_mode":{"type":"boolean","description":"Oppskriftsmodus: ingredienslister og trinn blir avkryssbare. Vi utleder dem fra teksten, så oppskriften skrives som vanlig."}}}}}},"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"style":{"$ref":"#/components/schemas/PublicationStyle","description":"Utseendet slik det nå er."},"custom_colors_cleared":{"type":"boolean","description":"Med når et nytt tema nullstilte fargene publikasjonen hadde satt selv. De var valgt mot paletten som gjaldt da, og målt mot den, så vi tar dem heller enn å blande to temaer. Skriftene, formene og tettheten står."}},"required":["style"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/posts":{"get":{"operationId":"getPosts","summary":"Hent alle innlegg","description":"Uten brødtekst, og uten paginering: lista gir alt på én gang. Hent ett innlegg for å få innholdet.\n\nKrever tilgangen `posts:read`.","tags":["Innlegg"],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"posts":{"type":"array","items":{"$ref":"#/components/schemas/PostSummary"},"description":"Alle innlegg."}},"required":["posts"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"postPosts","summary":"Opprett en kladd","description":"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.\n\nKrever tilgangen `posts:write`.","tags":["Innlegg"],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"Tittelen. Uten den får en ny kladd «Uten tittel»."},"excerpt":{"type":"string","description":"Ingressen."},"slug":{"type":"string","description":"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."},"content":{"type":"array","items":{"type":"object"},"description":"Brødteksten som Portable Text. Kan ikke sendes sammen med markdown."},"markdown":{"type":"string","description":"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."},"categories":{"type":"array","items":{"type":"string"},"description":"Kategorinavn. Erstatter dem som står der."},"tags":{"type":"array","items":{"type":"string"},"description":"Stikkordnavn. Erstatter dem som står der."},"paid":{"type":"boolean","description":"Slår betalingsmuren på eller av."},"paywall_after_blocks":{"type":"integer","description":"Hvor mange blokker som vises gratis. 0 eller mer."},"required_tier":{"type":"string","description":"Nivået en leser må ha."},"featured_image":{"anyOf":[{"$ref":"#/components/schemas/FeaturedImageInput"},{"type":"null"}],"description":"Forsidebildet, satt med en media-id du får av å laste opp med purpose=post. null fjerner bildet."},"publish":{"type":"boolean","description":"true publiserer. Er innlegget aldri publisert før, går nyhetsbrevet ut til abonnentene i samme slengen."},"send_newsletter":{"type":"boolean","description":"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."}}}}}},"responses":{"201":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"post":{"$ref":"#/components/schemas/PostRef","description":"Kladden som ble opprettet."}},"required":["post"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/posts/{id}":{"get":{"operationId":"getPostsById","summary":"Hent ett innlegg med brødtekst","description":"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.\n\nKrever tilgangen `posts:read`.","tags":["Innlegg"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"format","in":"query","required":false,"description":"markdown, eller utelat for bare Portable Text.","schema":{"type":"string"}}],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"post":{"$ref":"#/components/schemas/Post","description":"Innlegget."}},"required":["post"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"patchPostsById","summary":"Endre, eventuelt publiser","description":"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.\n\nKrever tilgangen `posts:write`.","tags":["Innlegg"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"Tittelen. Uten den får en ny kladd «Uten tittel»."},"excerpt":{"type":"string","description":"Ingressen."},"slug":{"type":"string","description":"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."},"content":{"type":"array","items":{"type":"object"},"description":"Brødteksten som Portable Text. Kan ikke sendes sammen med markdown."},"markdown":{"type":"string","description":"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."},"categories":{"type":"array","items":{"type":"string"},"description":"Kategorinavn. Erstatter dem som står der."},"tags":{"type":"array","items":{"type":"string"},"description":"Stikkordnavn. Erstatter dem som står der."},"paid":{"type":"boolean","description":"Slår betalingsmuren på eller av."},"paywall_after_blocks":{"type":"integer","description":"Hvor mange blokker som vises gratis. 0 eller mer."},"required_tier":{"type":"string","description":"Nivået en leser må ha."},"featured_image":{"anyOf":[{"$ref":"#/components/schemas/FeaturedImageInput"},{"type":"null"}],"description":"Forsidebildet, satt med en media-id du får av å laste opp med purpose=post. null fjerner bildet."},"publish":{"type":"boolean","description":"true publiserer. Er innlegget aldri publisert før, går nyhetsbrevet ut til abonnentene i samme slengen."},"send_newsletter":{"type":"boolean","description":"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."}}}}}},"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"post":{"$ref":"#/components/schemas/PostRef","description":"Innlegget slik det nå står."}},"required":["post"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/posts/{id}/send":{"post":{"operationId":"postPostsByIdSend","summary":"Send innlegget som nyhetsbrev","description":"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».\n\nKrever tilgangen `newsletter:send`.","tags":["Innlegg"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"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.","schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"dry_run":{"type":"boolean","description":"true teller mottakerne og sender ingenting."}}}}}},"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"send":{"$ref":"#/components/schemas/NewsletterSend","description":"Hva som gikk ut, eller ville gått."}},"required":["send"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/posts/{id}/schedule":{"post":{"operationId":"postPostsByIdSchedule","summary":"Sett en kladd i kø","description":"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.\n\nKrever tilgangen `posts:write`.","tags":["Innlegg"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"publish_at":{"type":"string","description":"ISO 8601 i UTC. Må ligge fram i tid."},"send_newsletter":{"type":"boolean","description":"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ø."}},"required":["publish_at"]}}}},"responses":{"201":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"schedule":{"$ref":"#/components/schemas/Schedule","description":"Køplassen."}},"required":["schedule"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"getPostsByIdSchedule","summary":"Se når et innlegg går ut","description":"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.\n\nKrever tilgangen `posts:read`.","tags":["Innlegg"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"schedule":{"$ref":"#/components/schemas/Schedule","description":"Køplassen."}},"required":["schedule"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deletePostsByIdSchedule","summary":"Avlys en køplass","description":"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.\n\nKrever tilgangen `posts:write`.","tags":["Innlegg"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"canceled":{"type":"string","description":"Id-en til innlegget som ble tatt ut."}},"required":["canceled"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/notes":{"get":{"operationId":"getNotes","summary":"Hent publiserte notater","description":"Leses fra den samme speilingen strømmen selv rendrer, så API-et og strømmen kan ikke bli uenige. Nyeste først.\n\nKrever tilgangen `posts:read`.","tags":["Notater"],"parameters":[{"name":"limit","in":"query","required":false,"description":"1 til 200. Standard er 50.","schema":{"type":"string"}}],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"notes":{"type":"array","items":{"$ref":"#/components/schemas/Note"},"description":"Notatene, nyeste først."}},"required":["notes"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"postNotes","summary":"Publiser et notat","description":"Et notat har ingen kladd: det publiseres med det samme. Speilingen GET leser, kommer et øyeblikk etter, så et notat du nettopp lagde, kan mangle i lista et lite øyeblikk.\n\nKrever tilgangen `posts:write`.","tags":["Notater"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"Tittelen. Kan ikke være tom."},"body":{"type":"string","description":"Teksten under tittelen."},"link_url":{"type":"string","description":"Må begynne med http:// eller https://. Valgfritt."},"link_title":{"type":"string","description":"Teksten på lenka."}},"required":["title"]}}}},"responses":{"201":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"note":{"$ref":"#/components/schemas/NoteRef","description":"Notatet som ble publisert."}},"required":["note"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/subscribers":{"get":{"operationId":"getSubscribers","summary":"Hent abonnentlista","description":"Krever at du har godtatt Tillegg E i databehandleravtalen. Har du ikke det, svarer ruta 403 dpa-not-accepted, også om nøkkelen ellers er i orden.\n\nKrever tilgangen `subscribers:read`.","tags":["Abonnenter"],"parameters":[{"name":"status","in":"query","required":false,"description":"venter, bekreftet eller avmeldt.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"1 til 1000. Standard er 1000.","schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"description":"next_cursor fra forrige side.","schema":{"type":"string"}}],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"subscribers":{"type":"array","items":{"$ref":"#/components/schemas/Subscriber"},"description":"Denne sida av lista."},"has_more":{"type":"boolean","description":"Om det finnes en side til."},"next_cursor":{"type":["string","null"],"description":"Sendes som ?cursor= for neste side. null når du er ferdig."}},"required":["subscribers","has_more","next_cursor"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/insights":{"get":{"operationId":"getInsights","summary":"Hent lesertall per innlegg","description":"reads og saves kommer alltid. views og traffic ligger på publikasjonen din og er et Pro-gode, så de er null uten Pro, eller hvis vi ikke fikk svar. Null betyr «vi vet ikke», ikke «ingen kom»; et innlegg med ekte null visninger står som 0 så lenge vi har tall i det hele tatt.\n\nKrever tilgangen `analytics:read`.","tags":["Innsikt"],"parameters":[{"name":"limit","in":"query","required":false,"description":"1 til 200. Standard er 50.","schema":{"type":"string"}}],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"posts":{"type":"array","items":{"$ref":"#/components/schemas/InsightPost"},"description":"Ett tall-sett per innlegg."},"totals":{"type":"object","description":"reads og saves lagt sammen over alle innleggene, som to heltall."},"traffic":{"anyOf":[{"$ref":"#/components/schemas/Traffic"},{"type":"null"}],"description":"null uten Pro, og null hvis publikasjonen ikke svarte."}},"required":["posts","totals","traffic"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/pages":{"get":{"operationId":"getPages","summary":"Hent alle egne sider","description":"Krever tilgangen `pages:read`.","tags":["Sider"],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"pages":{"type":"array","items":{"$ref":"#/components/schemas/Page"},"description":"Alle frie sider, med blokker."}},"required":["pages"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/pages/{slug}":{"get":{"operationId":"getPagesBySlug","summary":"Hent én side","description":"Krever tilgangen `pages:read`.","tags":["Sider"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"page":{"$ref":"#/components/schemas/Page","description":"Sida."}},"required":["page"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"putPagesBySlug","summary":"Lag eller erstatt en side","description":"PUT og ikke PATCH: en side er blokklista si, og en delvis endring av en sortert liste betyr ingenting fornuftig. Send hele sida. 201 når den er ny, 200 når du erstatter en som fantes. Blokker vi ikke kjenner igjen, blir forkastet i stedet for å velte hele lagringen, så les blocks i svaret om du er i tvil på hva som gikk inn.\n\nKrever tilgangen `pages:write`.","tags":["Sider"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"Tittelen. Inntil 200 tegn."},"blocks":{"type":"array","items":{"type":"object"},"description":"Blokkene, i rekkefølge. Tom liste er lov og gir en tom side. Blokker som ikke går an å lese, blir forkastet."}},"required":["title","blocks"]}}}},"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"page":{"$ref":"#/components/schemas/Page","description":"Sida slik den ble lagret."}},"required":["page"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deletePagesBySlug","summary":"Slett en side","description":"En ekte sletting, i motsetning til produkter. En side har ingen historikk å bevare. Peker menyen på sida, svarer vi 409 page-in-menu i stedet, og menu i svaret sier hvilke lenker det gjelder: en meny som peker på en side som ikke finnes, er nettopp det PUT /v1/menu nekter å lage, og da kan ikke sletting lage det i stedet. Vi rydder den ikke for deg, for hva som skal stå i toppen av nettstedet, er ditt valg og ikke vårt.\n\nKrever tilgangen `pages:write`.","tags":["Sider"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"string","description":"Slugen til sida som ble slettet."}},"required":["deleted"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/menu":{"get":{"operationId":"getMenu","summary":"Hent menyen","description":"Krever tilgangen `pages:read`.","tags":["Meny"],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/MenuItem"},"description":"Lenkene, i rekkefølge. Kan være tom."}},"required":["items"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"putMenu","summary":"Erstatt menyen","description":"Send hele lista. Rekkefølgen du sender, er rekkefølgen menyen vises i, så en delvis endring betyr ingenting fornuftig. Tom liste er en ekte verdi: da er du tilbake til standardmenyen. Vi lagrer ikke bare de gyldige lenkene. Er det noe galt med en av dem, blir hele kallet avvist, og index i svaret sier hvilken. Peker en lenke på en side du ikke har, svarer vi 422 no-such-page, og pages i svaret lister sidene som finnes. Sletter du sida senere, blir lenka stående, akkurat som i byggeren.\n\nKrever tilgangen `pages:write`.","tags":["Meny"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/MenuItem"},"description":"Hele menyen, i den rekkefølgen du vil ha den. Inntil 12 lenker."}},"required":["items"]}}}},"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/MenuItem"},"description":"Menyen slik den nå er."}},"required":["items"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/messages":{"get":{"operationId":"getMessages","summary":"Hent kontaktskjemaer og chat-samtaler","description":"Uten kind får du begge deler. Dette er et øyeblikksbilde og blar ikke: to lister i én body kan ikke dele én cursor, så du får de nyeste limit av hver. Skal du lese hele postkassa, eller spørre igjen med jevne mellomrom, bruk /messages/kontakt og /messages/chat, som har cursor.\n\nKrever tilgangen `messages:read`.","tags":["Meldinger"],"parameters":[{"name":"kind","in":"query","required":false,"description":"kontakt eller chat. Utelat for begge.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"1 til 200. Standard er 50.","schema":{"type":"string"}}],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"kontakt":{"type":"array","items":{"$ref":"#/components/schemas/ContactMessage"},"description":"Utelatt helt når du ba om ?kind=chat."},"chat":{"type":"array","items":{"$ref":"#/components/schemas/ChatThread"},"description":"Utelatt helt når du ba om ?kind=kontakt."}}}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/messages/kontakt":{"get":{"operationId":"getMessagesKontakt","summary":"Hent kontaktskjemaer","description":"Nyeste først, med cursor, så du kan lese helt til bunnen. Det kan du ikke på /messages, som bare gir deg toppen av lista.\n\nKrever tilgangen `messages:read`.","tags":["Meldinger"],"parameters":[{"name":"status","in":"query","required":false,"description":"new, replied eller archived. Utelat for alle.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"1 til 200. Standard er 50.","schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"description":"next_cursor fra forrige side.","schema":{"type":"string"}}],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"kontakt":{"type":"array","items":{"$ref":"#/components/schemas/ContactMessage"},"description":"Denne sida."},"has_more":{"type":"boolean","description":"Om det finnes en side til."},"next_cursor":{"type":["string","null"],"description":"Send den som ?cursor= for neste side. null på siste side."}},"required":["kontakt","has_more","next_cursor"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/messages/kontakt/{id}":{"get":{"operationId":"getMessagesKontaktById","summary":"Hent ett kontaktskjema","description":"For deg som har lagret en id og vil lese den ene meldingen igjen, uten å bla deg gjennom postkassa for å finne den.\n\nKrever tilgangen `messages:read`.","tags":["Meldinger"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"kontakt":{"$ref":"#/components/schemas/ContactMessage","description":"Meldingen."}},"required":["kontakt"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"patchMessagesKontaktById","summary":"Flytt en melding til en annen status","description":"Slik sier du fra at du har tatt hånd om en henvendelse, så den ikke ligger som ny i innboksen til skaperen også. replied kan du sette selv: har du svart den besøkende fra ditt eget system, er det sant, og alternativet er en innboks som er uenig med det som faktisk skjedde. replied_at settes samtidig.\n\nKrever tilgangen `messages:write`.","tags":["Meldinger"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","description":"new, replied eller archived."}},"required":["status"]}}}},"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"kontakt":{"$ref":"#/components/schemas/ContactMessage","description":"Meldingen etterpå."}},"required":["kontakt"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteMessagesKontaktById","summary":"Slett en melding for godt","description":"Dette er ikke arkivering. Meldingen er borte, og det finnes ingen kopi noe annet sted. Bruk archived hvis du bare vil ha den ut av lista. Sletting logges med nøkkelens id.\n\nKrever tilgangen `messages:write`.","tags":["Meldinger"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"string","description":"Id-en til meldingen som ble slettet."}},"required":["deleted"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/messages/chat":{"get":{"operationId":"getMessagesChat","summary":"Hent chat-samtaler","description":"Sist aktive først, med cursor. Meldingene er IKKE med: en tråd kan ha 300 av dem, så en side med 50 samtaler ville dratt med seg femten tusen rader for deg som bare ville vite hvem som har skrevet. Hent den enkelte samtalen for tråden. updated_since sammenlikner med last_message_at, som bumpes hver gang noen skriver, uansett hvem.\n\nKrever tilgangen `messages:read`.","tags":["Meldinger"],"parameters":[{"name":"status","in":"query","required":false,"description":"open eller closed. Utelat for begge.","schema":{"type":"string"}},{"name":"updated_since","in":"query","required":false,"description":"ISO 8601. Bare samtaler med aktivitet etter dette.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"1 til 200. Standard er 50.","schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"description":"next_cursor fra forrige side.","schema":{"type":"string"}}],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"chat":{"type":"array","items":{"$ref":"#/components/schemas/ChatThreadSummary"},"description":"Denne sida, uten meldingene."},"has_more":{"type":"boolean","description":"Om det finnes en side til."},"next_cursor":{"type":["string","null"],"description":"Send den som ?cursor= for neste side. null på siste side."}},"required":["chat","has_more","next_cursor"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/messages/chat/{id}":{"get":{"operationId":"getMessagesChatById","summary":"Hent én chat-samtale med tråden","description":"Her ligger meldingene. Lista lar dem med vilje være, så dette er kallet du gjør for de samtalene du faktisk bryr deg om.\n\nKrever tilgangen `messages:read`.","tags":["Meldinger"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"chat":{"$ref":"#/components/schemas/ChatThread","description":"Samtalen med hele tråden."}},"required":["chat"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"patchMessagesChatById","summary":"Åpne eller lukke en samtale","description":"closed betyr håndtert for nå, ikke ferdig for godt: skriver den besøkende igjen, åpner tråden seg selv. Det er widgetens egen regel, og den kan ikke overstyres herfra, så en integrasjon som spør etter status=open, vil se tråden komme tilbake hvis den besøkende ikke var ferdig. Svaret er samtalen uten meldingene: en statusendring er ingen grunn til å sende deg tre hundre meldinger du allerede har.\n\nKrever tilgangen `messages:write`.","tags":["Meldinger"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","description":"open eller closed."}},"required":["status"]}}}},"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"chat":{"$ref":"#/components/schemas/ChatThreadSummary","description":"Samtalen etterpå, uten tråden."}},"required":["chat"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteMessagesChatById","summary":"Slett en samtale for godt","description":"Hele tråden går med. Den besøkendes kopi også, for widgeten leser tråden herfra og har ingen egen. Dette kan ikke angres. Sletting logges med nøkkelens id.\n\nKrever tilgangen `messages:write`.","tags":["Meldinger"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"string","description":"Id-en til samtalen som ble slettet."}},"required":["deleted"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/messages/chat/{id}/svar":{"post":{"operationId":"postMessagesChatByIdSvar","summary":"Svar den besøkende","description":"Svaret legger seg i tråden, og den besøkende ser det neste gang widgeten spør. Det er hele kanalen: tråden som ligger her, er samtalen, for begge parter. Derfor kan denne ruta svare, mens et svar på et kontaktskjema ikke kan. 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 på et skjema fra ditt eget system, sier du fra med PATCH og status replied. Sender du Idempotency-Key, sier vi ikke det samme to ganger til den besøkende om svaret ditt går tapt på veien.\n\nKrever tilgangen `messages:write`.","tags":["Meldinger"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"body":{"type":"string","description":"Teksten. Opptil 2000 tegn, samme grense som widgeten og innboksen har."}},"required":["body"]}}}},"responses":{"201":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"$ref":"#/components/schemas/ChatMessage","description":"Meldingen slik den ble lagret."}},"required":["message"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/products":{"get":{"operationId":"getProducts","summary":"Hent produkter","description":"Sortert slik butikken viser dem. Lista tar med produkter du har tatt ut av butikken, med is_active satt til false.\n\nKrever tilgangen `products:read`.","tags":["Produkter og lager"],"parameters":[{"name":"limit","in":"query","required":false,"description":"1 til 200. Standard er 100.","schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"description":"next_cursor fra forrige side.","schema":{"type":"string"}},{"name":"updated_since","in":"query","required":false,"description":"ISO 8601. Bare produkter endret etter dette tidspunktet. Bruk updated_at fra forrige gjennomgang.","schema":{"type":"string"}}],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"products":{"type":"array","items":{"$ref":"#/components/schemas/Product"},"description":"Denne sida med produkter."},"has_more":{"type":"boolean","description":"Om det finnes en side til."},"next_cursor":{"type":["string","null"],"description":"Sendes som ?cursor= for neste side. null når du er ferdig."}},"required":["products","has_more","next_cursor"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"postProducts","summary":"Opprett et produkt","description":"Send Idempotency-Key, så er det trygt å prøve igjen om svaret går tapt. skribb oppretter prisen hos Stripe samtidig, så stripe_price_id er satt når du får svaret. Et digitalt produkt må levere noe: uten delivery_file_key og uten delivery_reveal_text blir det avvist. Felter som hører til den andre typen, blir ignorert i stedet for å avvise kallet, så svaret er fasiten på hva som ble lagret.\n\nKrever tilgangen `products:write`.","tags":["Produkter og lager"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","description":"digital eller physical. Bestemmer hvilke av feltene under som gjelder."},"title":{"type":"string","description":"Inntil 120 tegn. Kan ikke være tom."},"slug":{"type":"string","description":"Små bokstaver, tall og bindestrek, inntil 61 tegn, og må begynne med bokstav eller tall."},"price_ore":{"type":"integer","description":"Heltall i øre, fra 100 (kr 1) til 10000000 (kr 100 000)."},"description":{"type":"string","description":"Inntil 5000 tegn. Tom om du utelater den."},"images":{"type":"array","items":{"$ref":"#/components/schemas/Image"},"description":"Hele bildelista, inntil 8. Send id på et bilde du vil beholde og utelat id på et nytt, slik som med utgaver. Rekkefølgen du sender er rekkefølgen i butikken, og det første bildet er hovedbildet. Sender du en tom liste, mister produktet bildene sine."},"image_url":{"type":["string","null"],"description":"Adressen du fikk av /media. Brukes bare når du ikke sender images, og betyr da at produktet har akkurat dette ene bildet."},"sort_order":{"type":"integer","description":"Standard er 0."},"is_active":{"type":"boolean","description":"Standard er true."},"categories":{"type":"array","items":{"type":"string"},"description":"Inntil 20 kategori-slugger. Slugger vi ikke kan bruke, blir stille utelatt fra lista i stedet for å velte kallet, så sjekk svaret om du er i tvil."},"delivery_file_key":{"type":["string","null"],"description":"Bare digitalt. Nøkkelen du fikk av /media med purpose=delivery. Sendt på et fysisk produkt blir den ignorert."},"delivery_reveal_text":{"type":["string","null"],"description":"Bare digitalt. Inntil 2000 tegn, for eksempel en lisensnøkkel. Sendt på et fysisk produkt blir den ignorert."},"inventory":{"type":["integer","null"],"description":"Bare fysisk. 0 til 1000000, eller null for uten lagerstyring. Sendt på et digitalt produkt blir den ignorert."},"weight_grams":{"type":["integer","null"],"description":"Bare fysisk. 0 til 1000000. Sendt på et digitalt produkt blir den ignorert."},"option_name":{"type":["string","null"],"description":"Hva kjøperen velger mellom utgavene, for eksempel Størrelse. Inntil 40 tegn. Uten utgaver blir den ikke brukt."},"tax_category":{"type":"string","description":"standard, book, audiobook, periodical eller food. Utelater du feltet, blir den standard. En kategori som ikke finnes, og food på et digitalt produkt, blir også til standard i stedet for å avvise kallet: vi tar heller for mye mva enn for lite, siden det første er en refusjon og det andre er penger du skylder staten."},"variants":{"type":"array","items":{"$ref":"#/components/schemas/Variant"},"description":"Hele lista med utgaver, inntil 50. Send id på en utgave du vil beholde og utelat id på en ny. Utgaver du ikke tar med, blir tatt ut av butikken. Utelater du feltet, mister produktet alle utgavene sine, som ethvert annet felt her."}},"required":["type","title","slug","price_ore"]}}}},"responses":{"201":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"product":{"$ref":"#/components/schemas/Product","description":"Produktet slik det ble lagret."}},"required":["product"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/products/{id}":{"get":{"operationId":"getProductsById","summary":"Hent ett produkt","description":"Krever tilgangen `products:read`.","tags":["Produkter og lager"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"product":{"$ref":"#/components/schemas/Product","description":"Produktet."}},"required":["product"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"patchProductsById","summary":"Endre et produkt","description":"Send hele produktet, ikke bare feltene du endrer. Navnet er PATCH, men bodyen er den samme som på POST: kontrollen av digitalt mot fysisk må se alle feltene samtidig, så et halvt produkt kan ikke godkjennes. Hent produktet, endre det du vil, send det tilbake.\n\nKrever tilgangen `products:write`.","tags":["Produkter og lager"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","description":"digital eller physical. Bestemmer hvilke av feltene under som gjelder."},"title":{"type":"string","description":"Inntil 120 tegn. Kan ikke være tom."},"slug":{"type":"string","description":"Små bokstaver, tall og bindestrek, inntil 61 tegn, og må begynne med bokstav eller tall."},"price_ore":{"type":"integer","description":"Heltall i øre, fra 100 (kr 1) til 10000000 (kr 100 000)."},"description":{"type":"string","description":"Inntil 5000 tegn. Tom om du utelater den."},"images":{"type":"array","items":{"$ref":"#/components/schemas/Image"},"description":"Hele bildelista, inntil 8. Send id på et bilde du vil beholde og utelat id på et nytt, slik som med utgaver. Rekkefølgen du sender er rekkefølgen i butikken, og det første bildet er hovedbildet. Sender du en tom liste, mister produktet bildene sine."},"image_url":{"type":["string","null"],"description":"Adressen du fikk av /media. Brukes bare når du ikke sender images, og betyr da at produktet har akkurat dette ene bildet."},"sort_order":{"type":"integer","description":"Standard er 0."},"is_active":{"type":"boolean","description":"Standard er true."},"categories":{"type":"array","items":{"type":"string"},"description":"Inntil 20 kategori-slugger. Slugger vi ikke kan bruke, blir stille utelatt fra lista i stedet for å velte kallet, så sjekk svaret om du er i tvil."},"delivery_file_key":{"type":["string","null"],"description":"Bare digitalt. Nøkkelen du fikk av /media med purpose=delivery. Sendt på et fysisk produkt blir den ignorert."},"delivery_reveal_text":{"type":["string","null"],"description":"Bare digitalt. Inntil 2000 tegn, for eksempel en lisensnøkkel. Sendt på et fysisk produkt blir den ignorert."},"inventory":{"type":["integer","null"],"description":"Bare fysisk. 0 til 1000000, eller null for uten lagerstyring. Sendt på et digitalt produkt blir den ignorert."},"weight_grams":{"type":["integer","null"],"description":"Bare fysisk. 0 til 1000000. Sendt på et digitalt produkt blir den ignorert."},"option_name":{"type":["string","null"],"description":"Hva kjøperen velger mellom utgavene, for eksempel Størrelse. Inntil 40 tegn. Uten utgaver blir den ikke brukt."},"tax_category":{"type":"string","description":"standard, book, audiobook, periodical eller food. Utelater du feltet, blir den standard. En kategori som ikke finnes, og food på et digitalt produkt, blir også til standard i stedet for å avvise kallet: vi tar heller for mye mva enn for lite, siden det første er en refusjon og det andre er penger du skylder staten."},"variants":{"type":"array","items":{"$ref":"#/components/schemas/Variant"},"description":"Hele lista med utgaver, inntil 50. Send id på en utgave du vil beholde og utelat id på en ny. Utgaver du ikke tar med, blir tatt ut av butikken. Utelater du feltet, mister produktet alle utgavene sine, som ethvert annet felt her."}},"required":["type","title","slug","price_ore"]}}}},"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"product":{"$ref":"#/components/schemas/Product","description":"Produktet slik det nå er."}},"required":["product"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteProductsById","summary":"Ta produktet ut av butikken","description":"Ikke en sletting. Raden blir stående, slik at tidligere bestillinger fortsatt viser hva som ble kjøpt og til hvilken pris.\n\nKrever tilgangen `products:write`.","tags":["Produkter og lager"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"deactivated":{"type":"string","description":"Id-en til produktet som ble tatt ut."}},"required":["deactivated"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/products/{id}/stock":{"patch":{"operationId":"patchProductsByIdStock","summary":"Juster lagerbeholdningen","description":"Bruk delta når et annet system eier lageret: to oppdateringer som lander samtidig blir begge med, der to absolutte skrivinger ville overskrevet hverandre. Et trekk som ville gjort beholdningen negativ, blir avvist med 409 og svarer med hva beholdningen faktisk er. Bare fysiske produkter har lager. Har produktet utgaver, ligger lageret på utgaven, så send variant_id. Uten den svarer vi 409 inventory-not-tracked.\n\nKrever tilgangen `products:write`.","tags":["Produkter og lager"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"variant_id":{"type":"string","description":"Utgaven beholdningen gjelder. Utelat den på et produkt uten utgaver. Gjelder både delta og set."},"delta":{"type":"integer","description":"Endring opp eller ned fra beholdningen slik den er nå. Krever at produktet alt har lagerstyring."},"set":{"type":["integer","null"],"description":"Absolutt beholdning. null slår av lagerstyring for produktet. Send enten delta eller set, ikke begge og ikke ingen."}}}}}},"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"product":{"$ref":"#/components/schemas/Product","description":"Produktet med ny beholdning."}},"required":["product"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/shop/categories":{"get":{"operationId":"getShopCategories","summary":"Hent kategoriregisteret","description":"Sortert slik butikken viser dem. Bruk dette til å finne ut hvilke slugger du kan sette på et produkt.\n\nKrever tilgangen `products:read`.","tags":["Kategorier"],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"categories":{"type":"array","items":{"$ref":"#/components/schemas/Category"},"description":"Hele registeret."}},"required":["categories"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"putShopCategories","summary":"Erstatt registeret","description":"Send hele lista. Rekkefølgen blir visningsrekkefølgen, så en delvis endring betyr ingenting fornuftig. En slug som forsvinner, blir slettet fra registeret, men produktene som pekte på den, blir stående urørt: slugen slutter bare å vise et navn, og legger du den inn igjen, er alt som før. En kategori vi ikke kan bruke, gjør at hele kallet avvises med 422.\n\nKrever tilgangen `products:write`.","tags":["Kategorier"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"categories":{"type":"array","items":{"$ref":"#/components/schemas/CategoryInput"},"description":"Hele registeret, i den rekkefølgen du vil ha det. sort_order settes av plassen i lista, så du sender den ikke."}},"required":["categories"]}}}},"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"categories":{"type":"array","items":{"$ref":"#/components/schemas/Category"},"description":"Registeret slik det nå er."}},"required":["categories"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/shop/campaigns":{"get":{"operationId":"getShopCampaigns","summary":"Hent alle kampanjene","description":"Aktive først, så alfabetisk. Hver regel har med hvor mange ganger den er brukt, og hvor mange engangskoder som er laget og brukt opp.\n\nKrever tilgangen `campaigns:read`.","tags":["Kampanjer"],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"campaigns":{"type":"array","items":{"$ref":"#/components/schemas/Campaign"},"description":"Alle reglene i butikken."}},"required":["campaigns"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"postShopCampaigns","summary":"Lag en kampanje","description":"Samme regler som skjemaet i dashbordet: en regel som slår inn av seg selv må ha en betingelse (minste kjøp, minste antall varer eller «bare abonnenter»), og en kode som allerede finnes gir 409.\n\nKrever tilgangen `campaigns:write`.","tags":["Kampanjer"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Bokstaver, tall og bindestrek. Lagres og matches med store bokstaver."},"kind":{"type":"string","description":"«code» (standard) eller «automatic»."},"effect":{"type":"string","description":"«percent», «amount» eller «free_shipping». Fri frakt må være «automatic»."},"value":{"type":"integer","description":"Prosent 1–100, eller øre av varene."},"min_subtotal_ore":{"type":"integer","description":"Minste kjøp, i øre."},"min_quantity":{"type":"integer","description":"Minste antall varer."},"subscribers_only":{"type":"boolean","description":"Bare for abonnenter."},"scope":{"type":"object","description":"Se Campaign.scope."},"starts_at":{"type":"string","description":"ISO-8601."},"ends_at":{"type":"string","description":"ISO-8601."},"max_redemptions":{"type":"integer","description":"Tak for hele butikken."},"max_per_buyer":{"type":"integer","description":"Tak per kunde."},"is_active":{"type":"boolean","description":"Utelatt betyr på."}},"required":["code","effect"]}}}},"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/Campaign","description":"Regelen slik den ble lagret."}},"required":["campaign"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/shop/campaigns/{id}":{"get":{"operationId":"getShopCampaignsById","summary":"Hent én kampanje","description":"Krever tilgangen `campaigns:read`.","tags":["Kampanjer"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/Campaign","description":"Regelen."}},"required":["campaign"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"patchShopCampaignsById","summary":"Endre en kampanje","description":"Felt du ikke sender, står igjen som de var. Send null for å tømme et felt som har lov til å stå tomt, for eksempel ends_at hvis kampanjen skal vare til du selv stopper den, eller max_per_buyer hvis taket skal bort. Vil du avslutte en kampanje, send is_active: false, så beholder du regelen og engangskodene til neste gang.\n\nKrever tilgangen `campaigns:write`.","tags":["Kampanjer"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","description":"Ny kode."},"value":{"type":"integer","description":"Ny prosent eller nytt beløp."},"min_subtotal_ore":{"type":"integer","description":"Nytt minste kjøp."},"ends_at":{"type":"string","description":"Ny sluttdato, ISO-8601."},"max_per_buyer":{"type":"integer","description":"Nytt tak per kunde."},"is_active":{"type":"boolean","description":"false avslutter kampanjen."}}}}}},"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"campaign":{"$ref":"#/components/schemas/Campaign","description":"Regelen slik den nå er."}},"required":["campaign"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteShopCampaignsById","summary":"Slett en kampanje","description":"Sletter regelen og engangskodene som hører til. Bestillingene som brukte den, står urørt: de tok vare på både koden og beløpet da de ble betalt, så et gammelt salg går fortsatt opp.\n\nKrever tilgangen `campaigns:write`.","tags":["Kampanjer"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/orders":{"get":{"operationId":"getOrders","summary":"Hent bestillinger","description":"Uten varelinjer. Hent én bestilling for å få dem.\n\nKrever tilgangen `orders:read`.","tags":["Bestillinger"],"parameters":[{"name":"status","in":"query","required":false,"description":"paid, fulfilled, canceled eller refunded.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"1 til 200. Standard er 50.","schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"description":"next_cursor fra forrige side.","schema":{"type":"string"}},{"name":"updated_since","in":"query","required":false,"description":"ISO 8601. Bare bestillinger endret etter dette tidspunktet. Statusbytter og sporingsnummer teller som endring.","schema":{"type":"string"}}],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"orders":{"type":"array","items":{"$ref":"#/components/schemas/Order"},"description":"Denne sida med bestillinger, uten items."},"has_more":{"type":"boolean","description":"Om det finnes en side til."},"next_cursor":{"type":["string","null"],"description":"Sendes som ?cursor= for neste side. null når du er ferdig."}},"required":["orders","has_more","next_cursor"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/orders/{id}":{"get":{"operationId":"getOrdersById","summary":"Hent én bestilling med varelinjer","description":"Krever tilgangen `orders:read`.","tags":["Bestillinger"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"order":{"$ref":"#/components/schemas/Order","description":"Bestillingen, med items."}},"required":["order"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/orders/{id}/fulfill":{"post":{"operationId":"postOrdersByIdFulfill","summary":"Merk som sendt","description":"Kjøperen får e-post med sporingsnummeret. Navngir du fraktselskapet, blir nummeret en lenke kjøperen kan åpne, og bestillinger du leser ut igjen har tracking_url ferdig satt sammen. Merker du den samme bestillingen igjen, får du 409 i stedet, så kjøperen ikke får to beskjeder.\n\nKrever tilgangen `orders:write`.","tags":["Bestillinger"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"tracking_note":{"type":"string","description":"Sporingsnummer eller en kort beskjed til kjøperen. Valgfritt."},"tracking_carrier":{"type":"string","description":"posten, postnord eller helthjem. Noe annet svarer 422. Valgfritt, men uten den blir sporingsnummeret bare tekst og ikke en lenke."}}}}}},"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"order":{"$ref":"#/components/schemas/Order","description":"Bestillingen slik den nå er."}},"required":["order"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/orders/{id}/refund":{"post":{"operationId":"postOrdersByIdRefund","summary":"Refunder hele beløpet","description":"200 betyr at Stripe tok imot refusjonen, ikke at bestillingen alt står som refundert. Statusen settes av Stripe sitt varsel like etter, og svaret her viser bestillingen slik den er i øyeblikket. Bare betalte og sendte bestillinger kan refunderes.\n\nKrever tilgangen `orders:write`.","tags":["Bestillinger"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"order":{"$ref":"#/components/schemas/Order","description":"Bestillingen slik den er i øyeblikket, som regel fortsatt paid."}},"required":["order"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/shop/settings":{"get":{"operationId":"getShopSettings","summary":"Hent frakt og nedlastingsgrenser","description":"Krever tilgangen `shop-settings:read`.","tags":["Butikkinnstillinger"],"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"settings":{"$ref":"#/components/schemas/ShopSettings","description":"Innstillingene."}},"required":["settings"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"patchShopSettings","summary":"Endre dem, felt for felt","description":"Ekte delvis endring: felt du ikke sender, står som de er. En rad vi ikke kan bruke, blir avvist med 422 og en kode som navngir feltet. Vi lagrer aldri halve tabellen.\n\nKrever tilgangen `shop-settings:write`.","tags":["Butikkinnstillinger"],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"shipping_rates":{"type":"array","items":{"$ref":"#/components/schemas/ShippingRateInput"},"description":"Hele fraktabellen. Send en tom liste for å tømme den."},"shipping_countries":{"type":"array","items":{"type":"string"},"description":"Hele landlista. Kan ikke være tom: en butikk uten land kan ikke selge noe."},"download_ttl_hours":{"type":"integer","description":"1 til 8760."},"download_max_count":{"type":"integer","description":"1 til 1000."}}}}}},"responses":{"200":{"description":"Utført.","content":{"application/json":{"schema":{"type":"object","properties":{"settings":{"$ref":"#/components/schemas/ShopSettings","description":"Innstillingene slik de nå er."}},"required":["settings"]}}}},"4XX":{"description":"Forespørselen ble avvist. Se error-koden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Feil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"En API-nøkkel du lager under Innstillinger, fanen API. Sendes som Authorization: Bearer skribb_sk_…"}},"schemas":{"Publication":{"type":"object","properties":{"handle":{"type":"string","description":"Kortnavnet i adressen, uten .skribb.no."},"title":{"type":"string","description":"Tittelen leserne ser."},"kind":{"type":"string","description":"blog eller site. Sidene i nettstedbyggeren finnes bare på site."},"shop_enabled":{"type":"boolean","description":"Om nettbutikken er slått på. Er den ikke det, svarer butikkrutene 409."},"url":{"type":"string","description":"skribb-adressen. Et eget domene, om publikasjonen har ett, viser det samme, men denne peker alltid riktig."}},"required":["handle","title","kind","shop_enabled","url"],"description":"Publikasjonen nøkkelen gjelder for."},"ProductLines":{"type":"object","properties":{"publikasjon":{"$ref":"#/components/schemas/ProductLine","description":"Innlegg, notater, abonnenter og innsikt. Alltid på. Pakken er pro eller null."},"nettsted":{"$ref":"#/components/schemas/ProductLine","description":"Sider, og med et abonnement også meldinger (chat bare på Komplett). På når publikasjonen har kind site."},"nettbutikk":{"$ref":"#/components/schemas/ProductLine","description":"Produkter, kategorier, bestillinger og butikkinnstillinger. Følger shop_enabled."}},"required":["publikasjon","nettsted","nettbutikk"],"description":"De tre produktene, hver med sin egen tilstand."},"ProductLine":{"type":"object","properties":{"enabled":{"type":"boolean","description":"Om publikasjonen har produktet i det hele tatt. Er den ikke det, svarer rutene som hører til produktet 409 og sier hvilket."},"plan":{"type":["string","null"],"description":"Pakken, med navnet du ser på fakturaen: pro, enkel eller komplett. null betyr gratisnivået, som er en ekte tilstand og ikke en manglende verdi. Nettbutikken har ingen pakker, så den står alltid null."}},"required":["enabled","plan"],"description":"Ett av produktene, slik det står for denne publikasjonen."},"Key":{"type":"object","properties":{"name":{"type":"string","description":"Navnet du ga den da du lagde den."},"prefix":{"type":"string","description":"De første tegnene. Nok til å kjenne den igjen, ikke nok til å bruke den."},"scopes":{"type":"array","items":{"type":"string"},"description":"Tilgangene den har."}},"required":["name","prefix","scopes"],"description":"Nøkkelen du kalte med."},"Media":{"type":"object","properties":{"id":{"type":"string","description":"Bare for purpose=post. Den du setter som featured_image.id på et innlegg. Et bilde lastet opp som image har ingen id, fordi det ligger et annet sted enn innleggene."},"url":{"type":"string","description":"Den offentlige adressen. For image og post. Utelatt for delivery, fordi en fil kjøperen betaler for ikke skal ha en adresse som virker uten et kjøp."},"key":{"type":"string","description":"Nøkkelen filen ligger under. Den du setter som delivery_file_key. For image og delivery."},"purpose":{"type":"string","description":"image, delivery eller post, som du sendte inn."},"source":{"type":"string","description":"Bare fra from-url: adressen bildet faktisk ble hentet fra. Den er ikke alltid den du sendte, for en adresse kan sende oss videre, og da er det denne som sier hvor bildet ligger."}},"required":["purpose"],"description":"En opplastet fil."},"PublicationSettings":{"type":"object","properties":{"title":{"type":"string","description":"Tittelen leserne ser, i toppen, i nyhetsbrevet og i RSS. 2 til 120 tegn."},"tagline":{"type":["string","null"],"description":"Undertittelen. null betyr at publikasjonen ikke har noen."},"footer_about":{"type":"string","description":"«Om»-teksten i bunnen av sidene. Den er også beskrivelsen av publikasjonen i søkeresultater og delinger. Tom streng betyr at undertittelen brukes i stedet."},"search_visible":{"type":"boolean","description":"Om publikasjonen skal kunne finnes i søk. false ber søkemotorene holde seg unna: sidene får meta robots og X-Robots-Tag, robots.txt stenger alt og sitemapet blir tomt. Det er «Skjul for søkemotorer» i Innstillinger, med motsatt fortegn."}},"required":["title","tagline","footer_about","search_visible"],"description":"Innstillingene for publikasjonen selv."},"Domain":{"type":"object","properties":{"domain":{"type":"string","description":"Domenet, i den formen DNS og sertifikatet bruker."},"display_domain":{"type":"string","description":"Det samme navnet slik en person leser det. Skiller seg bare på et domene med norske tegn i."},"registrar":{"type":"string","enum":["skribb","external"],"description":"skribb når domenet er kjøpt gjennom oss, external når det er kjøpt et annet sted og koblet til. Det avgjør hvem som holder DNS-en, og dermed hvilket av de to feltene under som er utfylt."},"status":{"type":"string","enum":["active","pending","error"],"description":"Om adressen er i drift. pending betyr at noe fortsatt er på vei, som regel poster som ikke har rukket fram. error betyr at venting ikke hjelper."},"https":{"type":"string","enum":["active","pending","error"],"description":"Det samme for sertifikatet. Et domene kan rute riktig noen minutter før HTTPS er på plass, og da står status active mens denne står pending."},"errors":{"type":"array","items":{"type":"string"},"description":"Det Cloudflare melder om vertsnavnet, ordrett og på engelsk. Vi oversetter det ikke: en melding vi ikke har skrevet selv, er lettere å søke opp i den formen den finnes i."},"dns":{"anyOf":[{"$ref":"#/components/schemas/DnsPlan"},{"type":"null"}],"description":"Postene domenet trenger. null på et domene kjøpt gjennom skribb, der sonen ligger hos oss og det ikke finnes noen poster å legge inn."},"registration":{"anyOf":[{"$ref":"#/components/schemas/DomainRegistration"},{"type":"null"}],"description":"Registreringen. null på et domene kjøpt et annet sted, der vi ikke er registrar og ikke vet noe om fornyelsen."}},"required":["domain","display_domain","registrar","status","https","errors","dns","registration"],"description":"Adressen publikasjonen svarer på, og tilstanden den er i."},"DnsPlan":{"type":"object","properties":{"zone":{"type":"string","description":"Sonen postene hører hjemme i, altså domenet du styrer hos leverandøren."},"apex":{"type":"boolean","description":"Om adressen er selve hoveddomenet. Det er tilfellet som krever ANAME eller ALIAS, og det som gjør www_alternative aktuelt."},"records":{"type":"array","items":{"$ref":"#/components/schemas/DnsRecord"},"description":"Postene, slik de skal se ut."},"www_alternative":{"anyOf":[{"$ref":"#/components/schemas/DnsAlternative"},{"type":"null"}],"description":"Med bare når adressen er et hoveddomene. Da kan nettstedet ligge på www og hoveddomenet videresende dit, som enhver leverandør får til."}},"required":["zone","apex","records","www_alternative"],"description":"Postene et tilkoblet domene trenger. null på et domene kjøpt gjennom skribb."},"DnsRecord":{"type":"object","properties":{"type":{"type":"string","enum":["ANAME","CNAME","TXT"],"description":"Posttypen. ANAME står bare på et hoveddomene: DNS tillater ikke CNAME der, så leverandøren må ha ANAME eller ALIAS. Har den ikke det, bruker du www_alternative i stedet."},"name":{"type":"string","description":"Navnefeltet slik panelet vil ha det, altså relativt til sonen, med @ for selve hoveddomenet. Limer du inn et fullt navn i et felt som venter et relativt, ender posten ett nivå for langt ute og validerer ingenting."},"value":{"type":"string","description":"Verdien posten skal peke på."},"state":{"type":"string","enum":["found","missing","other","unknown","unchecked"],"description":"Hva oppslaget vårt så. found: posten er der. missing: ingenting svarer på det navnet ennå. other: noe annet svarer, og observed sier hva. unknown: oppslaget selv gikk ikke gjennom, så vi vet ingenting. unchecked: vi slo ikke opp, fordi domenet er i drift eller fordi posten er et alternativ du ikke har valgt."},"observed":{"type":"array","items":{"type":"string"},"description":"Det som svarte i stedet, når state er other. Tom ellers. På et hoveddomene flater leverandøren ANAME ut til adresser før de når oss, og da er dette adressene vi fant, til å sammenligne selv."}},"required":["type","name","value","state","observed"],"description":"En post du legger inn hos domeneleverandøren din, og hva vi ser der nå."},"DnsAlternative":{"type":"object","properties":{"domain":{"type":"string","description":"Adressen dette alternativet gjelder."},"records":{"type":"array","items":{"$ref":"#/components/schemas/DnsRecord"},"description":"Postene for den. state står unchecked: vi slår dem ikke opp uoppfordret."}},"required":["domain","records"],"description":"Samme nettsted på www, for en leverandør uten ANAME eller ALIAS."},"DomainRegistration":{"type":"object","properties":{"registry_status":{"type":"string","enum":["active","expired","quarantined","transferred_out","deleted"],"description":"Registerets eget ord om navnet. Alt annet enn active er et navn som er på vei ut eller ute, og ingen av dem svarer på oppslag."},"expires_at":{"type":"string","description":"Når registreringen løper ut."},"auto_renew":{"type":"boolean","description":"Om domenet fornyes automatisk. Verdien følger abonnementet som betaler for det."},"payment_state":{"type":["string","null"],"enum":["failing","given_up"],"description":"null når betalingen går som den skal. failing mens et avvist kort fortsatt prøves på nytt, given_up etter siste forsøk. Da står domenet til å løpe ut, og eieren må inn og ordne kortet."},"nameservers":{"type":"array","items":{"type":"string"},"description":"Navntjenerne Norid peker navnet til. De hører til sonen vi holder for deg, og de er ikke noe du skal endre."}},"required":["registry_status","expires_at","auto_renew","payment_state","nameservers"],"description":"Registreringen, på et domene skribb er registrar for. null ellers."},"PublicationStyle":{"type":"object","properties":{"theme":{"type":"string","enum":["default","warm","whimsical","sober","midnight","forest","editorial","clinical","mono","sand","high-contrast","dusk","slate","ocean"],"description":"Fargetemaet. Det tinter hele flaten og bestemmer om siden starter lys eller mørk. default er den nøytrale flaten uten farge. Bytter du tema, nullstiller vi fargene publikasjonen har satt selv under Finjustering, og svaret sier fra med custom_colors_cleared."},"color_mode":{"type":"string","enum":["auto","light","dark"],"description":"Lys eller mørk som utgangspunkt. auto følger temaets egen standard og deretter leserens system. Leserens egen bryter vinner uansett."},"accent":{"type":"string","enum":["default","blue","green","rust","plum","crimson","teal","amber","indigo"],"description":"Aksentfargen: lenker, knapper og de små detaljene som skal skille seg ut. default er monokrom. En aksent du velger her, overstyrer den temaet kommer med."},"font":{"type":"string","enum":["default","serif","warm-serif","sans","mono","literata","newsreader","fraunces","work-sans","custom"],"description":"Brødtekstskriften. default er Georgia. custom er skriftfilen publikasjonen har lastet opp selv, og den kan bare velges når det ligger en der."},"heading_font":{"type":"string","enum":["default","serif","warm-serif","sans","mono","literata","newsreader","fraunces","work-sans","custom"],"description":"Overskriftsskriften. default lar overskriftene følge brødteksten."},"link_style":{"type":"string","enum":["default","subtle","bold"],"description":"Hvordan lenker i teksten ser ut."},"home_layout":{"type":"string","enum":["posts-first","mix","notes-first","notes-only"],"description":"Hvordan forsiden settes sammen av innlegg og notater. Med notes-only står bare notatstrømmen på forsiden. Innleggene ligger fortsatt under Innlegg."},"header_style":{"type":"string","enum":["default","centered"],"description":"Toppen av siden: logo til venstre, eller logo over en sentrert menyrad."},"cover_style":{"type":"string","enum":["default","compact","hidden"],"description":"Hvordan forsidebildet vises øverst i et innlegg."},"reader_width":{"type":"string","enum":["default","narrow","wide"],"description":"Bredden på tekstspalten. default er 680 px."},"reader_size":{"type":"string","enum":["default","small","large"],"description":"Størrelsen på brødteksten. default er 18 px."},"reader_leading":{"type":"string","enum":["default","tight","airy"],"description":"Linjeavstanden i brødteksten."},"syntax_highlight":{"type":"boolean","description":"Fargelegging av kodeblokker. Den laster et bibliotek hos leseren, og er derfor av som standard."},"recipe_mode":{"type":"boolean","description":"Oppskriftsmodus: ingredienslister og trinn blir avkryssbare. Vi utleder dem fra teksten, så oppskriften skrives som vanlig."}},"required":["theme","color_mode","accent","font","heading_font","link_style","home_layout","header_style","cover_style","reader_width","reader_size","reader_leading","syntax_highlight","recipe_mode"],"description":"Utseendet på leserbloggen. Hver verdi er en fast nøkkel, aldri en farge."},"Post":{"type":"object","properties":{"id":{"type":"string","description":"Innleggets id."},"slug":{"type":"string","description":"Adressen innlegget ligger på."},"title":{"type":"string","description":"Tittelen."},"status":{"type":"string","description":"draft eller published."},"updated_at":{"type":["string","null"],"description":"Alltid null her. Publikasjonen sender ikke tidspunktet med et enkelt innlegg. Lista har den ekte verdien."},"excerpt":{"type":"string","description":"Ingressen."},"content":{"type":"array","items":{"type":"object"},"description":"Brødteksten som Portable Text: en liste med blokker. Dette er fasiten, og det eneste som runder tur-retur uten å miste noe."},"markdown":{"type":"string","description":"Bare med ?format=markdown. En visning av content, ikke en erstatning for den."},"markdown_dropped":{"type":"array","items":{"type":"string"},"description":"Bare med ?format=markdown. Blokktypene Markdown ikke kunne bære. Tom liste betyr at alt gikk inn."},"paid":{"type":"boolean","description":"Om innlegget har betalingsmur."},"paywall_after_blocks":{"type":"integer","description":"Hvor mange blokker som vises gratis før muren."},"required_tier":{"type":"string","description":"Nivået en leser må ha for å komme inn."},"series_part":{"type":["integer","null"],"description":"Nummeret i en serie, om det er i en."},"featured_image":{"anyOf":[{"$ref":"#/components/schemas/FeaturedImage"},{"type":"null"}],"description":"Forsidebildet, eller null når innlegget ikke har noe."},"categories":{"type":"array","items":{"type":"string"},"description":"Kategorinavn, ikke slugger."},"tags":{"type":"array","items":{"type":"string"},"description":"Stikkordnavn."}},"required":["id","slug","title","status","updated_at","excerpt","content","paid","paywall_after_blocks","required_tier","series_part","featured_image","categories","tags"],"description":"Et innlegg med brødtekst."},"PostSummary":{"type":"object","properties":{"id":{"type":"string","description":"Innleggets id. Den du bruker i ruta."},"slug":{"type":"string","description":"Adressen innlegget ligger på."},"title":{"type":"string","description":"Tittelen."},"status":{"type":"string","description":"draft eller published."},"updated_at":{"type":["string","null"],"description":"ISO 8601 i UTC."}},"required":["id","slug","title","status","updated_at"],"description":"Et innlegg uten brødtekst, slik lista gir det."},"FeaturedImage":{"type":"object","properties":{"id":{"type":"string","description":"Media-id-en bildet ligger under i publikasjonens eget bibliotek. Tom streng for et bilde som ble lagt inn før idene fantes."},"url":{"type":"string","description":"Adressen bildet vises fra."},"alt":{"type":"string","description":"Alternativteksten. Tom når ingen er satt."}},"required":["id","url","alt"],"description":"Forsidebildet på et innlegg."},"FeaturedImageInput":{"type":"object","properties":{"id":{"type":"string","description":"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."},"alt":{"type":"string","description":"Alternativtekst. Utelat for å la den stå."}},"required":["id","alt"],"description":"Forsidebildet slik du setter det."},"PostRef":{"type":"object","properties":{"id":{"type":"string","description":"Innleggets id."},"published":{"type":"boolean","description":"Om innlegget står som publisert etterpå. Utelatt når kallet bare opprettet en tom kladd."}},"required":["id"],"description":"Det skrivingene svarer med. Hent innlegget om du vil ha hele."},"Schedule":{"type":"object","properties":{"post_id":{"type":"string","description":"Innlegget som venter."},"publish_at":{"type":"string","description":"Tidspunktet det går ut. ISO 8601 i UTC."},"status":{"type":"string","description":"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_error":{"type":["string","null"],"description":"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."}},"required":["post_id","publish_at","status","last_error"],"description":"Et innlegg som står i kø for å bli publisert."},"NewsletterSend":{"type":"object","properties":{"post_id":{"type":"string","description":"Adressen innlegget ligger på."},"dry_run":{"type":"boolean","description":"true når ingenting ble sendt, fordi du ba om en prøve."},"recipient_count":{"type":"integer","description":"Hvor mange abonnenter brevet gikk til, eller ville gått til. Sender publikasjonen bare til betalende, er det de betalende som telles."},"sent_count":{"type":"integer","description":"Hvor mange som fikk brevet. 0 på en prøve."},"failed_count":{"type":"integer","description":"Hvor mange adresser vi ikke kom fram til. De teller som sendt: innlegget er ute, og det går ikke ut igjen."},"quota_remaining":{"type":"integer","description":"Bare på en prøve. Hvor mange e-poster publikasjonen har igjen denne måneden."}},"required":["post_id","dry_run","recipient_count","sent_count","failed_count"],"description":"Resultatet av en utsending, eller av en prøve på en."},"Note":{"type":"object","properties":{"id":{"type":"string","description":"Notatets id hos publikasjonen."},"slug":{"type":"string","description":"Adressen notatet ligger på."},"title":{"type":"string","description":"Tittelen."},"excerpt":{"type":"string","description":"Teksten, slik strømmen viser den."},"link_url":{"type":["string","null"],"description":"Lenka notatet peker på, om det har en."},"link_title":{"type":["string","null"],"description":"Teksten på lenka."},"published_at":{"type":"string","description":"ISO 8601 i UTC."}},"required":["id","slug","title","excerpt","link_url","link_title","published_at"],"description":"Et publisert notat, slik notatstrømmen viser det."},"NoteRef":{"type":"object","properties":{"id":{"type":"string","description":"Notatets id."}},"required":["id"],"description":"Det publiseringen svarer med."},"Subscriber":{"type":"object","properties":{"email":{"type":"string","description":"E-postadressen."},"status":{"type":"string","description":"venter, bekreftet eller avmeldt. Det samme ordforrådet CSV-eksporten bruker, så de to synene på lista ikke kan bli uenige."},"frequency":{"type":"string","description":"Hvor ofte de vil ha e-post, for eksempel hver-gang."},"confirmed_at":{"type":["string","null"],"description":"ISO 8601 i UTC."},"unsubscribed_at":{"type":["string","null"],"description":"ISO 8601 i UTC."},"created_at":{"type":"string","description":"ISO 8601 i UTC."}},"required":["email","status","frequency","confirmed_at","unsubscribed_at","created_at"],"description":"En abonnent. Nok til å synke en e-postliste, ikke nok til å bygge en profil."},"InsightPost":{"type":"object","properties":{"post_id":{"type":"string","description":"Innleggets id, den samme som på /posts."},"slug":{"type":"string","description":"Adressen innlegget ligger på."},"title":{"type":"string","description":"Tittelen."},"published_at":{"type":["string","null"],"description":"ISO 8601 i UTC."},"reads":{"type":"integer","description":"Innloggede lesere som har åpnet innlegget."},"saves":{"type":"integer","description":"Hvor mange som har lagret det til senere."},"views":{"type":["integer","null"],"description":"Sidevisninger. null betyr at vi ikke vet: enten uten Pro, eller at vi ikke fikk svar fra publikasjonen. 0 betyr at vi har tall, og at ingen var innom."}},"required":["post_id","slug","title","published_at","reads","saves","views"],"description":"Tallene for ett innlegg."},"Traffic":{"type":"object","properties":{"window_days":{"type":"integer","description":"Hvor mange dager tallene dekker."},"sources":{"type":"array","items":{"$ref":"#/components/schemas/TrafficSource"},"description":"Fordelt på kilde."},"top_referrers":{"type":"array","items":{"$ref":"#/components/schemas/Referrer"},"description":"De største enkeltkildene."}},"required":["window_days","sources","top_referrers"],"description":"Trafikken samlet, for hele publikasjonen."},"TrafficSource":{"type":"object","properties":{"source":{"type":"string","description":"For eksempel search, social eller direct."},"views":{"type":"integer","description":"Visninger fra denne kilden."}},"required":["source","views"],"description":"Hvor de kom fra."},"Referrer":{"type":"object","properties":{"host":{"type":"string","description":"Vertsnavnet, for eksempel google.com."},"views":{"type":"integer","description":"Visninger derfra."}},"required":["host","views"],"description":"Et enkelt nettsted som sendte lesere."},"Page":{"type":"object","properties":{"slug":{"type":"string","description":"Adressen sida ligger på."},"title":{"type":"string","description":"Tittelen. Inntil 200 tegn."},"blocks":{"type":"array","items":{"type":"object"},"description":"Blokkene sida er satt sammen av, i rekkefølge. Hver blokk har en type og feltene den typen bruker. Blokker vi ikke kjenner igjen, er ikke med: de ble forkastet da sida ble lagret."}},"required":["slug","title","blocks"],"description":"En fri side i nettstedbyggeren."},"MenuItem":{"type":"object","properties":{"label":{"type":"string","description":"Teksten som står i menyen. Inntil 40 tegn."},"href":{"type":"string","description":"Adressen lenka går til. Enten en sti på ditt eget nettsted (/om-oss, /butikk), en full nettadresse (https://…), en mailto: eller en tel:. Andre former tar vi ikke imot."}},"required":["label","href"],"description":"En lenke i menyen øverst på nettstedet."},"ContactMessage":{"type":"object","properties":{"id":{"type":"string","description":"Meldingens id."},"name":{"type":["string","null"],"description":"Navnet avsenderen oppga."},"email":{"type":["string","null"],"description":"E-posten avsenderen oppga. Den et svar går tilbake til."},"body":{"type":"string","description":"Det de skrev."},"status":{"type":"string","description":"new eller replied."},"replied_at":{"type":["string","null"],"description":"ISO 8601 i UTC."},"created_at":{"type":"string","description":"ISO 8601 i UTC."}},"required":["id","name","email","body","status","replied_at","created_at"],"description":"Et innsendt kontaktskjema."},"ChatThreadSummary":{"type":"object","properties":{"id":{"type":"string","description":"Samtalens id."},"visitor_name":{"type":["string","null"],"description":"Navnet den besøkende oppga."},"status":{"type":"string","description":"open eller closed."},"created_at":{"type":"string","description":"ISO 8601 i UTC."},"last_message_at":{"type":["string","null"],"description":"Da det sist skjedde noe i tråden, uansett hvem som skrev. ISO 8601 i UTC. Dette er feltet updated_since sammenlikner med."}},"required":["id","visitor_name","status","created_at","last_message_at"],"description":"En chat-samtale uten meldingene."},"ChatThread":{"type":"object","properties":{"id":{"type":"string","description":"Samtalens id."},"visitor_name":{"type":["string","null"],"description":"Navnet den besøkende oppga."},"status":{"type":"string","description":"open eller closed."},"created_at":{"type":"string","description":"ISO 8601 i UTC."},"last_message_at":{"type":["string","null"],"description":"ISO 8601 i UTC."},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ChatMessage"},"description":"Hele tråden, eldste først. Den besøkendes tilgangspolett er ikke med: den er ikke en identifikator, men en nøkkel som ville latt den som holder den, lese og skrive som den besøkende."}},"required":["id","visitor_name","status","created_at","last_message_at","messages"],"description":"En chat-samtale med hele tråden."},"ChatMessage":{"type":"object","properties":{"id":{"type":"string","description":"Meldingens id."},"sender":{"type":"string","description":"visitor eller creator."},"body":{"type":"string","description":"Teksten."},"created_at":{"type":"string","description":"ISO 8601 i UTC."}},"required":["id","sender","body","created_at"],"description":"En enkelt melding i en chat-samtale."},"Product":{"type":"object","properties":{"id":{"type":"string","description":"Vår id. Den du bruker i ruta."},"type":{"type":"string","description":"digital eller physical. Kan ikke endres senere."},"title":{"type":"string","description":"Navnet kjøperen ser. Inntil 120 tegn."},"slug":{"type":"string","description":"Adressen under /butikk. Små bokstaver, tall og bindestrek, inntil 61 tegn."},"description":{"type":"string","description":"Brødteksten. Inntil 5000 tegn."},"price_ore":{"type":"integer","description":"Pris i øre. 100 er kr 1."},"currency":{"type":"string","description":"Alltid nok."},"image_url":{"type":["string","null"],"description":"Hovedbildet, altså url-en til det første bildet i images. Feltet er eldre enn lista og betyr fortsatt det samme."},"images":{"type":"array","items":{"$ref":"#/components/schemas/Image"},"description":"Alle bildene av produktet, i visningsrekkefølge. Det første er hovedbildet, som er det butikkoversikten og delingskortet henter. alt er skaperens egen beskrivelse av hva bildet viser."},"sort_order":{"type":"integer","description":"Lavere tall kommer først i butikken."},"is_active":{"type":"boolean","description":"false betyr at produktet er tatt ut av butikken, ikke at det er slettet."},"categories":{"type":"array","items":{"type":"string"},"description":"Kategori-slugger. Navnene ligger i kategoriregisteret."},"inventory":{"type":["integer","null"],"description":"Beholdning. null betyr uten lagerstyring. Alltid null på et digitalt produkt."},"weight_grams":{"type":["integer","null"],"description":"Vekt i gram, som fraktradene priser mot. Alltid null på et digitalt produkt."},"has_delivery_file":{"type":"boolean","description":"Om en nedlastingsfil er satt. Selve nøkkelen kommer aldri ut igjen."},"has_delivery_reveal_text":{"type":"boolean","description":"Om en leveringstekst er satt. Teksten selv kommer aldri ut igjen."},"stripe_price_id":{"type":["string","null"],"description":"Prisen hos Stripe. Vi lager og oppdaterer den for deg."},"option_name":{"type":["string","null"],"description":"Hva kjøperen velger mellom utgavene, for eksempel Størrelse. null når produktet ikke har utgaver."},"tax_category":{"type":"string","description":"Hva som selges, ikke hvilken sats som gjelder: standard, book, audiobook, periodical eller food. Vi gjør den om til en produktavgiftskode hos Stripe, og Stripe regner satsen ut fra den, hvor kjøperen er og hvor du er registrert. food finnes bare på et fysisk produkt."},"variants":{"type":"array","items":{"$ref":"#/components/schemas/Variant"},"description":"Utgavene av produktet, i visningsrekkefølge. Tom liste betyr at produktet selv er varen. Er lista ikke tom, er price_ore over den laveste prisen blant utgavene."},"created_at":{"type":"string","description":"ISO 8601 i UTC."},"updated_at":{"type":"string","description":"ISO 8601 i UTC. Dette er verdien du sender som updated_since neste gang."}},"required":["id","type","title","slug","description","price_ore","currency","image_url","images","sort_order","is_active","categories","inventory","weight_grams","has_delivery_file","has_delivery_reveal_text","stripe_price_id","option_name","tax_category","variants","created_at","updated_at"],"description":"Et produkt slik butikken lagrer det."},"Variant":{"type":"object","properties":{"id":{"type":"string","description":"Vår id. Den du sender i handlekurven."},"label":{"type":"string","description":"Verdien kjøperen velger, for eksempel M. Unik i produktet. Inntil 60 tegn."},"price_ore":{"type":"integer","description":"Egen pris i øre. En utgave arver aldri produktets."},"inventory":{"type":["integer","null"],"description":"Egen beholdning. null betyr uten lagerstyring. Har produktet utgaver, fører ikke produktet lager selv."},"weight_grams":{"type":["integer","null"],"description":"Vekt i gram. null betyr at produktets vekt gjelder."},"has_delivery_file":{"type":"boolean","description":"Om utgaven har sin egen nedlastingsfil. Er den false, gjelder produktets."},"has_delivery_reveal_text":{"type":"boolean","description":"Om utgaven har sin egen leveringstekst. Er den false, gjelder produktets."},"sort_order":{"type":"integer","description":"Lavere tall kommer først i velgeren."},"is_active":{"type":"boolean","description":"false betyr at utgaven er tatt ut av butikken. Raden blir stående for bestillingene som peker på den."},"image_id":{"type":["string","null"],"description":"Hvilket av produktets bilder utgaven viser. null betyr hovedbildet. Det gjør også en id som ikke lenger finnes i lista, så du kan slette et bilde uten å gå gjennom utgavene etterpå."},"stripe_price_id":{"type":["string","null"],"description":"Utgavens egen pris hos Stripe. Vi lager og fornyer den for deg."}},"required":["id","label","price_ore","inventory","weight_grams","has_delivery_file","has_delivery_reveal_text","sort_order","is_active","image_id","stripe_price_id"],"description":"En utgave av et produkt: en størrelse, en farge, et format. Har et produkt utgaver, er det utgaven som kjøpes, ikke produktet."},"Image":{"type":"object","properties":{"id":{"type":"string","description":"Vår id. Den er stabil, så en utgave som peker på bildet fortsetter å gjøre det når du bytter om på rekkefølgen."},"url":{"type":"string","description":"Adressen du fikk av /media."},"alt":{"type":["string","null"],"description":"Hva bildet viser, skrevet for noen som ikke ser det. null når skaperen ikke har skrevet noen. Skriv hva som er på bildet, ikke hva produktet heter: navnet står allerede rett ved siden av."}},"required":["id","url","alt"],"description":"Et bilde av et produkt. Det første i lista er hovedbildet."},"Category":{"type":"object","properties":{"slug":{"type":"string","description":"Den et produkt peker på. Små bokstaver, tall og bindestrek."},"name":{"type":"string","description":"Navnet butikken viser."},"sort_order":{"type":"integer","description":"Plassen i lista du sendte inn."}},"required":["slug","name","sort_order"],"description":"En rad i kategoriregisteret."},"CategoryInput":{"type":"object","properties":{"slug":{"type":"string","description":"Små bokstaver, tall og bindestrek. Dette er den produktene peker på, så en endring her løsner produktene fra kategorien."},"name":{"type":"string","description":"Navnet butikken viser."}},"required":["slug","name"],"description":"En kategori slik du sender den inn."},"Campaign":{"type":"object","properties":{"id":{"type":"string","description":"Vår id."},"code":{"type":"string","description":"Koden kunden skriver inn. På en regel som slår inn av seg selv er dette bare navnet du kjenner den på."},"kind":{"type":"string","description":"«code» skrives inn i kurven. «automatic» slår inn av seg selv."},"effect":{"type":"string","description":"«percent», «amount» eller «free_shipping»."},"value":{"type":"integer","description":"Prosent (1–100) eller øre av varene. 0 på fri frakt."},"min_subtotal_ore":{"type":["integer","null"],"description":"Hva kurven må komme opp i. Gjelder hele kurven, også på en regel med scope."},"min_quantity":{"type":["integer","null"],"description":"Hvor mange varer kurven må ha."},"subscribers_only":{"type":"boolean","description":"Bare for abonnenter av publikasjonen. Sjekkes på e-posten i kassen."},"scope":{"type":["object","null"],"description":"Hvilke varer regelen gjelder: {\"kind\":\"category\",\"slug\":\"boker\"} eller {\"kind\":\"products\",\"ids\":[…]}. null er hele kurven."},"starts_at":{"type":["string","null"],"description":"ISO-8601. null = med en gang."},"ends_at":{"type":["string","null"],"description":"ISO-8601. null = til du slår den av."},"max_redemptions":{"type":["integer","null"],"description":"Taket for hele butikken. Telles når en bestilling blir betalt."},"max_per_buyer":{"type":["integer","null"],"description":"Hvor mange ganger én kunde."},"times_redeemed":{"type":"integer","description":"Hvor mange ganger den er brukt."},"issued":{"type":["object","null"],"description":"Engangskoder laget på denne regelen: { total, used }. null når det ikke er laget noen."},"is_active":{"type":"boolean","description":"Om den er i bruk."},"created_at":{"type":"string","description":"ISO-8601."},"updated_at":{"type":"string","description":"ISO-8601."}},"required":["id","code","kind","effect","value","min_subtotal_ore","min_quantity","subscribers_only","scope","starts_at","ends_at","max_redemptions","max_per_buyer","times_redeemed","issued","is_active","created_at","updated_at"],"description":"En rabattregel, slik den er lagret."},"Order":{"type":"object","properties":{"id":{"type":"string","description":"Bestillingens id."},"status":{"type":"string","description":"paid, fulfilled, canceled eller refunded. Handlekurver som aldri ble betalt, er ikke bestillinger og kommer ikke ut herfra."},"buyer_email":{"type":"string","description":"Kjøperens e-post. Tom streng når kontaktopplysningene er slettet, enten på forespørsel fra kjøperen eller etter to år."},"currency":{"type":"string","description":"Alltid nok."},"subtotal_ore":{"type":"integer","description":"Varene, uten frakt, i øre."},"discount_ore":{"type":"integer","description":"Hva en rabattkode tok av varene, i øre. 0 uten kode. Regnestykket er subtotal_ore minus discount_ore pluss shipping_ore."},"discount_code":{"type":["string","null"],"description":"Koden som ble brukt. Lagret som tekst på bestillingen, så den står selv om du siden endrer eller sletter selve koden."},"free_shipping":{"type":"boolean","description":"Om en rabattregel gjorde frakten gratis. shipping_ore alene sier det ikke: en digital bestilling er 0 uansett."},"shipping_ore":{"type":"integer","description":"Frakten, i øre."},"total_ore":{"type":"integer","description":"Det kjøperen faktisk betalte, i øre."},"shipping_address":{"anyOf":[{"$ref":"#/components/schemas/ShippingAddress"},{"type":"null"}],"description":"null når bestillingen ikke har noe å sende, altså rent digitale kjøp."},"tracking_note":{"type":["string","null"],"description":"Sporingsnummeret eller beskjeden du sendte inn da du merket den som sendt."},"tracking_carrier":{"type":["string","null"],"description":"posten, postnord eller helthjem."},"tracking_url":{"type":["string","null"],"description":"Sporingssida hos fraktselskapet. Vi setter den sammen av de to over, og lagrer den aldri, så den følger med uten at du gjør noe."},"paid_at":{"type":["string","null"],"description":"ISO 8601 i UTC."},"fulfilled_at":{"type":["string","null"],"description":"ISO 8601 i UTC."},"created_at":{"type":"string","description":"ISO 8601 i UTC."},"items":{"type":"array","items":{"$ref":"#/components/schemas/OrderItem"},"description":"Bare når du henter én bestilling. Lista utelater dem."}},"required":["id","status","buyer_email","currency","subtotal_ore","discount_ore","discount_code","free_shipping","shipping_ore","total_ore","shipping_address","tracking_note","tracking_carrier","tracking_url","paid_at","fulfilled_at","created_at"],"description":"Et betalt kjøp."},"OrderItem":{"type":"object","properties":{"id":{"type":"string","description":"Varelinjas id."},"product_id":{"type":["string","null"],"description":"Produktet den kom fra. null om produktet er borte siden."},"variant_id":{"type":["string","null"],"description":"Utgaven den kom fra. null om produktet ikke har utgaver."},"title":{"type":"string","description":"Tittelen slik den var da kjøpet skjedde, ikke slik den er nå."},"variant_label":{"type":["string","null"],"description":"Utgaven slik den het da kjøpet skjedde, for eksempel M. Den du pakker etter, og den endrer seg ikke om utgaven senere får nytt navn."},"type":{"type":"string","description":"digital eller physical, slik den var."},"unit_price_ore":{"type":"integer","description":"Stykkprisen som ble betalt, i øre."},"quantity":{"type":"integer","description":"Antall."},"line_total_ore":{"type":"integer","description":"Stykkpris ganger antall, i øre."}},"required":["id","product_id","variant_id","title","variant_label","type","unit_price_ore","quantity","line_total_ore"],"description":"En varelinje. Alt er et øyeblikksbilde fra kjøpet, ikke et oppslag i dag."},"ShippingAddress":{"type":"object","properties":{"name":{"type":["string","null"],"description":"Mottakerens navn."},"line1":{"type":["string","null"],"description":"Gate og nummer."},"line2":{"type":["string","null"],"description":"Andre adresselinje, om den finnes."},"postal_code":{"type":["string","null"],"description":"Postnummer."},"city":{"type":["string","null"],"description":"Poststed."},"country":{"type":["string","null"],"description":"Landkode, ISO-3166 alfa-2."}},"required":["name","line1","line2","postal_code","city","country"],"description":"Adressen en fysisk bestilling skal til."},"ShopSettings":{"type":"object","properties":{"shipping_rates":{"type":"array","items":{"$ref":"#/components/schemas/ShippingRate"},"description":"Fraktabellen. Tom liste betyr at ingen fysisk vare kan sendes noe sted."},"shipping_countries":{"type":"array","items":{"type":"string"},"description":"Landene kassa i det hele tatt tilbyr, ISO-3166 alfa-2."},"download_ttl_hours":{"type":"integer","description":"Hvor lenge en nedlastingslenke virker etter kjøpet. 1 til 8760."},"download_max_count":{"type":"integer","description":"Hvor mange ganger den kan brukes. 1 til 1000."}},"required":["shipping_rates","shipping_countries","download_ttl_hours","download_max_count"],"description":"Frakt og nedlastingsgrenser for butikken."},"ShippingRate":{"type":"object","properties":{"service":{"type":"string","description":"Navnet kjøperen ser i kassa. Inntil 60 tegn."},"max_grams":{"type":["integer","null"],"description":"Øvre vektgrense raden gjelder til. null betyr uansett vekt, altså en flat rate. 1 til 1000000."},"amount_ore":{"type":"integer","description":"Frakten i øre. 0 til 10000000."},"countries":{"type":"array","items":{"type":"string"},"description":"Landene raden gjelder for, ISO-3166 alfa-2. Tom liste betyr alle land du sender til. Inntil 50."}},"required":["service","max_grams","amount_ore","countries"],"description":"En fraktrad. Den billigste raden som passer vekten og landet, vinner."},"ShippingRateInput":{"type":"object","properties":{"service":{"type":"string","description":"Navnet kjøperen ser i kassa. Inntil 60 tegn, og kan ikke være tomt."},"amount_ore":{"type":"integer","description":"Frakten i øre. 0 til 10000000."},"max_grams":{"type":["integer","null"],"description":"Øvre vektgrense. Utelatt eller null betyr uansett vekt. 1 til 1000000 ellers."},"countries":{"type":"array","items":{"type":"string"},"description":"ISO-3166 alfa-2. Utelatt eller tom betyr alle land du sender til. Inntil 50."}},"required":["service","amount_ore","max_grams","countries"],"description":"En fraktrad slik du sender den inn."},"Error":{"type":"object","required":["error","message","docs"],"properties":{"error":{"type":"string","description":"Maskinlesbar kode. Bygg logikken din på denne, ikke på message.","examples":["bad-json","bad-multipart","missing-bearer","invalid-key","revoked-key","expired-token","account-inactive","dpa-not-accepted"]},"message":{"type":"string","description":"Forklaring på norsk."},"field":{"type":"string","description":"Feltet feilen gjelder, når den gjelder ett bestemt."},"docs":{"type":"string","format":"uri","description":"Lenke til avsnittet som svarer på dette."}}}}},"security":[{"apiKey":[]}]}