Hopp til innhold
skribbskribb

Utviklere

Produkter og lager

Nettbutikk

Varene i nettbutikken. Uten en påslått butikk svarer rutene 409 shop-not-enabled.

Krever at nettbutikken er slått på.

Alle sidene

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

GET/v1/products

products:read

Hent produkter

Sortert slik butikken viser dem. Lista tar med produkter du har tatt ut av butikken, med is_active satt til false.

?limit
1 til 200. Standard er 100.
?cursor
next_cursor fra forrige side.
?updated_since
ISO 8601. Bare produkter endret etter dette tidspunktet. Bruk updated_at fra forrige gjennomgang.

Svaret · 200

productsProduct[]
Denne sida med produkter.
has_moreboolean
Om det finnes en side til.
next_cursorstring | null
Sendes som ?cursor= for neste side. null når du er ferdig.
Svar
{
  "products": [{
    "id": "prod_8kQ2vX",
    "type": "physical",
    "title": "Kaffekrus",
    "slug": "kaffekrus",
    "description": "Steintøy, 3 dl.",
    "price_ore": 24900,
    "currency": "nok",
    "image_url": "https://media.skribb.no/…/krus.jpg",
    "images": [
      { "id": "img_7Hs2", "url": "https://media.skribb.no/…/krus.jpg", "alt": "Kruset sett forfra" },
      { "id": "img_9Rt4", "url": "https://media.skribb.no/…/krus-hank.jpg", "alt": null }
    ],
    "sort_order": 0,
    "is_active": true,
    "categories": ["kjokken"],
    "inventory": 42,
    "weight_grams": 380,
    "has_delivery_file": false,
    "has_delivery_reveal_text": false,
    "stripe_price_id": "price_1Qk…",
    "option_name": null,
    "tax_category": "standard",
    "variants": [],
    "created_at": "2026-07-01T09:12:00.000Z",
    "updated_at": "2026-07-20T11:04:00.000Z"
  }],
  "has_more": false,
  "next_cursor": null
}
# Kaller skribb-klienten: https://skribb.no/utviklere/autentisering#klient
skribb "/products?limit=20&updated_since=2026-08-01T06%3A00%3A00Z"

POST/v1/products

products:write

Opprett et produkt

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.

Bodyen du sender

typestringpåkrevd
digital eller physical. Bestemmer hvilke av feltene under som gjelder.
titlestringpåkrevd
Inntil 120 tegn. Kan ikke være tom.
slugstringpåkrevd
Små bokstaver, tall og bindestrek, inntil 61 tegn, og må begynne med bokstav eller tall.
price_oreintegerpåkrevd
Heltall i øre, fra 100 (kr 1) til 10000000 (kr 100 000).
descriptionstring
Inntil 5000 tegn. Tom om du utelater den.
imagesImage[]
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_urlstring | null
Adressen du fikk av /media. Brukes bare når du ikke sender images, og betyr da at produktet har akkurat dette ene bildet.
sort_orderinteger
Standard er 0.
is_activeboolean
Standard er true.
categoriesstring[]
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_keystring | null
Bare digitalt. Nøkkelen du fikk av /media med purpose=delivery. Sendt på et fysisk produkt blir den ignorert.
delivery_reveal_textstring | null
Bare digitalt. Inntil 2000 tegn, for eksempel en lisensnøkkel. Sendt på et fysisk produkt blir den ignorert.
inventoryinteger | null
Bare fysisk. 0 til 1000000, eller null for uten lagerstyring. Sendt på et digitalt produkt blir den ignorert.
weight_gramsinteger | null
Bare fysisk. 0 til 1000000. Sendt på et digitalt produkt blir den ignorert.
option_namestring | null
Hva kjøperen velger mellom utgavene, for eksempel Størrelse. Inntil 40 tegn. Uten utgaver blir den ikke brukt.
tax_categorystring
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.
variantsVariant[]
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.

Svaret · 201

productProduct
Produktet slik det ble lagret.
# Kaller skribb-klienten: https://skribb.no/utviklere/autentisering#klient
skribb "/products" \
  -X POST \
  -H "content-type: application/json" \
  -d '{
    "type": "physical",
    "title": "Krus i keramikk",
    "slug": "krus-i-keramikk",
    "price_ore": 24900,
    "description": "Håndlaget krus, 3 dl.",
    "categories": [
      "Kjøkken"
    ],
    "inventory": 12,
    "weight_grams": 350
  }'

GET/v1/products/{id}

products:read

Hent ett produkt

Svaret · 200

productProduct
Produktet.
# Kaller skribb-klienten: https://skribb.no/utviklere/autentisering#klient
product_id="prd_5Lm3"

skribb "/products/$product_id"

PATCH/v1/products/{id}

products:write

Endre et produkt

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.

Bodyen du sender

typestringpåkrevd
digital eller physical. Bestemmer hvilke av feltene under som gjelder.
titlestringpåkrevd
Inntil 120 tegn. Kan ikke være tom.
slugstringpåkrevd
Små bokstaver, tall og bindestrek, inntil 61 tegn, og må begynne med bokstav eller tall.
price_oreintegerpåkrevd
Heltall i øre, fra 100 (kr 1) til 10000000 (kr 100 000).
descriptionstring
Inntil 5000 tegn. Tom om du utelater den.
imagesImage[]
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_urlstring | null
Adressen du fikk av /media. Brukes bare når du ikke sender images, og betyr da at produktet har akkurat dette ene bildet.
sort_orderinteger
Standard er 0.
is_activeboolean
Standard er true.
categoriesstring[]
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_keystring | null
Bare digitalt. Nøkkelen du fikk av /media med purpose=delivery. Sendt på et fysisk produkt blir den ignorert.
delivery_reveal_textstring | null
Bare digitalt. Inntil 2000 tegn, for eksempel en lisensnøkkel. Sendt på et fysisk produkt blir den ignorert.
inventoryinteger | null
Bare fysisk. 0 til 1000000, eller null for uten lagerstyring. Sendt på et digitalt produkt blir den ignorert.
weight_gramsinteger | null
Bare fysisk. 0 til 1000000. Sendt på et digitalt produkt blir den ignorert.
option_namestring | null
Hva kjøperen velger mellom utgavene, for eksempel Størrelse. Inntil 40 tegn. Uten utgaver blir den ikke brukt.
tax_categorystring
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.
variantsVariant[]
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.

Svaret · 200

productProduct
Produktet slik det nå er.
# Kaller skribb-klienten: https://skribb.no/utviklere/autentisering#klient
product_id="prd_5Lm3"

skribb "/products/$product_id" \
  -X PATCH \
  -H "content-type: application/json" \
  -d '{
    "type": "digital",
    "title": "Sommerbrev",
    "slug": "sommerbrev",
    "price_ore": 24900
  }'

DELETE/v1/products/{id}

products:write

Ta produktet ut av butikken

Ikke en sletting. Raden blir stående, slik at tidligere bestillinger fortsatt viser hva som ble kjøpt og til hvilken pris.

Svaret · 200

deactivatedstring
Id-en til produktet som ble tatt ut.
# Kaller skribb-klienten: https://skribb.no/utviklere/autentisering#klient
product_id="prd_5Lm3"

skribb "/products/$product_id" \
  -X DELETE

PATCH/v1/products/{id}/stock

products:write

Juster lagerbeholdningen

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.

Bodyen du sender

variant_idstring
Utgaven beholdningen gjelder. Utelat den på et produkt uten utgaver. Gjelder både delta og set.
deltainteger
Endring opp eller ned fra beholdningen slik den er nå. Krever at produktet alt har lagerstyring.
setinteger | null
Absolutt beholdning. null slår av lagerstyring for produktet. Send enten delta eller set, ikke begge og ikke ingen.

Svaret · 200

productProduct
Produktet med ny beholdning.
Svar ved avvik
{
  "error": "would-go-negative",
  "message": "Trekket ville gjort beholdningen negativ. Svaret sier hva den faktisk er, så du kan avstemme.",
  "docs": "https://skribb.no/utviklere/referanse/produkter",
  "inventory": 2
}
# Kaller skribb-klienten: https://skribb.no/utviklere/autentisering#klient
product_id="prd_5Lm3"

skribb "/products/$product_id/stock" \
  -X PATCH \
  -H "content-type: application/json" \
  -d '{
    "delta": -1
  }'

Objekter

Product

Et produkt slik butikken lagrer det.

Felter

idstring
Vår id. Den du bruker i ruta.
typestring
digital eller physical. Kan ikke endres senere.
titlestring
Navnet kjøperen ser. Inntil 120 tegn.
slugstring
Adressen under /butikk. Små bokstaver, tall og bindestrek, inntil 61 tegn.
descriptionstring
Brødteksten. Inntil 5000 tegn.
price_oreinteger
Pris i øre. 100 er kr 1.
currencystring
Alltid nok.
image_urlstring | null
Hovedbildet, altså url-en til det første bildet i images. Feltet er eldre enn lista og betyr fortsatt det samme.
imagesImage[]
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_orderinteger
Lavere tall kommer først i butikken.
is_activeboolean
false betyr at produktet er tatt ut av butikken, ikke at det er slettet.
categoriesstring[]
Kategori-slugger. Navnene ligger i kategoriregisteret.
inventoryinteger | null
Beholdning. null betyr uten lagerstyring. Alltid null på et digitalt produkt.
weight_gramsinteger | null
Vekt i gram, som fraktradene priser mot. Alltid null på et digitalt produkt.
has_delivery_fileboolean
Om en nedlastingsfil er satt. Selve nøkkelen kommer aldri ut igjen.
has_delivery_reveal_textboolean
Om en leveringstekst er satt. Teksten selv kommer aldri ut igjen.
stripe_price_idstring | null
Prisen hos Stripe. Vi lager og oppdaterer den for deg.
option_namestring | null
Hva kjøperen velger mellom utgavene, for eksempel Størrelse. null når produktet ikke har utgaver.
tax_categorystring
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.
variantsVariant[]
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_atstring
ISO 8601 i UTC.
updated_atstring
ISO 8601 i UTC. Dette er verdien du sender som updated_since neste gang.

Variant

En utgave av et produkt: en størrelse, en farge, et format. Har et produkt utgaver, er det utgaven som kjøpes, ikke produktet.

Felter

idstring
Vår id. Den du sender i handlekurven.
labelstring
Verdien kjøperen velger, for eksempel M. Unik i produktet. Inntil 60 tegn.
price_oreinteger
Egen pris i øre. En utgave arver aldri produktets.
inventoryinteger | null
Egen beholdning. null betyr uten lagerstyring. Har produktet utgaver, fører ikke produktet lager selv.
weight_gramsinteger | null
Vekt i gram. null betyr at produktets vekt gjelder.
has_delivery_fileboolean
Om utgaven har sin egen nedlastingsfil. Er den false, gjelder produktets.
has_delivery_reveal_textboolean
Om utgaven har sin egen leveringstekst. Er den false, gjelder produktets.
sort_orderinteger
Lavere tall kommer først i velgeren.
is_activeboolean
false betyr at utgaven er tatt ut av butikken. Raden blir stående for bestillingene som peker på den.
image_idstring | null
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_idstring | null
Utgavens egen pris hos Stripe. Vi lager og fornyer den for deg.

Image

Et bilde av et produkt. Det første i lista er hovedbildet.

Felter

idstring
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.
urlstring
Adressen du fikk av /media.
altstring | null
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.

← Alle rutene