Morffeus Docs
ENSR morffeus.com

Proizvodi

Proizvod je ono što prodajete. Ima jednu ili više varijanti, jedinica koje držite na zalihama i prodajete, svaku sa sopstvenom šifrom i barkodom. Katalog šaljete preko POST /int/products, a čitate ga onako kako ga prodavnica vidi preko GET /products: aktivne proizvode, sa cenama za vaše tržište i valutu, na vašem jeziku.

Od čega se proizvod sastoji#

DeoŠta sadrži
productZajednički identitet: code, barcode, external_ref, slug, status, vrstu, jedinicu mere, slike, oznake.
variantsJedinice koje držite na zalihama i prodajete, na primer veličine ili pakovanja. Svaka ima code, barcode i external_ref, i svoje zalihe, cene i slike. Proizvod uvek ima bar jednu.
detailsVaša polja: name, description, brend, težina i sve ostalo što vaša aplikacija definiše. Svako je tip podatka proizvoda vaše aplikacije (pogledajte GET /product_data_types). I naziv je detalj, a ne kolona. Detalji mogu da se prevode.
pricesRedovi u vašim katalozima (cenovnicima), po proizvodu ili po varijanti. Liste prikazuju cenu za tržište i valutu vašeg tokena.
attributesVeze sa vašim definicijama atributa, na primer Boja › Crvena.
stockPo varijanti po magacinu. Pogledajte Zalihe.

status proizvoda je 0 nacrt, 1 aktivan, 2 arhiviran ili 3 povučen iz prodaje. Liste prikazuju samo aktivne proizvode koji imaju slug, i samo njihove aktivne varijante.

Kako se proizvodi i varijante uparuju#

U POST /int/products proizvode i varijante navodite onako kako ih vaš sistem zna:

Proizvode uparujte po code. POST /int/products čita external_ref da bi našao proizvod, ali ga ne čuva, pa proizvod koji napravi ne može kasnije da se nađe po external_ref. Varijante čuvaju svoj.

Proizvod u listama#

Ono što GET /products vraća za svaki proizvod. GET /product/{id} umesto toga vraća ceo zapis.

PoljeOpis
idintegerNaš id proizvoda.
code, barcode, external_refstring · može biti nullIdentifikatori proizvoda. Svaki je jedinstven u vašoj aplikaciji.
slugstringNaziv u URL-u koji prodavnica koristi.
statusintegerOvde uvek 1: liste sadrže samo aktivne proizvode.
product_type_id, product_type, product_type_nameVrsta: real, service i ostale iz GET /product_types.
measuring_unit_id, measuring_unitmože biti nullJedinica mere, iz GET /measuring_units.
name, description, …polja detaljaVaši detalji, svaki pod nazivom svog tipa podatka, na jeziku tokena.
track_stock, available_onlinebooleanDa li se prate zalihe i da li se proizvod prodaje onlajn.
tags, catalog_tagsniz stringovaOznake proizvoda i oznake kataloga koji mu daju cenu.
image_url, imagesGlavna slika i ostale.
product_attributesniz celih brojevaId-jevi povezanih definicija atributa.
pricesniz objekataNajniža cena proizvoda za vaše tržište i valutu, kao jedan unos. Polja su ista kao u variants[].prices.
price_from, price_tonumberNajniža i najviša cena varijante.
variantsniz objekataAktivne varijante: id, code, barcode, external_ref, slug, status, ordinal, image_url, images, tags, track_stock, on_stock, store_availability, prices i detalji varijante. Varijanta bez sopstvenih cena ili slika prikazuje one sa proizvoda.
variants[].on_stockbooleanDa li varijanta ima zalihe za prodaju.
variants[].store_availabilityniz objekataZalihe po prodavnici: app_location_id, code, name, adresa i quantity.
variants[].pricesniz objekataCene varijante za vaše tržište i valutu: price, default_price, member_price, volume_price, unit_price, member_unit_price, display_price (formatirana), currency_sign, currency_id, market_id, catalog_id, catalog_item_id, subscription_interval, subscription_qty.
review_score, review_count, sales_quantitynumberOcene i prodata količina.
inserted_atdatetime · ISO 8601, UTCKad je proizvod napravljen. Šalje se bez pomaka.

Slanje proizvoda u paketu#

POST /api/v2/int/products

Pravi ili menja proizvode sa njihovim detaljima, varijantama, cenama i atributima. Svaki proizvod se uparuje po code i upisuje u sopstvenoj transakciji. Koristite ga da katalog držite usklađenim sa ERP-om.

Novi proizvodi počinju kao nacrti. Ovaj poziv ne postavlja status ni slug, pa proizvod koji napravi još nije u GET /products. Aktivirajte ga jednom preko POST /products, sa njegovim id, status: 1 i slug, ili u Admin-u.

Obrađuje se svaki proizvod iz poziva. Kad jedan ne prođe, odgovor je ta greška, ali proizvodi pre i posle njega se upisuju. Ispravite proizvod koji nije prošao i pošaljite poziv ponovo: proizvodi se uparuju po šifri, pa ponovljen poziv menja, a ne duplira. Izuzetak su slike, pogledajte niže.

Parametri tela zahteva

ParametarOpis
productsobaveznoniz objekataJedan unos po proizvodu.
products[].codestringVaša šifra proizvoda. Uparuje proizvod, ili postaje šifra novog.
products[].id, products[].external_refDrugi načini da se nađe postojeći proizvod. Pogledajte uparivanje.
products[].barcodestringBarkod proizvoda. Uvek ga pošaljite za proizvod koji ga ima: izmena bez barcode ga briše.
products[].<detail>anySvaki drugi ključ je detalj, na primer "name": "Hrana za pse" ili "brand": "Acme", upisan na jeziku tokena. Koristite nazive svojih tipova podataka malim slovima. Naziv koji vaša aplikacija još nema pravi novi tip podatka koji nije označen kao važeći, a GET /product/{id} ga izostavlja dok ga u Admin-u ne označite kao važeći.
products[].variantsniz objekataVarijante, uparene po code, barcode ili external_ref. Ako ih izostavite, proizvod bez varijanti dobija jednu, sa šifrom i barkodom proizvoda. Prihvata se i kao product_variants.
variants[].code, variants[].barcode, variants[].external_refstringIdentifikatori varijante, svaki jedinstven u vašoj aplikaciji.
variants[].statusinteger · podrazumevano 11 aktivna. Druge vrednosti skrivaju varijantu iz lista.
variants[].<detail>Detalji varijante, direktno na varijanti kao kod proizvoda, na primer "size": "2 kg".
variants[].prices, variants[].imagesSopstvene cene i slike varijante, kao niže.
products[].pricesniz objekataCene na nivou proizvoda, za varijante bez sopstvenih. Prihvata se i kao catalogs.
prices[].catalog_idobaveznointegerJedan od vaših kataloga.
prices[].pricenumberCena sa PDV-om. Šaljite brojeve, ili stringove sa tačkom kao decimalnim separatorom.
prices[].member_price, default_price, volume_pricenumber · podrazumevano priceZa novi red cene podrazumevano su jednake price.
prices[].unit_pricenumberCena po osnovnoj jedinici, na primer po kilogramu.
prices[].subscription_interval, subscription_qtyintegerZa kataloge pretplata. Jedan red po katalogu, proizvodu, varijanti i intervalu.
imagesniz objekataNa proizvodu ili varijanti: image_url (obavezno), tag, ordinal, alt_text. URL čuvamo onako kako ga pošaljete. Svaka slika se dodaje kao nova, pa slike pošaljite jednom, a ne uz svaku sinhronizaciju.
products[].product_attributesniz objekataDefinicije atributa za povezivanje, sa poljima iz attributes[] u PUT /int/product_attributes.

Vraća

data: proizvode onako kako su upisani, svaki sa svojim poljima, product_attributes, variants (sa njihovim images i catalogs) i catalogs, redovima cena na nivou proizvoda. Cene su u ovom odgovoru stringovi, na primer "12.50". Detalji i slike proizvoda se ne vraćaju.

Liste preuzimaju svaki proizvod ubrzo pošto se njegova transakcija završi.

Greške

StatusKada
401Token nedostaje ili je opozvan. Pogledajte Autentifikaciju.
422Prvi proizvod koji nije prošao, na primer zauzeta šifra (API.Products.CodeAlreadyExists, BarcodeAlreadyExists), šifra varijante koju koristi drugi proizvod (Product Variant not found), katalog koji nije vaš (Please provide catalog ids that exist) ili detalj koji ne prolazi pravilo svog tipa podatka (API.ProductData.ValueNotValid).
POST/int/products
curl -X POST "https://api.morffeus.com/api/v2/int/products" \
  -H "Authorization: Bearer $MORFFEUS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "products": [
      {
        "code": "P-1001",
        "barcode": "8600123456000",
        "name": "Dog food",
        "brand": "Acme",
        "prices": [{ "catalog_id": 4, "price": 1290 }],
        "variants": [
          { "code": "SKU-1001", "barcode": "8600123456789",
            "size": "2 kg" },
          {
            "code": "SKU-1002", "barcode": "8600123456796",
            "size": "10 kg",
            "prices": [{ "catalog_id": 4, "price": 5490 }]
          }
        ]
      }
    ]
  }'
const res = await fetch('https://api.morffeus.com/api/v2/int/products', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.MORFFEUS_TOKEN}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    products: [{
      code: 'P-1001',
      barcode: '8600123456000',
      name: 'Dog food',
      brand: 'Acme',
      prices: [{ catalog_id: 4, price: 1290 }],
      variants: [
        { code: 'SKU-1001', barcode: '8600123456789', size: '2 kg' },
        { code: 'SKU-1002', barcode: '8600123456796', size: '10 kg',
          prices: [{ catalog_id: 4, price: 5490 }] },
      ],
    }],
  }),
});
if (!res.ok) throw new Error(JSON.stringify(await res.json()));
Odgovor200 OK
{
  "data": [
    {
      "id": 48377,
      "code": "P-1001",
      "barcode": "8600123456000",
      "status": 0,
      "slug": null,
      "product_attributes": [],
      "catalogs": [
        {
          "catalog_id": 4,
          "product_id": 48377,
          "product_variant_id": null,
          "price": "1290",
          …
        }
      ],
      "variants": [
        {
          "id": 91120,
          "code": "SKU-1001",
          "barcode": "8600123456789",
          "status": 1,
          "images": [],
          …
        },
        { "id": 91121, "code": "SKU-1002", … }
      ],
      …
    }
  ]
}
Greška422 Unprocessable Entity
{
  "errors": {
    "message": ["Please provide catalog ids that exist"]
  }
}

Lista proizvoda#

GET /api/v2/products

Vaši aktivni proizvodi onako kako ih prodavnica vidi, iz indeksa za pretragu koji prati vaše upise za nekoliko trenutaka i obnavlja se svake noći. Cene su za tržište i valutu vašeg tokena, a detalji na jeziku tokena.

Podrazumevano se prikazuju samo proizvodi na stanju. Pošaljite onlyOnStock=false da biste prikazali i ostale. Podešavanje aplikacije može da promeni ovo podrazumevano ponašanje.

Parametri upita

ParametarOpis
limitinteger · podrazumevano 10Proizvoda po stranici. Prihvata se i kao perPage.
offsetintegerKoliko proizvoda da se preskoči. Ili pošaljite pageNo, od 1.
id, code, barcode, slugNalaženje po identifikatoru. code se poredi sa šifrom proizvoda ili bilo koje varijante; barcode sa barkodovima varijanti; id prima listu odvojenu zarezima. Jedan od njih sam vraća jedan proizvod u data, ili {} kad ništa ne odgovara.
searchstringReči iz naziva proizvoda, najbolji pogoci prvi.
searchAllstringKao search, i još šifre i barkodovi proizvoda i varijanti. Tačna šifra ide prva.
priceFrom, priceTonumberRaspon cena, poredi se sa price_from i price_to.
attributeDefIdslista celih brojevaProizvodi povezani sa bilo kojom od ovih definicija atributa.
baseAttributeDefIdslista celih brojevaProizvodi povezani sa svima njima.
attributeDefSlugstringProizvodi ispod definicije sa ovim slugom, ili putanje slugova.
productTags, tagslista stringovaProizvodi sa bilo kojom od ovih oznaka, ili sa cenom u katalozima sa bilo kojom od ovih oznaka.
onlyOnStockbooleanPogledajte napomenu iznad.
orderBystring · podrazumevano nazivname, price, inserted_at ili sales_quantity, svaki po želji sa desc malim slovima iza. Više njih odvojite zarezom bez razmaka. Pogledajte Paginaciju i filtriranje.
productListOnlyoznakaVraća data kao običnu listu proizvoda. Uključuje ga bilo koja vrednost.

Vraća

Podrazumevano data.products, listu proizvoda, uz data.product_attributes, stablo atributa prikazanih proizvoda, i data.product_data_values, vrednosti detalja po kojima može da se filtrira. Ukupnog broja nema. GET /products/{id} je ista lista za jedan proizvod, i vraća {} sa 200 kad proizvod nije na listi.

GET/products
curl "https://api.morffeus.com/api/v2/products?code=SKU-1001" \
  -H "Authorization: Bearer $MORFFEUS_TOKEN"
Odgovor200 OK
{
  "data": {
    "id": 48377,
    "code": "P-1001",
    "slug": "dog-food",
    "status": 1,
    "name": "Dog food",
    "brand": "Acme",
    "product_type": "real",
    "price_from": 1290.0,
    "price_to": 5490.0,
    "prices": [{
      "price": 1290.0,
      "display_price": "1.290,00",
      "currency_sign": "RSD",
      …
    }],
    "variants": [
      {
        "id": 91120,
        "code": "SKU-1001",
        "barcode": "8600123456789",
        "size": "2 kg",
        "on_stock": true,
        "store_availability": [{
          "app_location_id": 31,
          "code": "NS-1",
          "quantity": 40.0,
          …
        }],
        "prices": [{
          "catalog_id": 4,
          "price": 1290.0,
          "member_price": 1290.0,
          "currency_id": 1,
          …
        }]
      },
      { "id": 91121, "code": "SKU-1002", … }
    ],
    …
  }
}

Ceo proizvod#

GET /api/v2/product/{id}

Ceo zapis proizvoda iz baze, kakav god da mu je status: i nacrti. Koristite ga da proverite šta je sinhronizacija upisala.

Parametri upita

ParametarOpis
definitionbooleantrue dodaje definition: vaše tipove podataka, sa njihovom vrstom, pravilima i dozvoljenim vrednostima.
catalogTypestringKoje cene da se uključe: current, future, current_future ili past. Podrazumevano: sve.

Vraća

data: polja proizvoda, njegove detalje pod nazivima tipova podataka (formatirani tekst kao {"value", "json"}), images, vat, product_attributes_names (povezane definicije kao stablo), prices (redove na nivou proizvoda za vaše tržište i valutu, sa nazivom i važenjem kataloga) i variants, svaku sa detaljima, images i prices. Proizvod koji nije u vašoj aplikaciji vraća 404 sa praznim telom.

GET/product/{id}
curl "https://api.morffeus.com/api/v2/product/48377" \
  -H "Authorization: Bearer $MORFFEUS_TOKEN"
Odgovor200 OK
{
  "data": {
    "id": 48377,
    "code": "P-1001",
    "status": 0,
    "name": "Dog food",
    "description": {
      "value": "Complete food for adult dogs.",
      "json": […]
    },
    "vat_id": 2,
    "vat": { "vat_id": 2, "market_id": 1, "vat_name": "20%" },
    "images": [],
    "prices": [{
      "catalog_id": 4,
      "catalog_name": "Retail",
      "price": 1290.0,
      "valid": true,
      …
    }],
    "variants": [{
      "id": 91120,
      "code": "SKU-1001",
      "size": "2 kg",
      "prices": […],
      …
    }],
    …
  }
}

Pravljenje ili izmena jednog proizvoda#

POST /api/v2/products

Upisuje jedan proizvod sa svim poljima, uključujući status, slug i external_ref. Bez id pravi proizvod; sa id jednog od vaših proizvoda menja taj proizvod. Proizvode ne traži po šifri.

Parametri tela zahteva

ParametarOpis
productobaveznoobjectProizvod.
product.idintegerNaš id, za izmenu. Id koji nije vaš obara poziv sa API.Products.NotFound.
product.code, barcode, external_refstringIdentifikatori, svaki jedinstven u vašoj aplikaciji.
product.slugstringNaziv u URL-u. Liste ga zahtevaju.
product.statusinteger · podrazumevano 01 aktivira proizvod, pa ga liste prikazuju čim ima slug.
product.product_type_id, measuring_unit_idintegerIz lista šifarnika.
product.track_stock, available_onlinebooleanPodrazumevano false i true.
product.tags, image_urlOznake i glavna slika.
product.detailsobjectVaši detalji, po nazivu tipa podatka: {"name": "Hrana za pse"}. Ovde su ugnežđeni, za razliku od POST /int/products.
product.details_fill_onlyniz stringovaNazivi detalja koji se upisuju samo kad proizvod još nema vrednost, pa izmene iz Admin-a ostaju.
product.data_managed_keysniz stringovaNazivi detalja koje vodi vaš sistem: oni koje navedete a izostavite iz details brišu se, na svim jezicima.
product.vat_idintegerJedna od vaših stopa PDV-a iz GET /vats, za tržište vašeg tokena. Bez nje novi proizvod dobija podrazumevanu stopu tržišta.
product.variantsniz objekataVarijanta sa id jedne od varijanti ovog proizvoda je menja; varijanta bez id se pravi. Ovde se ne uparuju po šifri.
product.prices, product.imagesKao u POST /int/products.
product.return_databooleantrue vraća ceo proizvod, kao GET /product/{id} sa definicijom.

Vraća

data.id, id proizvoda, ili ceo proizvod sa return_data. Greške su iste kao u POST /int/products, uz 400 kad telo zahteva nema product. Za povezivanje atributa koristite PUT /int/product_attributes.

POST/products
curl -X POST "https://api.morffeus.com/api/v2/products" \
  -H "Authorization: Bearer $MORFFEUS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "product": {
      "id": 48377,
      "status": 1,
      "slug": "dog-food",
      "external_ref": "ERP-5510",
      "details": { "description": "Complete food for adult dogs." },
      "details_fill_only": ["description"]
    }
  }'
Odgovor200 OK
{
  "data": { "id": 48377 }
}
Greška422 Unprocessable Entity
{
  "errors": {
    "Products": ["API.Products.CodeAlreadyExists"]
  }
}

Provera koji proizvodi postoje#

POST /api/v2/product/verify

Za svaku šifru ili barkod koji pošaljete kaže vam kom proizvodu i varijanti odgovara, bez ikakvog upisa. Pokrenite ga pre prve sinhronizacije da vidite šta će biti napravljeno.

Parametri tela zahteva

ParametarOpis
productsobaveznoniz objekataRedovi sa code, barcode ili oba, plus sve ostalo što želite da vam se vrati.

Vraća

data: vaše redove, istim redom. Prvo tražimo varijantu, po šifri ili barkodu, bez obzira na velika i mala slova i razmake oko vrednosti. Pogodak dodaje product_variant_id, product_id, product_name, product_variant_code i product_variant_barcode. Inače pogodak proizvoda dodaje product_id, product_name, product_code i product_barcode. Red bez ovih polja nije uparen. Nazivi su na podrazumevanom jeziku vaše aplikacije.

POST/product/verify
curl -X POST "https://api.morffeus.com/api/v2/product/verify" \
  -H "Authorization: Bearer $MORFFEUS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "products": [{ "code": "SKU-1001" }, { "code": "SKU-9999" }] }'
Odgovor200 OK
{
  "data": [
    {
      "code": "SKU-1001",
      "product_variant_id": 91120,
      "product_id": 48377,
      "product_name": "Dog food",
      "product_variant_code": "SKU-1001",
      "product_variant_barcode": "8600123456789"
    },
    { "code": "SKU-9999" }
  ]
}

Čitanje varijanti#

GET /api/v2/product_variants

Sve varijante vaše aplikacije, kakav god im je status, onako kako su sačuvane: id, product_id, code, barcode, external_ref, slug, status, ordinal, image_url, tags, available_online, weight, base_unit_volume, product_type_id, inserted_at, updated_at. Lista nije podeljena na stranice, pa očekujte veliki odgovor; da biste za nekoliko proizvoda uparili šifre sa id-jevima, lakši je POST /product/verify.

GET /product_variants/{id} vraća jednu varijantu, ili 404 sa Product Variant not found. Status varijante je 1 aktivna; varijanta obrisana dok su je porudžbine ili zalihe još koristile ima status 2.

Odgovor200 OK
{
  "data": {
    "id": 91120,
    "product_id": 48377,
    "code": "SKU-1001",
    "barcode": "8600123456789",
    "external_ref": "ERP-778",
    "status": 1,
    "ordinal": 0,
    …
  }
}

Liste šifarnika#

Id-jevi na koje polja proizvoda upućuju. Pročitajte ih jednom i čuvajte mapu u svom sistemu.

PozivVraća
GET /product_data_typesVaša polja detalja: id, name (ključ koji šaljete), type (string, text, list, boolean, float i drugi), translate, mandatory, valid, regex, variant_specific, filterable, searchable, ordinal i grupu kojoj pripadaju.
GET /vatsVaše stope PDV-a za tržište tokena: id, name, percent, default, external_ref, market_id.
GET /measuring_unitsVaše jedinice mere: id, unit, description, decimal (da li količine smeju da imaju decimale), external_ref.
GET /product_typesVrste proizvoda, iste za svaku aplikaciju: id, name, type, description, na primer real i service.
Poslednja izmena 1. oktobra 2026. · API v2 Nešto nije u redu na ovoj stranici?