A Termék API

A fejlesztői leírás a Termék API forrásokhoz — milyen JSON-t szolgáltat a webshopod, hogy beolvashassuk, és melyik végpontra küldi el a változásokat, ahogy megtörténnek.

Áttekintés

Egy Termék API forrás két irányban működik, és bármelyiket vagy mindkettőt használhatod:

  • Lekérés — küldünk egy GET kérést egy általad birtokolt címre, a forrásnál beállított ütemezés szerint, te pedig visszaadod a teljes katalógusodat.
  • Küldés — te POST-olod nekünk a megváltozott termékeket abban a pillanatban, amikor megváltoznak.

Az irányítópult API füle ugyanezt a leírást tartalmazza, a márkád valódi címeivel kitöltve, úgyhogy a bekötést érdemes ott kezdeni.

Minden, ami itt következik, kizárólag a Termék API forrásokra vonatkozik. A CSV folyam egy sima Google Shopping fájl — nincs küldési végpontja, titka és egyedi mezője.

Lekérés — mi olvassuk be a címedet

A kérés, amit küldünk

Egyetlen GET. Nincs lapozás: add vissza az egészet egy válaszban.

FejlécÉrték
Acceptapplication/json
User-AgentYapletBot/1.0 (+https://yaplet.com)
SignatureA megosztott titkod SHA-256 lenyomata, kisbetűs hexadecimálisan

Plusz minden további fejléc, amit a forráson beállítottál.

A Signature a megosztott titok egyszerű lenyomata — nem HMAC a törzs fölött, és nem változik kérésről kérésre. Úgy ellenőrizd, hogy lenyomatolod a saját példányodat a titokból, és összeveted. Kezeld TLS-sel védett hozzáférési kulcsként, ne kérésaláírásként: nem képes visszajátszást vagy manipulációt észlelni.

A címednek https-t kell használnia, az első kérésnél és minden átirányításnál. A privát és belső címeket elutasítjuk.

Amit visszaadsz

{
  "products": [
    {
      "id": "SKU-1001",
      "title": "C-vitamin 1000 mg, 60 tabletta",
      "link": "https://shop.example.com/products/vitamin-c-1000",
      "description": "Nagy dózisú C-vitamin könnyen lenyelhető tablettában.",
      "image": "https://shop.example.com/images/vitamin-c-1000.jpg",
      "price": "4990 HUF",
      "sale_price": "3990 HUF",
      "availability": "in stock",
      "brand": "Acme Health",
      "category": "Étrend-kiegészítők > Vitaminok",
      "attributes": {
        "Összetevők": ["aszkorbinsav", "csipkebogyó kivonat"],
        "Kiszerelés": "tabletta",
        "Darabszám": 60
      },
      "rule_keys": ["aszkorbinsav"],
      "rules": ["A C-vitamin hozzájárul az immunrendszer normál működéséhez."]
    }
  ]
}
A lekérés mindig teljes pillanatkép. Ennek a forrásnak minden olyan terméke, ami hiányzik a válaszodból, törlődik. Ha csak a változásokat akarod küldeni, használd a küldést.

Időzítés és hibák

Beolvasásonként három próbálkozás (egyenként 30 másodperc, 5, majd 15 másodperc várakozással), de csak időtúllépésre, hálózati hibára és 5xx válaszra. Egy 4xx azonnal hibára fut. A válasz törzse legfeljebb 50 MB lehet, és legfeljebb 20 000 terméket tartalmazhat.

A nulla termékkel visszatérő válasz hibának számít, így egy elromlott végpont soha nem ürítheti ki észrevétlenül a katalógust.

A termékobjektum

Kötelező

id
string vagy number required
Az állandó azonosítód. 1–200 karakter. A számokat elfogadjuk és szövegként tároljuk — tehát az 1001 és az "1001" ugyanaz a termék.
title
string required
1–500 karakter.
link
string required
A termékoldal. http vagy https URL kell legyen, legfeljebb 2048 karakter.

Nem kötelező

description
string
Legfeljebb 20 000 karaktert tárolunk; az első 6000 kereshető.
image
string
http vagy https URL.
price
string vagy number
Szabad szöveg, legfeljebb 100 karakter — a "4990 HUF" is jó.
sale_price
string vagy number
Ugyanaz, mint a price.
availability
string
Legfeljebb 100 karakter.
brand
string
Legfeljebb 200 karakter.
category
string
Legfeljebb 500 karakter.
attributes
object
A saját mezőid. Lásd lentebb.
rule_keys
string[]
A termék által hordozott kulcsok. Legfeljebb 500, egyenként legfeljebb 200 karakter.
rules
string[]
Mondatok, amiket az AI-nak követnie kell erről a termékről. Legfeljebb 100, egyenként legfeljebb 5000 karakter.
Nincsenek alternatív mezőnevek. Az sku, az url, az image_link, a salePrice és a product_url mind figyelmen kívül marad — pontosan a fenti neveket használd. Az ismeretlen kulcsokat csendben eldobjuk.

attributes — a saját mezőid

Egy objektum, aminek az értékei szöveg, szám, logikai érték, vagy ezek tömbje lehetnek. Mindegyikből egy Kulcs: érték sor lesz a termék kereshető szövegében.

A szöveges értékeket vessző és pontosvessző mentén szétvágjuk. A "Darabszám": "12,5 kg" két értékké válik: 12 és 5 kg. Használj tömböt mindenhez, ami jogosan tartalmaz vesszőt vagy pontosvesszőt.

Egy beágyazott objektum vagy egy objektumokból álló tömb az egész terméket érvénytelenné teszi — nem csak azt az egy mezőt.

A mezőblokk termékenként 4000 karakterben van maximálva, és sorhatáron vágjuk el, egész mezőket dobva el abban a sorrendben, ahogy küldted őket. A fontosakat tedd előre.

rule_keys és rules

Mindkettőt tároljuk, de soha nem tesszük kereshetővé. Kizárólag a termékszabályok miatt léteznek.

  • A rule_keys dönti el, mely szabályok vonatkoznak erre a termékre.
  • A rules mondatait az AI szó szerint, minden alkalommal megkapja, amikor ez a termék megjelenik egy válaszban.
Mivel nem kereshetők, ha az összetevőlistát csak a rule_keys mezőben küldöd el, az AI soha nem fogja megtalálni a terméket az adott összetevő alapján. Tedd bele az attributes mezőbe is, ha a vásárlók rákeresnek.

Ami nem kereshető

A price, a sale_price és az availability szándékosan soha nem része annak, amit az AI megtanult — folyamatosan változnak, és a válasz készítésekor olvassuk ki őket élőben. Az AI nem tud rájuk keresni.

Érvénytelen elemek

Az érvénytelen elemeket kihagyjuk, soha nem végzetesek — a futás folytatódik, és a jelentés felsorolja az első 50-et az indokkal. Ha ugyanaz az id kétszer szerepel egy küldeményben, az utolsó nyer.

Küldés — te küldöd nekünk a változásokat

A végpont

POST https://yaplet.com/api/products/push/{sourceId}

A {sourceId} a forrás azonosítója — másold ki a Küldési cím másolása gombbal a Források fülön.

Hitelesítés

Küldd el a szervezeti API kulcsodat a Y-API-Key fejlécben. Ez a Beállítások → API oldalról származó kulcs, nem a forrás megosztott titka.

Egy szervezeti kulcs a szervezet összes Termék API forrásához küldési hozzáférést ad; a célt az URL-ben szereplő forrásazonosító választja ki. A kulcs cseréje egy csapásra minden webshop-integrációt eltör a szervezetben.

A törzs

MezőAlapértelmezésJelentés
mode"merge"A "merge" csak azt frissíti, amit elküldesz. A "replace" teljes pillanatképpé teszi ezt a küldést.
products[]Termékobjektumok, pontosan a fentiek szerint.
deleted_ids[]Eltávolítandó termékek. replace módban figyelmen kívül marad.
const res = await fetch("https://yaplet.com/api/products/push/YOUR_SOURCE_ID", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Y-API-Key": "YOUR_API_KEY",
  },
  body: JSON.stringify({
    mode: "merge",
    products: [
      {
        id: "SKU-1001",
        title: "Vitamin C 1000 mg, 60 tablets",
        link: "https://shop.example.com/products/vitamin-c-1000",
        price: "12.90 EUR",
        availability: "in stock",
        attributes: { Ingredients: ["ascorbic acid"] },
        rule_keys: ["ascorbic acid"],
      },
    ],
    deleted_ids: ["SKU-0999"],
  }),
});

const result = await res.json();
console.log(result.run_id, result.accepted);

Amit visszakapsz

A sikeres küldés 202 Accepted választ ad:

{
  "run_id": "3f9d2c6e-1b7a-4c1e-9f0a-2d8e5b6c7a90",
  "status": "running",
  "received": 1,
  "accepted": 1,
  "invalid": 0,
  "report_url": "/api/products/push/YOUR_SOURCE_ID/runs/3f9d2c6e-1b7a-4c1e-9f0a-2d8e5b6c7a90"
}
A 202 nem azt jelenti, hogy a termékek megérkeztek. Az elemeidet ellenőriztük, de maga a betöltés a háttérben fut — a korlátok, a tárolás és az indexelés utána is hibára futhat. Kérdezd le a futást, ha biztos akarsz lenni.

Egy futás lekérdezése

GET https://yaplet.com/api/products/push/{sourceId}/runs/{runId}

Ugyanaz a Y-API-Key fejléc. Kérdezd le addig, amíg a status már nem "running", aztán olvasd ki a számlálókat, és ha a status "failed", az error és az error_code mezőket.

Forrásonként csak a legutóbbi futás marad meg. A következő küldésed — vagy egy közben lefutó ütemezett beolvasás — felülírja, és a régi run_id ezután 404-et ad. Olvasd el a jelentést, mielőtt elküldöd a következő adagot. Egy sikertelen futás is 200-zal válaszol; a status mezőt nézd, ne a HTTP kódot.

Küldési szabályok

  • A merge csak az általad küldött azonosítókhoz nyúl. Minden más érintetlen marad.
  • A deleted_ids eltávolítja az ehhez a forráshoz tartozó termékeket. Egy nem hozzád tartozó vagy nem létező azonosítót csendben figyelmen kívül hagyunk. Ha egy azonosító a products és a deleted_ids listában is szerepel, a termék nyer.
  • A mode: "replace" törli a forrás minden olyan termékét, ami nincs benne a küldeményben.
A {"mode": "replace", "products": []}törli a forrás összes termékét. A lekéréssel ellentétben a replace módban nincs üres-küldemény védelem.

Azok a termékek, amiknek a tartalma nem változott, semmibe nem kerülnek — nem indexeljük őket újra. Ha csak az árat, az akciós árat vagy az elérhetőséget módosítod, a sor frissül, de semmit nem indexelünk újra.

Egy sikeres küldés visszahozza azokat a termékeket is, amiket a forrás hibázása miatt rejtettünk el. Azt viszont nem indítja újra, ha az ütemezés három sikertelen beolvasás után leállt — arra csak a Beolvasás most való.

Hibák

KódMikor
400Hibás JSON, rossz mode, több mint 20 000 elem, vagy üres merge
401Hiányzó vagy érvénytelen Y-API-Key
403A szervezetednek nincs Tartalomforrások jogosultsága
404Ismeretlen forrás, másik szervezet forrása, vagy CSV forrás
409Ehhez a forráshoz épp fut egy másik beolvasás vagy küldés — várj és próbáld újra
411Nincs Content-Length — a darabolt feltöltést nem fogadjuk el
413A törzs nagyobb, mint 25 MB
429Túl sok kérés. A Retry-After megmondja, mennyit kell várni

Sebességkorlátok

Percenként 12 küldés forrásonként, és percenként 60 szervezetenként. Minden válasz tartalmazza az X-RateLimit-Limit, az X-RateLimit-Remaining és az X-RateLimit-Reset fejlécet.

Amin sokan elcsúsznak