PIM / DAM · API Reference

Pulpo Core API

Core exponerar katalog, media, kategorier, brands, etiketter och rabatter. Shoppar använder shallow/full-produkter; Hold synkar via sync-vy.

Bas-URL
http://localhost:3850
Auth
X-API-Key: <CORE_API_KEY>
Notering
Alla /api/* utom health kräver API-nyckel. Valfritt: X-Tenant-Id (default trirebels).

Om Core

Felformat

Error responsejson
{
  "ok": false,
  "error": "Validation failed",
  "issues": [
    {
      "path": [
        "sku"
      ],
      "message": "Required"
    }
  ]
}

System

GET/api/healthPublik

Health check

Publik readiness. Ingen API-nyckel.

Request

Ingen request body

Response

Tjänsten är uppe

Exampleapplication/json
{
  "ok": true,
  "service": "pulpo-core",
  "product": "PIM/DAM",
  "version": "0.1.0"
}

Produkter

GET/api/productsAuth

Lista produkter (shallow / PLP)

Returnerar ProductShallow[]. Innehåller inte lång description, attributes eller full variants[].

Parameters

NamnInTypBeskrivning
publishedquery1Endast published (butik)
categoryIdquerystringFiltrera på kategori
brandIdquerystringFiltrera på varumärke
labelIdquerystringFiltrera på etikett
qquerystringSök SKU / namn / streckkod / brand
syncquery1Hold sync-rader (annan payload)
skuquerystringFull produkt + variant via SKU

Request

Ingen request body

Response

Shallow-lista

Exampleapplication/json
{
  "ok": true,
  "tenantId": "trirebels",
  "view": "shallow",
  "products": [
    {
      "id": "prd_demo1",
      "sku": "DEMO-1",
      "name": "Demo-produkt",
      "type": "simple",
      "status": "published",
      "brand": "Trirebels",
      "brandId": "brd_trirebels",
      "priceOre": 29900,
      "priceInclOre": 37375,
      "vatRatePercent": 25,
      "currency": "SEK",
      "categoryIds": [
        "cat_apparel"
      ],
      "labelIds": [],
      "labels": [],
      "primaryAssetId": "ast_…",
      "updatedAt": "2026-09-01T12:00:00.000Z"
    }
  ]
}
GET/api/products/:idAuth

Hämta produkt (full / PDP)

Hela produkten inkl. priceInclOre på produkt och varianter.

Parameters

NamnInTypBeskrivning
id*pathstringProdukt-id

Request

Ingen request body

Response

Full produkt

Exampleapplication/json
{
  "ok": true,
  "tenantId": "trirebels",
  "view": "full",
  "product": {
    "id": "prd_demo1",
    "sku": "DEMO-1",
    "name": "Demo-produkt",
    "description": "Längre produkttext…",
    "type": "simple",
    "status": "published",
    "brandId": "brd_trirebels",
    "priceOre": 29900,
    "priceInclOre": 37375,
    "vatRatePercent": 25,
    "attributes": [
      {
        "key": "material",
        "value": "Polyester"
      }
    ],
    "variants": []
  }
}
POST/api/productsAuth

Skapa produkt

priceOre är exkl. moms.

Request

FältTypBeskrivning
sku*stringUnik SKU
name*stringVisningsnamn
brandIdstringVarumärkes-id
statusdraft | published | archivedPubliceringsstatus
typesimple | variableProdukttyp
priceOrenumberPris exkl. moms i öre
vatRatePercentnumberMomssats
Bodyapplication/json
{
  "sku": "DEMO-4",
  "name": "Ny produkt",
  "brandId": "brd_trirebels",
  "status": "draft",
  "type": "simple",
  "priceOre": 19900,
  "vatRatePercent": 25
}

Response

Skapad

Exampleapplication/json
{
  "ok": true,
  "product": {
    "id": "prd_new",
    "sku": "DEMO-4",
    "name": "Ny produkt",
    "status": "draft",
    "priceOre": 19900,
    "priceInclOre": 24875
  }
}

Rabatter

GET/api/discounts/lookupAuth

Validera rabattkod

Core applicerar inte rabatten på en korg — shop/Flow använder effect + appliesTo.

Parameters

NamnInTypBeskrivning
code*querystringRabattkod

Request

Ingen request body

Response

Träff och giltig nu

Exampleapplication/json
{
  "ok": true,
  "match": true,
  "code": "SOMMAR25",
  "inEffect": true,
  "reasons": [],
  "stackable": false,
  "effect": {
    "kind": "percent",
    "percent": 15
  },
  "appliesTo": {
    "kind": "brands",
    "label": "Varumärken",
    "all": false,
    "brandIds": [
      "brd_…"
    ]
  }
}

Kategorier

GET/api/categoriesAuth

Lista kategorier

Parameters

NamnInTypBeskrivning
rootsquery1Endast huvudkategorier
parentIdquerystringDirekta barn till parent

Request

Ingen request body

Response

Kategorilista

Exampleapplication/json
{
  "ok": true,
  "view": "roots",
  "categories": [
    {
      "id": "cat_apparel",
      "name": "Apparel",
      "slug": "apparel",
      "parentId": null
    }
  ]
}

Media

POST/api/assetsAuth

Registrera media

Registrera metadata + URL. Filuppladdning sker primärt via admin UI.

Request

Bodyapplication/json
{
  "title": "Hero",
  "filename": "hero.jpg",
  "url": "/media/ab/cd/hero-….jpg",
  "mimeType": "image/jpeg",
  "kind": "image"
}

Response

Asset registrerad

Exampleapplication/json
{
  "ok": true,
  "asset": {
    "id": "ast_…",
    "title": "Hero",
    "url": "/media/ab/cd/hero-….jpg",
    "kind": "image"
  }
}

Att tänka på

  • priceOre = exkl. moms · priceInclOre = inkl. moms (beräknat)
  • Shallow list är default för GET /api/products
  • Postman: postman/Pulpo-Core.postman_collection.json