{"info":{"name":"Dynex Public API v3","description":"A DynexV3 teljes publikus API-ja. Használat: állítsd be a `token` változót a vezérlőpulton létrehozott `dxp_` tokenre (Beállítások → API integrációk), majd futtasd a mappákat. A létrehozó kérések elmentik az azonosítót, így a lekérdező és módosító kérések azonnal futtathatók. Generált fájl: ne szerkeszd kézzel, a forrás a lib/public-api/contract registry. A kivezetés alatt álló v1 végpontok NEM a `baseUrl`, hanem a `baseUrlV1` változót használják, mert más útvonal-előtag alatt élnek; a válaszuk `{ success: true, ... }` borítékban érkezik.","schema":"https://schema.getpostman.com/json/collection/v2.1.0/collection.json"},"auth":{"type":"bearer","bearer":[{"key":"token","value":"{{token}}","type":"string"}]},"variable":[{"key":"baseUrl","value":"https://prod.dynex.hu/api/v3","type":"string"},{"key":"baseUrlV1","value":"https://prod.dynex.hu/api/v1","type":"string"},{"key":"token","value":"","type":"string"},{"key":"contactId","value":"","type":"string"},{"key":"dealId","value":"","type":"string"},{"key":"reservationId","value":"","type":"string"},{"key":"webhookId","value":"","type":"string"},{"key":"noteId","value":"","type":"string"},{"key":"blogPostId","value":"","type":"string"},{"key":"orderId","value":"","type":"string"},{"key":"menuItemId","value":"","type":"string"}],"item":[{"name":"me","description":"A(z) me domain végpontjai.","item":[{"name":"me.get - Token adatainak lekérdezése","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/me","host":["{{baseUrl}}"],"path":["me"]},"description":"Az integráció első hívása szokott lenni: megmondja, kihez tartozik a kulcs, mit szabad vele, mikor jár le, és hozzávetőleg mennyi maradt a percalapú keretből (a `rateLimit.remaining` tájékoztató érték, lásd a mező leírását). Scope nem kell hozzá, tehát bármely érvényes kulcs hívhatja - ezért alkalmas a kulcs beállításának ellenőrzésére is. Ha ez `401`-et ad, a kulcs hibás, lejárt vagy visszavont; ha `403`-at, maga a kulcs rendben van, de a fiók vagy a hívó IP-címe zárja ki a hívást; ha `200`-at, de a `scopes` üres, a kulcs nem kapott jogosultságot.\n\nBármely érvényes token hívhatja."},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"tokenId\": \"1f0b1a44-8f7e-4a1c-9f2b-5c1d3e7a9b02\",\n  \"label\": \"POS integráció\",\n  \"tenantId\": \"tenant_demo\",\n  \"scopes\": [\n    \"reservations.readonly\",\n    \"contacts.write\"\n  ],\n  \"expiresAt\": null,\n  \"rateLimit\": {\n    \"perMinute\": 120,\n    \"remaining\": 119\n  }\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]}]},{"name":"reservations","description":"A(z) reservations domain végpontjai.","item":[{"name":"reservations.cancel - Foglalás lemondása (vendéglátó oldalról)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/reservations/{{reservationId}}/cancel","host":["{{baseUrl}}"],"path":["reservations","{{reservationId}}","cancel"]},"body":{"mode":"raw","raw":"{\n  \"reason\": \"A vendég másik helyet választott.\"\n}","options":{"raw":{"language":"json"}}},"description":"A foglalást `cancelled` állapotba teszi a hely nevében, lefuttatja az elutasítás-automatizmust (értesítés a vendégnek, kapacitás felszabadítása), és kiküldi a `reservation.cancelled` webhookot. A törzs elhagyható: törzs nélkül is hívható, a `reason` mezővel viszont saját lemondási ok adható meg. Már lemondott foglalásra a válasz `200`, de a hívás ilyenkor nem csinál semmit: nem fut le újra az automatizmus, és webhook sem megy ki.\n\nSzükséges scope: `reservations.manage`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"reservation\": {\n    \"id\": \"res_1\",\n    \"date\": \"2026-08-10\",\n    \"startTime\": \"18:30\",\n    \"endTime\": \"20:30\",\n    \"partySize\": 4,\n    \"status\": \"cancelled\",\n    \"source\": \"api\",\n    \"type\": \"reservation\",\n    \"title\": null,\n    \"customerName\": \"Kiss Anna\",\n    \"customerPhone\": \"+36301234567\",\n    \"customerEmail\": \"anna@example.com\",\n    \"contactId\": \"cnt_1\",\n    \"notes\": \"Ablak melletti asztalt kérünk.\",\n    \"specialRequests\": null,\n    \"customFieldValues\": null,\n    \"deposit\": null,\n    \"confirmedAt\": \"2026-08-01T10:05:00.000Z\",\n    \"cancelledAt\": \"2026-08-05T09:12:00.000Z\",\n    \"cancelReason\": \"Étterem lemondta\",\n    \"createdAt\": \"2026-08-01T10:00:00.000Z\",\n    \"updatedAt\": \"2026-08-05T09:12:00.000Z\"\n  },\n  \"cancelled\": true\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"reservations.create - Foglalás létrehozása","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"{{$guid}}"}],"url":{"raw":"{{baseUrl}}/reservations","host":["{{baseUrl}}"],"path":["reservations"]},"body":{"mode":"raw","raw":"{\n  \"date\": \"2026-09-15\",\n  \"startTime\": \"19:30\",\n  \"partySize\": 4,\n  \"customerName\": \"Kiss Anna\",\n  \"customerPhone\": \"+36301234567\"\n}","options":{"raw":{"language":"json"}}},"description":"Új foglalást vesz fel a vendég nevében, és a hely saját szabályai szerint azonnal vissza is igazolhatja. A kérés végigmegy ugyanazon a kapacitás- és nyitvatartás-ellenőrzésen, mint a saját foglalási felületünk: ha nincs szabad hely az adott időpontban, `422` a válasz, nem `400`. A hívás idempotens: `Idempotency-Key` fejléccel a hálózati újrapróbálkozás nem hoz létre második foglalást; ezen felül fejléc nélkül is fut egy rövid duplikátum-védelem, lásd a figyelmeztetéseket. FIGYELEM: a végpont nem csak egy foglalás-sort ír. A megadott e-mail cím vagy telefonszám alapján CRM-kontaktot is keres, és találat hiányában ÚJAT hoz létre; meglévő kontaktnál a nevet, az egyedi mezőket és a jegyzetet kiegészíti, a marketing hozzájárulást pedig felminősítheti. A kontakton nő a foglalásszámláló, aktivitás-bejegyzés készül, és a fiókban beállított küszöb felett a kontakt automatikusan VIP címkét és státuszt kap. A vendég adatkezelési hozzájárulásának beszerzéséért és bizonyításáért az integrátor felel - lásd a figyelmeztetéseket.\n\nSzükséges scope: `reservations.write`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 201\", function () {","    pm.response.to.have.status(201);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});","","if (pm.response.code < 300) {","    const data = pm.response.json();","    const value = data && data.reservation && data && data.reservation.id;","    if (value) pm.collectionVariables.set(\"reservationId\", value);","}"]}}],"response":[{"name":"Példa 201","status":"OK","code":201,"body":"{\n  \"reservation\": {\n    \"id\": \"res_1\",\n    \"date\": \"2026-08-10\",\n    \"startTime\": \"18:30\",\n    \"endTime\": \"20:30\",\n    \"partySize\": 4,\n    \"status\": \"confirmed\",\n    \"source\": \"api\",\n    \"type\": \"reservation\",\n    \"title\": null,\n    \"customerName\": \"Kiss Anna\",\n    \"customerPhone\": \"+36301234567\",\n    \"customerEmail\": \"anna@example.com\",\n    \"contactId\": \"cnt_1\",\n    \"notes\": \"Ablak melletti asztalt kérünk.\",\n    \"specialRequests\": null,\n    \"customFieldValues\": null,\n    \"deposit\": null,\n    \"confirmedAt\": \"2026-08-01T10:05:00.000Z\",\n    \"cancelledAt\": null,\n    \"cancelReason\": null,\n    \"createdAt\": \"2026-08-01T10:00:00.000Z\",\n    \"updatedAt\": \"2026-08-01T10:05:00.000Z\"\n  },\n  \"reference\": \"AB12CD\",\n  \"status\": \"confirmed\",\n  \"manageUrl\": \"https://prod.dynex.hu/foglalas/AB12CD\"\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"reservations.get - Egy foglalás lekérdezése","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/reservations/{{reservationId}}","host":["{{baseUrl}}"],"path":["reservations","{{reservationId}}"]},"description":"Egyetlen foglalás aktuális állapota azonosító alapján. A hívás mindig a friss adatot adja vissza, tehát alkalmas a webhook-értesítés utáni megerősítésre is. Más fiókhoz tartozó azonosítóra `404` a válasz, nem `403` - az API nem árulja el, hogy az azonosító létezik-e máshol.\n\nSzükséges scope: `reservations.readonly`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"reservation\": {\n    \"id\": \"res_1\",\n    \"date\": \"2026-08-10\",\n    \"startTime\": \"18:30\",\n    \"endTime\": \"20:30\",\n    \"partySize\": 4,\n    \"status\": \"confirmed\",\n    \"source\": \"api\",\n    \"type\": \"reservation\",\n    \"title\": null,\n    \"customerName\": \"Kiss Anna\",\n    \"customerPhone\": \"+36301234567\",\n    \"customerEmail\": \"anna@example.com\",\n    \"contactId\": \"cnt_1\",\n    \"notes\": \"Ablak melletti asztalt kérünk.\",\n    \"specialRequests\": null,\n    \"customFieldValues\": null,\n    \"deposit\": null,\n    \"confirmedAt\": \"2026-08-01T10:05:00.000Z\",\n    \"cancelledAt\": null,\n    \"cancelReason\": null,\n    \"createdAt\": \"2026-08-01T10:00:00.000Z\",\n    \"updatedAt\": \"2026-08-01T10:05:00.000Z\"\n  }\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"reservations.list - Foglalások listázása","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/reservations","host":["{{baseUrl}}"],"path":["reservations"],"query":[{"key":"dateFrom","value":"","description":"Csak az ezen a napon vagy utána kezdődő foglalások. A nap beleszámít.","disabled":true},{"key":"dateTo","value":"","description":"Csak az ezen a napon vagy előtte kezdődő foglalások. A nap beleszámít.","disabled":true},{"key":"status","value":"","description":"Szűrés állapotra. Csak az itt felsorolt hat érték fogadható el; a `pending_payment` és a `walk_in` a válaszban előfordulhat, szűrni viszont nem lehet rájuk.","disabled":true},{"key":"email","value":"","description":"Egyezés a foglaló e-mail címére. Az összehasonlítás kisbetű-érzéketlen, egyébként szó szerinti.","disabled":true},{"key":"phone","value":"","description":"Egyezés a foglaló telefonszámára. Az összehasonlítás előtt MINDEN szóköz kiesik a megadott értékből és a tárolt számból is, tehát a `+36 30 123 4567` alakban rögzült szám `+36301234567`-tel is megtalálható. Más írásjel viszont nem tűnik el: a kötőjel, a zárójel és a `+` szó szerint kell egyezzen, és a `+36...` meg a `06...` kezdet külön értéknek számít.","disabled":true},{"key":"reference","value":"","description":"Foglalásazonosító (a visszaigazolóban szereplő rövid kód). Megadásakor a többi szűrő nem érvényesül. A kód a foglalás azonosítójának rövidítése, nem egyedi kulcs, ezért ritkán két foglaláshoz is ugyanaz tartozhat - ilyenkor a válasz több elemet ad vissza. Ne vedd automatikusan az első találatot: ha a `reservations` tömb egynél több elemet tartalmaz, egyértelműsítsd a foglalást (például e-mail cím, telefonszám vagy dátum alapján).","disabled":true},{"key":"updatedSince","value":"","description":"Csak az ezóta módosult foglalások, `updatedAt` szerint növekvő sorrendben. Szinkronizáláshoz: tedd el a legutolsó kapott `updatedAt` értéket, és azt add vissza a következő körben.","disabled":true},{"key":"limit","value":"","description":"Találatok maximális száma (1-200, alapértelmezés 50; a tartományon kívüli érték a határra szorítódik, nem hibát ad)","disabled":true},{"key":"offset","value":"","description":"Hány találatot ugorjon át (a tartományon kívüli érték a határra szorítódik, nem hibát ad)","disabled":true}]},"description":"A szűrők ÉS kapcsolattal érvényesülnek. A `reference` megadása foglalásazonosító szerinti keresésre vált. Az `updatedSince` szinkron-lekérdezéshez való: `updatedAt` szerint növekvő sorrendet ad.\n\nSzükséges scope: `reservations.readonly`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"reservations\": [\n    {\n      \"id\": \"res_1\",\n      \"date\": \"2026-08-10\",\n      \"startTime\": \"18:30\",\n      \"endTime\": \"20:30\",\n      \"partySize\": 4,\n      \"status\": \"confirmed\",\n      \"source\": \"api\",\n      \"type\": \"reservation\",\n      \"title\": null,\n      \"customerName\": \"Kiss Anna\",\n      \"customerPhone\": \"+36301234567\",\n      \"customerEmail\": \"anna@example.com\",\n      \"contactId\": \"cnt_1\",\n      \"notes\": \"Ablak melletti asztalt kérünk.\",\n      \"specialRequests\": null,\n      \"customFieldValues\": null,\n      \"deposit\": null,\n      \"confirmedAt\": \"2026-08-01T10:05:00.000Z\",\n      \"cancelledAt\": null,\n      \"cancelReason\": null,\n      \"createdAt\": \"2026-08-01T10:00:00.000Z\",\n      \"updatedAt\": \"2026-08-01T10:05:00.000Z\"\n    }\n  ],\n  \"limit\": 50,\n  \"offset\": 0\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"reservations.modify - Foglalás módosítása (dátum, időpont, létszám)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/reservations/{{reservationId}}/modify","host":["{{baseUrl}}"],"path":["reservations","{{reservationId}}","modify"]},"body":{"mode":"raw","raw":"{\n  \"date\": \"2026-09-15\",\n  \"startTime\": \"19:30\",\n  \"partySize\": 4\n}","options":{"raw":{"language":"json"}}},"description":"Részleges törzs - legalább egy mezőt meg kell adni. Csak `pending` és `confirmed` foglalás módosítható. A szabad kapacitás újra ellenőrzésre kerül, majd kimegy a `reservation.updated` webhook. Ha az új időpontra nincs hely, a válasz `422`, és a foglalás VÁLTOZATLAN marad. A LÉTSZÁM módosítása az előleget is újraszámolja, és ezzel a foglalás `status` és `deposit` mezőjét is átírhatja - a részleteket lásd a figyelmeztetéseknél. Ha a törzs SÉMAILAG érvénytelen (rossz típus, ismeretlen enum-érték) ÉS az `{id}` sem létezik, a válasz `400`, nem `404` - a séma-ellenőrzés megelőzi a létezés-vizsgálatot, hogy egy formailag hibás kérés hívója se kapjon jelzést az erőforrás létezéséről. A sémailag ÉRVÉNYES, de üres `{}` törzs viszont átmegy a séma-ellenőrzésen, ezért ott a létezés-vizsgálat fut előbb: nem létező azonosítóra `404` a válasz, és csak létező erőforrásnál kapod meg a `400`-at.\n\nSzükséges scope: `reservations.manage`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"reservation\": {\n    \"id\": \"res_1\",\n    \"date\": \"2026-08-10\",\n    \"startTime\": \"19:00\",\n    \"endTime\": \"20:30\",\n    \"partySize\": 4,\n    \"status\": \"confirmed\",\n    \"source\": \"api\",\n    \"type\": \"reservation\",\n    \"title\": null,\n    \"customerName\": \"Kiss Anna\",\n    \"customerPhone\": \"+36301234567\",\n    \"customerEmail\": \"anna@example.com\",\n    \"contactId\": \"cnt_1\",\n    \"notes\": \"Ablak melletti asztalt kérünk.\",\n    \"specialRequests\": null,\n    \"customFieldValues\": null,\n    \"deposit\": null,\n    \"confirmedAt\": \"2026-08-01T10:05:00.000Z\",\n    \"cancelledAt\": null,\n    \"cancelReason\": null,\n    \"createdAt\": \"2026-08-01T10:00:00.000Z\",\n    \"updatedAt\": \"2026-08-01T10:05:00.000Z\"\n  },\n  \"modified\": true\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"reservations.status - Státuszváltás (visszaigazolás, leültetés, lezárás, meg nem jelenés)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/reservations/{{reservationId}}/status","host":["{{baseUrl}}"],"path":["reservations","{{reservationId}}","status"]},"body":{"mode":"raw","raw":"{\n  \"status\": \"confirmed\"\n}","options":{"raw":{"language":"json"}}},"description":"Lemondáshoz a `/cancel` végpontot használd. Kiküldi a `reservation.updated` webhookot, és - az alábbi korlátokkal - elindítja az állapothoz tartozó automatizmust: `confirmed` esetén a visszaigazoló levelet, `completed` esetén az értékelés-kérőt. Ha a törzs SÉMAILAG érvénytelen (rossz típus, ismeretlen enum-érték) ÉS az `{id}` sem létezik, a válasz `400`, nem `404` - a séma-ellenőrzés megelőzi a létezés-vizsgálatot, hogy egy formailag hibás kérés hívója se kapjon jelzést az erőforrás létezéséről. A sémailag ÉRVÉNYES, de üres `{}` törzs viszont átmegy a séma-ellenőrzésen, ezért ott a létezés-vizsgálat fut előbb: nem létező azonosítóra `404` a válasz, és csak létező erőforrásnál kapod meg a `400`-at.\n\nSzükséges scope: `reservations.manage`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"reservation\": {\n    \"id\": \"res_1\",\n    \"date\": \"2026-08-10\",\n    \"startTime\": \"18:30\",\n    \"endTime\": \"20:30\",\n    \"partySize\": 4,\n    \"status\": \"seated\",\n    \"source\": \"api\",\n    \"type\": \"reservation\",\n    \"title\": null,\n    \"customerName\": \"Kiss Anna\",\n    \"customerPhone\": \"+36301234567\",\n    \"customerEmail\": \"anna@example.com\",\n    \"contactId\": \"cnt_1\",\n    \"notes\": \"Ablak melletti asztalt kérünk.\",\n    \"specialRequests\": null,\n    \"customFieldValues\": null,\n    \"deposit\": null,\n    \"confirmedAt\": \"2026-08-01T10:05:00.000Z\",\n    \"cancelledAt\": null,\n    \"cancelReason\": null,\n    \"createdAt\": \"2026-08-01T10:00:00.000Z\",\n    \"updatedAt\": \"2026-08-01T10:05:00.000Z\"\n  }\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]}]},{"name":"availability","description":"A(z) availability domain végpontjai.","item":[{"name":"availability.day - Egy nap szabad időpontjai","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/availability","host":["{{baseUrl}}"],"path":["availability"],"query":[{"key":"date","value":"","description":"A vizsgált nap a hely helyi idejében. Éjfél utáni zárásnál ez a szolgáltatási nap, vagyis az este, amelyhez a hajnali idősávok is tartoznak.","disabled":true},{"key":"partySize","value":"","description":"Hány főre keresel helyet. Alapértelmezés: 2. A tartományon kívüli érték nem hibázik: a rendszer a legközelebbi határra szorítja, és a válasz `partySize` mezője mutatja a ténylegesen használt számot. Az 1-1000 csak ennek a paraméternek az olvasható tartománya: a helynek saját létszám-korlátja is van (alapból 1 és 20 között, naponként felülírható), amit ez a végpont NEM érvényesít - azon kívüli létszámra is kaphatsz idősávokat, a `POST /reservations` viszont `422`-vel utasítja el.","disabled":true}]},"description":"A foglalási folyamat első lépése: megmondja, mikor lehet asztalt kérni az adott napra és létszámra. A listából kimaradnak a már betelt sávok, a zárva tartó napok és a nyitvatartáson kívüli időpontok - az utolsó beülés mindig annyival a zárás előtt van, hogy a teljes étkezési idő beleférjen -, a mai napon pedig a hely minimális előjegyzési idején (alapértelmezés: 2 óra) belüli időpontok is - ezért egy késő esti, mai napra szóló lekérdezés akkor is üres tömböt adhat, ha a hely nyitva van és teljesen szabad. Ha a hely kikapcsolta az aznapi foglalást, a mai nap mindig üres. FIGYELEM: a foglalási időablakot ez a végpont nem vizsgálja - múltbeli dátumra, illetve a megengedett előfoglalási időszakon (alapértelmezés: 30 nap) túli dátumra is visszaadhat idősávokat, amelyeket a `POST /reservations` utána `422` `reservation_rejected` hibával elutasít. A ténylegesen foglalható napokat a `GET /availability/month` adja meg, az az időablakot is figyelembe veszi. Üres `slots` tömb tehát nem hiba, és nem feltétlenül teltházat jelent: aznap erre a létszámra most nincs foglalható idősáv. Az itt kapott `time` értéket add át a `POST /reservations` hívásnak.\n\nSzükséges scope: `reservations.readonly`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"date\": \"2026-08-10\",\n  \"partySize\": 4,\n  \"slots\": [\n    {\n      \"time\": \"18:00\",\n      \"availableTableIds\": [\n        \"tbl_12\"\n      ]\n    },\n    {\n      \"time\": \"18:30\",\n      \"availableTableIds\": [\n        \"tbl_3\"\n      ]\n    }\n  ]\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"availability.month - Egy hónap foglaltsági áttekintése","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/availability/month","host":["{{baseUrl}}"],"path":["availability","month"],"query":[{"key":"year","value":"","description":"A vizsgált év, négy számjeggyel. Kötelező. A tartományon kívüli érték nem hibázik, a rendszer a legközelebbi határra szorítja.","disabled":true},{"key":"month","value":"","description":"A vizsgált hónap, 1 (január) és 12 (december) között. Kötelező. A tartományon kívüli érték a határra szorítódik.","disabled":true},{"key":"partySize","value":"","description":"Hány főre keresel helyet. Alapértelmezés: 2. A tartományon kívüli érték a határra szorítódik. A hely saját létszám-korlátját (alapból 1 és 20 fő között, naponként felülírható) ez a végpont nem érvényesíti, csak a foglalás - lásd `GET /availability`.","disabled":true}]},"description":"Naptár-nézethez: egy hónap minden napjáról megmondja, van-e legalább egy foglalható idősáv az adott létszámra. Konkrét időpontokat nem ad - azokhoz a kiválasztott napra hívd a `GET /availability` végpontot. Egyetlen hívás kiszolgál egy teljes hónapnyi naptárat, tehát ne kérdezz le napokat egyesével. A `GET /availability` végponttal szemben ez a foglalási időablakot is figyelembe veszi: a mai nap előtti és az előfoglalási időszakon (alapértelmezés: 30 nap) túli napok mindig `available: false` értéket kapnak. Ezért ugyanarra a napra a hónap `false`-ot mondhat, miközben a napi végpont idősávokat ad - ilyenkor a hónap válasza az irányadó, a foglalás ugyanis elutasítaná az időpontot.\n\nSzükséges scope: `reservations.readonly`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"year\": 2026,\n  \"month\": 8,\n  \"partySize\": 2,\n  \"days\": [\n    {\n      \"date\": \"2026-08-01\",\n      \"available\": true\n    },\n    {\n      \"date\": \"2026-08-02\",\n      \"available\": false\n    }\n  ]\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]}]},{"name":"contacts","description":"A(z) contacts domain végpontjai.","item":[{"name":"contacts.batch - Kötegelt kontakt-feltöltés (max 100)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/contacts/batch","host":["{{baseUrl}}"],"path":["contacts","batch"]},"body":{"mode":"raw","raw":"{\n  \"contacts\": [\n    {\n      \"firstName\": \"Anna\",\n      \"lastName\": \"Kiss\",\n      \"email\": \"anna@example.com\",\n      \"tags\": [\n        \"torzsvendeg\"\n      ]\n    },\n    {\n      \"firstName\": \"Péter\",\n      \"lastName\": \"Nagy\",\n      \"phone\": \"+36301234567\"\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"description":"Tételenkénti eredmény: egy hibás elem nem szakítja meg a többit. Sikeres elemnél `id`+`isNew`, hibásnál `error` jelenik meg - a másik oldal hiányzik a válaszból.\n\nSzükséges scope: `contacts.write`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"results\": [\n    {\n      \"index\": 0,\n      \"id\": \"cnt_1\",\n      \"isNew\": true\n    },\n    {\n      \"index\": 1,\n      \"error\": \"email or phone is required.\"\n    }\n  ],\n  \"summary\": {\n    \"total\": 2,\n    \"created\": 1,\n    \"updated\": 0,\n    \"failed\": 1\n  }\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"contacts.create - Kontakt létrehozása vagy összefésülése","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"{{$guid}}"}],"url":{"raw":"{{baseUrl}}/contacts","host":["{{baseUrl}}"],"path":["contacts"]},"body":{"mode":"raw","raw":"{\n  \"firstName\": \"Anna\",\n  \"lastName\": \"Kiss\",\n  \"email\": \"vendeg@example.com\",\n  \"phone\": \"+36301234567\",\n  \"tags\": [\n    \"torzsvendeg\"\n  ],\n  \"customFields\": {},\n  \"marketingConsent\": true,\n  \"note\": \"Ablak melletti asztalt kérünk.\"\n}","options":{"raw":{"language":"json"}}},"description":"Deduplikáció e-mail és telefon alapján: ha a cím vagy a szám már létezik a fiókban, a meglévő kontakt egészül ki, nem jön létre második. Az e-mail és a telefon egyenrangú: ha a kettő két KÜLÖNBÖZŐ meglévő kontaktra illeszkedik, a frissebben létrehozott kontakt frissül. A kiegészítés a kontakt ÜRES mezőit tölti ki: a már kitöltött `email` és `phone` értéket ez a végpont SOHA nem írja felül. `201` = új kontakt, `200` = meglévő találat kiegészítve - a kettőt a státuszkódból és az `isNew` mezőből is meg tudod különböztetni. Az `email` és a `phone` közül LEGALÁBB AZ EGYIKET meg kell adni, egyébként `400` a válasz. A `source` a kérésből nem állítható: új kontakt (`201`) mindig `api` forrással jön létre, meglévő találatnál (`200`) viszont az eredeti forrás megmarad (például `reservation` vagy `import`), a válasz `contact.source` mezője ilyenkor azt adja vissza.\n\nSzükséges scope: `contacts.write`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 201\", function () {","    pm.response.to.have.status(201);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});","","if (pm.response.code < 300) {","    const data = pm.response.json();","    const value = data && data.contact && data && data.contact.id;","    if (value) pm.collectionVariables.set(\"contactId\", value);","}"]}}],"response":[{"name":"Példa 201","status":"OK","code":201,"body":"{\n  \"contact\": {\n    \"id\": \"cnt_1\",\n    \"firstName\": \"Anna\",\n    \"lastName\": \"Kiss\",\n    \"email\": \"anna@example.com\",\n    \"phone\": \"+36301234567\",\n    \"tags\": [\n      \"törzsvendég\"\n    ],\n    \"source\": \"api\",\n    \"status\": \"active\",\n    \"customFields\": {},\n    \"marketingConsent\": true,\n    \"createdAt\": \"2026-07-01T09:00:00.000Z\",\n    \"updatedAt\": \"2026-08-01T09:00:00.000Z\"\n  },\n  \"isNew\": true,\n  \"changed\": true\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"contacts.delete - Kontakt törlése","request":{"method":"DELETE","header":[],"url":{"raw":"{{baseUrl}}/contacts/{{contactId}}","host":["{{baseUrl}}"],"path":["contacts","{{contactId}}"]},"description":"Törli a kontakt rekordot. A művelet NEM visszavonható, és külön `contacts.delete` scope kell hozzá - a `contacts.write` nem elég. FIGYELEM: ez NEM teljes GDPR-adattörlés. A kontakthoz kötött sorok (jegyzetek, aktivitás, foglalások, rendelések, deal-ek, feladatok, hűségpont-tranzakciók, utalványok, értékelések) MEGMARADNAK, csak a kontakt-hivatkozásuk nullázódik. Az ezekben tárolt személyes adat (például a jegyzet szövege és a rögzítő neve, a foglaláson a vendég neve, telefonszáma és e-mail címe) a rendszerben marad. Ha érintetti törlési kérelmet teljesítesz, ez a végpont önmagában nem elegendő. Nem létező azonosítóra `404`. A törlés NEM mindig sikerül: ha a kontakt egy automatizmus cél (Goal) lépésén várakozik, a hozzá tartozó belső sor jelenleg megakadályozza a törlést, és a válasz `500` - a kontakt ilyenkor VÁLTOZATLANUL megmarad.\n\nSzükséges scope: `contacts.delete`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"deleted\": true,\n  \"id\": \"cnt_1\"\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"contacts.get - Egy kontakt lekérdezése","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/contacts/{{contactId}}","host":["{{baseUrl}}"],"path":["contacts","{{contactId}}"]},"description":"Egyetlen kontakt teljes, aktuális adatlapja azonosító alapján. Jegyzeteket nem tartalmaz: a `POST /contacts/{id}/notes` jegyzeteit a `GET /contacts/{id}/notes` adja vissza, a kontakt létrehozásakor küldött `note` mező tartalmát viszont egyetlen végpont sem adja vissza - az csak a kezelőfelületen, a kontakt gyorsnézetének `Jegyzetek` fülén látszik. Más fiók kontaktjára `404` a válasz.\n\nSzükséges scope: `contacts.readonly`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"contact\": {\n    \"id\": \"cnt_1\",\n    \"firstName\": \"Anna\",\n    \"lastName\": \"Kiss\",\n    \"email\": \"anna@example.com\",\n    \"phone\": \"+36301234567\",\n    \"tags\": [\n      \"törzsvendég\"\n    ],\n    \"source\": \"api\",\n    \"status\": \"active\",\n    \"customFields\": {},\n    \"marketingConsent\": true,\n    \"createdAt\": \"2026-07-01T09:00:00.000Z\",\n    \"updatedAt\": \"2026-08-01T09:00:00.000Z\"\n  }\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"contacts.list - Kontaktok keresése vagy listázása","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/contacts","host":["{{baseUrl}}"],"path":["contacts"],"query":[{"key":"email","value":"","description":"Keresés e-mail címre. A teljes címnek egyeznie kell (részleges egyezés nincs), de a kis- és nagybetű nem számít: a rendszer mindkét oldalt kisbetűsíti, így a `Vendeg@Pelda.hu` és a `vendeg@pelda.hu` ugyanazt a sort találja meg. Megadásakor a végpont keresés-módba vált: legfeljebb 20 találat, `limit`/`offset` nélkül.","disabled":true},{"key":"phone","value":"","description":"Keresés telefonszámra. Ugyanúgy keresés-módba vált, mint az `email`; ha az `email` is meg van adva, a két feltétel ÉS-kapcsolatban szűr, nem VAGY. Az összevetés előtt MINDEN szóköz eltűnik mindkét oldalról, tehát a `+36 30 123 4567` és a `+36301234567` ugyanazt a sort találja meg. Ezen túl viszont karakterre egyeznie kell: a kötőjel, a zárójel és az országhívó alakja számít, a `06301234567` NEM találja meg a `+36301234567`-et. A szám többi részét ezért abban az alakban küldd, ahogyan létrehoztad.","disabled":true},{"key":"tag","value":"","description":"Szűrés egy címkére. Csak lista-módban érvényesül, tehát `email` vagy `phone` mellett nincs hatása.","disabled":true},{"key":"updatedSince","value":"","description":"Csak az ezóta módosult kontaktok. Csak lista-módban érvényesül. Szinkronizáláshoz: tedd el a legutolsó kapott `updatedAt` értéket, és azt add vissza.","disabled":true},{"key":"limit","value":"","description":"Találatok maximális száma (1-200, alapértelmezés 50; a tartományon kívüli érték a határra szorítódik, nem hibát ad)","disabled":true},{"key":"offset","value":"","description":"Hány találatot ugorjon át (a tartományon kívüli érték a határra szorítódik, nem hibát ad)","disabled":true}]},"description":"`email` vagy `phone` megadásával célzott keresés (max 20 találat, a válasz ekkor nem tartalmaz `limit`/`offset` mezőt), mindkettő megadásakor a két feltétel ÉS-kapcsolatban szűr; ezek nélkül lapozott lista (`limit`/`offset` mezőkkel). A `tag` és `updatedSince` szűrők csak lista-módban érvényesülnek, egymással kombinálhatók.\n\nSzükséges scope: `contacts.readonly`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"contacts\": [\n    {\n      \"id\": \"cnt_1\",\n      \"firstName\": \"Anna\",\n      \"lastName\": \"Kiss\",\n      \"email\": \"anna@example.com\",\n      \"phone\": \"+36301234567\",\n      \"tags\": [\n        \"törzsvendég\"\n      ],\n      \"source\": \"api\",\n      \"status\": \"active\",\n      \"customFields\": {},\n      \"marketingConsent\": true,\n      \"createdAt\": \"2026-07-01T09:00:00.000Z\",\n      \"updatedAt\": \"2026-08-01T09:00:00.000Z\"\n    }\n  ],\n  \"limit\": 50,\n  \"offset\": 0\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"contacts.notes_create - Jegyzet hozzáfűzése","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/contacts/{{contactId}}/notes","host":["{{baseUrl}}"],"path":["contacts","{{contactId}}","notes"]},"body":{"mode":"raw","raw":"{\n  \"content\": \"Ablak melletti asztalt kérünk.\"\n}","options":{"raw":{"language":"json"}}},"description":"Új, önálló jegyzetet fűz a kontakthoz, szerzővel és időbélyeggel. A meglévő jegyzeteket nem érinti, és nincs mód meglévő jegyzet módosítására vagy törlésére. HOL JELENIK MEG: a kontakt saját adatlapjának `Megjegyzések` fülén (ott a felületen szerkeszthető és törölhető is), valamint a mobil nézet kontakt-idővonalán. NEM jelenik meg a Kapcsolatok listából nyíló gyorsnézet `Jegyzetek` fülén, és az `Aktivitás` idővonalra sem kerül fel - ha ott keresed, hiányzónak tűnik, pedig a jegyzet elmentődött, és a `GET /contacts/{id}/notes` vissza is adja. Ez a jegyzet a `POST /contacts` `note` mezőjétől teljesen független: a kettő két külön helyre kerül, és nincs köztük átjárás. Ha a törzs SÉMAILAG érvénytelen (rossz típus, ismeretlen enum-érték) ÉS az `{id}` sem létezik, a válasz `400`, nem `404` - a séma-ellenőrzés megelőzi a létezés-vizsgálatot, hogy egy formailag hibás kérés hívója se kapjon jelzést az erőforrás létezéséről. A sémailag ÉRVÉNYES, de üres `{}` törzs viszont átmegy a séma-ellenőrzésen, ezért ott a létezés-vizsgálat fut előbb: nem létező azonosítóra `404` a válasz, és csak létező erőforrásnál kapod meg a `400`-at.\n\nSzükséges scope: `contacts.write`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 201\", function () {","    pm.response.to.have.status(201);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});","","if (pm.response.code < 300) {","    const data = pm.response.json();","    const value = data && data.note && data && data.note.id;","    if (value) pm.collectionVariables.set(\"noteId\", value);","}"]}}],"response":[{"name":"Példa 201","status":"OK","code":201,"body":"{\n  \"note\": {\n    \"id\": \"nte_2\",\n    \"content\": \"Visszahívás kérve.\",\n    \"staffName\": \"API\",\n    \"createdAt\": \"2026-08-03T08:00:00.000Z\"\n  }\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"contacts.notes_list - Kontakt jegyzeteinek listázása","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/contacts/{{contactId}}/notes","host":["{{baseUrl}}"],"path":["contacts","{{contactId}}","notes"],"query":[{"key":"limit","value":"","description":"Hány jegyzet jöjjön vissza, a legfrissebbtől számolva.","disabled":true}]},"description":"A kontakthoz tartozó jegyzetek, a legfrissebbel kezdve. Ezek önálló jegyzet-bejegyzések, szerzővel és időbélyeggel: a `POST /contacts/{id}/notes` végponttal, illetve a kezelőfelületen rögzített jegyzetek. A felületen ugyanezt a kontakt saját adatlapjának `Megjegyzések` fülén és a mobil nézet kontakt-idővonalán látod. A Kapcsolatok listából nyíló gyorsnézet `Jegyzetek` füle EZEKET NEM mutatja: az a kontakt szabad szöveges jegyzetmezőjét jeleníti meg, amelybe a `POST /contacts` `note` mezője ír - az ott küldött szöveg ebben a listában soha nem jelenik meg. Ez a végpont nem lapozható: csak `limit` szerinti korlátozást fogad, `offset` sem a kérésben, sem a válaszban nincs. A régebbi jegyzetekhez emeld a `limit` értékét.\n\nSzükséges scope: `contacts.readonly`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"notes\": [\n    {\n      \"id\": \"nte_1\",\n      \"content\": \"Telefonon egyeztetve.\",\n      \"staffName\": \"Kovács Éva\",\n      \"createdAt\": \"2026-08-01T10:00:00.000Z\"\n    }\n  ]\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"contacts.tags_add - Címkék hozzáadása (unió)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/contacts/{{contactId}}/tags","host":["{{baseUrl}}"],"path":["contacts","{{contactId}}","tags"]},"body":{"mode":"raw","raw":"{\n  \"tags\": [\n    \"torzsvendeg\",\n    \"vip\"\n  ]\n}","options":{"raw":{"language":"json"}}},"description":"A megadott címkéket hozzáadja a kontakt meglévő címkéihez. A meglévők megmaradnak, a duplikátumok kiszűrődnek. Csak ez a végpont regisztrálja az új címkét a fiók címkelistájába, és csak ez indít címke-alapú automatizmust. Ha a teljes listát akarod felülírni, a `PATCH /contacts/{id}` `tags` mezőjét használd - de az a felülírás nem regisztrál új címkét és nem indít címke-automatizmust. Ha a törzs SÉMAILAG érvénytelen (rossz típus, ismeretlen enum-érték) ÉS az `{id}` sem létezik, a válasz `400`, nem `404` - a séma-ellenőrzés megelőzi a létezés-vizsgálatot, hogy egy formailag hibás kérés hívója se kapjon jelzést az erőforrás létezéséről. A sémailag ÉRVÉNYES, de üres `{}` törzs viszont átmegy a séma-ellenőrzésen, ezért ott a létezés-vizsgálat fut előbb: nem létező azonosítóra `404` a válasz, és csak létező erőforrásnál kapod meg a `400`-at.\n\nSzükséges scope: `contacts.write`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"contact\": {\n    \"id\": \"cnt_1\",\n    \"firstName\": \"Anna\",\n    \"lastName\": \"Kiss\",\n    \"email\": \"anna@example.com\",\n    \"phone\": \"+36301234567\",\n    \"tags\": [\n      \"törzsvendég\"\n    ],\n    \"source\": \"api\",\n    \"status\": \"active\",\n    \"customFields\": {},\n    \"marketingConsent\": true,\n    \"createdAt\": \"2026-07-01T09:00:00.000Z\",\n    \"updatedAt\": \"2026-08-01T09:00:00.000Z\"\n  },\n  \"added\": [\n    \"vip\"\n  ]\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"contacts.tags_remove - Címkék eltávolítása","request":{"method":"DELETE","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/contacts/{{contactId}}/tags","host":["{{baseUrl}}"],"path":["contacts","{{contactId}}","tags"]},"body":{"mode":"raw","raw":"{\n  \"tags\": [\n    \"torzsvendeg\",\n    \"vip\"\n  ]\n}","options":{"raw":{"language":"json"}}},"description":"A DELETE kérés törzse (`{ \"tags\": [...] }`) kötelező - a route ténylegesen JSON body-t olvas DELETE-nél is. Ha a törzs SÉMAILAG érvénytelen (rossz típus, ismeretlen enum-érték) ÉS az `{id}` sem létezik, a válasz `400`, nem `404` - a séma-ellenőrzés megelőzi a létezés-vizsgálatot, hogy egy formailag hibás kérés hívója se kapjon jelzést az erőforrás létezéséről. A sémailag ÉRVÉNYES, de üres `{}` törzs viszont átmegy a séma-ellenőrzésen, ezért ott a létezés-vizsgálat fut előbb: nem létező azonosítóra `404` a válasz, és csak létező erőforrásnál kapod meg a `400`-at.\n\nSzükséges scope: `contacts.write`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"contact\": {\n    \"id\": \"cnt_1\",\n    \"firstName\": \"Anna\",\n    \"lastName\": \"Kiss\",\n    \"email\": \"anna@example.com\",\n    \"phone\": \"+36301234567\",\n    \"tags\": [\n      \"törzsvendég\"\n    ],\n    \"source\": \"api\",\n    \"status\": \"active\",\n    \"customFields\": {},\n    \"marketingConsent\": true,\n    \"createdAt\": \"2026-07-01T09:00:00.000Z\",\n    \"updatedAt\": \"2026-08-01T09:00:00.000Z\"\n  },\n  \"removed\": [\n    \"vip\"\n  ]\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"contacts.update - Kontakt mezőinek módosítása","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/contacts/{{contactId}}","host":["{{baseUrl}}"],"path":["contacts","{{contactId}}"]},"body":{"mode":"raw","raw":"{\n  \"firstName\": \"Új érték\",\n  \"lastName\": \"Új érték\",\n  \"email\": \"Új érték\",\n  \"phone\": \"Új érték\",\n  \"tags\": [\n    \"torzsvendeg\"\n  ],\n  \"customFields\": {},\n  \"marketingConsent\": true\n}","options":{"raw":{"language":"json"}}},"description":"Csak a törzsben szereplő mezők változnak, a többi érintetlen marad. Egy mező kiürítéséhez küldd `null` értékkel; a kulcs elhagyása nem törli. Legalább egy módosítható mezőt meg kell adni (`firstName`, `lastName`, `email`, `phone`, `tags`, `customFields`, `marketingConsent`), egyébként `400` a válasz. Ha a törzs SÉMAILAG érvénytelen (rossz típus, ismeretlen enum-érték) ÉS az `{id}` sem létezik, a válasz `400`, nem `404` - a séma-ellenőrzés megelőzi a létezés-vizsgálatot, hogy egy formailag hibás kérés hívója se kapjon jelzést az erőforrás létezéséről. A sémailag ÉRVÉNYES, de üres `{}` törzs viszont átmegy a séma-ellenőrzésen, ezért ott a létezés-vizsgálat fut előbb: nem létező azonosítóra `404` a válasz, és csak létező erőforrásnál kapod meg a `400`-at.\n\nSzükséges scope: `contacts.write`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"contact\": {\n    \"id\": \"cnt_1\",\n    \"firstName\": \"Anna\",\n    \"lastName\": \"Kiss\",\n    \"email\": \"anna@example.com\",\n    \"phone\": \"+36301234567\",\n    \"tags\": [\n      \"törzsvendég\"\n    ],\n    \"source\": \"api\",\n    \"status\": \"active\",\n    \"customFields\": {},\n    \"marketingConsent\": true,\n    \"createdAt\": \"2026-07-01T09:00:00.000Z\",\n    \"updatedAt\": \"2026-08-01T09:00:00.000Z\"\n  }\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]}]},{"name":"pipelines","description":"A(z) pipelines domain végpontjai.","item":[{"name":"pipelines.list - Pipeline-ok listázása szakaszokkal","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/pipelines","host":["{{baseUrl}}"],"path":["pipelines"]},"description":"A fiók összes CRM pipeline-ja, mindegyiknél a szakaszokkal. Ez a kereső táblázat a `deals` végpontok `pipelineId` és `stageId` mezőihez: az azonosítók itt derülnek ki. A lista nem lapozható, és `deals.readonly` scope kell hozzá. Gyorsítótárazható, de nem örökre: a szakaszokat a felületen bármikor átnevezik, átrendezik vagy törlik, a válasz pedig nem hordoz sem verziót, sem módosítási időpontot, ezért az eltett listát rendszeresen - például naponta - kérd le újra.\n\nSzükséges scope: `deals.readonly`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"pipelines\": [\n    {\n      \"id\": \"pl_1\",\n      \"name\": \"Rendezvény\",\n      \"type\": \"events\",\n      \"stages\": [\n        {\n          \"id\": \"st_1\",\n          \"name\": \"Érdeklődés\",\n          \"color\": \"#94a3b8\",\n          \"sortOrder\": 0\n        },\n        {\n          \"id\": \"st_2\",\n          \"name\": \"Ajánlat\",\n          \"color\": \"#3b82f6\",\n          \"sortOrder\": 1\n        }\n      ],\n      \"isDefault\": true,\n      \"createdAt\": \"2026-06-01T09:00:00.000Z\"\n    }\n  ]\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]}]},{"name":"deals","description":"A(z) deals domain végpontjai.","item":[{"name":"deals.create - Üzlet létrehozása","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"{{$guid}}"}],"url":{"raw":"{{baseUrl}}/deals","host":["{{baseUrl}}"],"path":["deals"]},"body":{"mode":"raw","raw":"{\n  \"title\": \"Példa cím\",\n  \"pipelineId\": \"id_123\"\n}","options":{"raw":{"language":"json"}}},"description":"Új üzletet nyit a megadott pipeline-ban. Az üzlet állapota mindig `open` lesz - a kérésből nem állítható, a lezáráshoz a `PATCH /deals/{id}` végpontot használd. A hívás idempotens: `Idempotency-Key` fejléccel az újrapróbálkozás nem hoz létre második üzletet. A `stageId` annak a pipeline-nak a szakasza kell legyen, amit a `pipelineId` megnevez - más pipeline szakaszára `400` a válasz. Szakasz nélküli pipeline-ba szintén nem lehet üzletet nyitni.\n\nSzükséges scope: `deals.write`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 201\", function () {","    pm.response.to.have.status(201);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});","","if (pm.response.code < 300) {","    const data = pm.response.json();","    const value = data && data.deal && data && data.deal.id;","    if (value) pm.collectionVariables.set(\"dealId\", value);","}"]}}],"response":[{"name":"Példa 201","status":"OK","code":201,"body":"{\n  \"deal\": {\n    \"id\": \"dl_1\",\n    \"pipelineId\": \"pl_1\",\n    \"stageId\": \"st_2\",\n    \"title\": \"Céges karácsonyi vacsora\",\n    \"value\": 450000,\n    \"currency\": \"HUF\",\n    \"status\": \"open\",\n    \"contactId\": \"cnt_1\",\n    \"contactName\": \"Kiss Anna\",\n    \"contactEmail\": \"anna@example.com\",\n    \"contactPhone\": \"+36301234567\",\n    \"description\": null,\n    \"tags\": [],\n    \"priority\": null,\n    \"expectedCloseDate\": null,\n    \"closedAt\": null,\n    \"lostReason\": null,\n    \"createdAt\": \"2026-07-20T11:00:00.000Z\",\n    \"updatedAt\": \"2026-08-01T11:00:00.000Z\"\n  }\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"deals.delete - Üzlet törlése","request":{"method":"DELETE","header":[],"url":{"raw":"{{baseUrl}}/deals/{{dealId}}","host":["{{baseUrl}}"],"path":["deals","{{dealId}}"]},"description":"Véglegesen törli az üzletet. A művelet NEM visszavonható. A törlés továbbgyűrűzik: az üzlet teljes tevékenységnaplója (jegyzetek, szakaszváltások, státuszváltások) vele együtt megsemmisül, a hozzá kötött CRM-feladatok pedig megmaradnak, de a `dealId` mezőjük leválik. Ha csak lezárni akarod, a `PATCH /deals/{id}` végponton állítsd a `status` mezőt `won` vagy `lost` értékre - úgy az üzlet és a naplója is megmarad a riportokban.\n\nSzükséges scope: `deals.write`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"deleted\": true,\n  \"id\": \"dl_1\"\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"deals.get - Egy üzlet lekérdezése","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/deals/{{dealId}}","host":["{{baseUrl}}"],"path":["deals","{{dealId}}"]},"description":"Egyetlen üzlet aktuális állapota azonosító alapján. Más fiók üzletére `404` a válasz.\n\nSzükséges scope: `deals.readonly`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"deal\": {\n    \"id\": \"dl_1\",\n    \"pipelineId\": \"pl_1\",\n    \"stageId\": \"st_2\",\n    \"title\": \"Céges karácsonyi vacsora\",\n    \"value\": 450000,\n    \"currency\": \"HUF\",\n    \"status\": \"open\",\n    \"contactId\": \"cnt_1\",\n    \"contactName\": \"Kiss Anna\",\n    \"contactEmail\": \"anna@example.com\",\n    \"contactPhone\": \"+36301234567\",\n    \"description\": null,\n    \"tags\": [],\n    \"priority\": null,\n    \"expectedCloseDate\": null,\n    \"closedAt\": null,\n    \"lostReason\": null,\n    \"createdAt\": \"2026-07-20T11:00:00.000Z\",\n    \"updatedAt\": \"2026-08-01T11:00:00.000Z\"\n  }\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"deals.list - Üzletek listázása","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/deals","host":["{{baseUrl}}"],"path":["deals"],"query":[{"key":"pipelineId","value":"","description":"Csak ennek a pipeline-nak az üzletei.","disabled":true},{"key":"stageId","value":"","description":"Csak az ebben a szakaszban álló üzletek. Önmagában is használható, `pipelineId` nélkül.","disabled":true},{"key":"status","value":"","description":"Szűrés állapotra. `open`: nyitott. `won`: megnyert. `lost`: elveszített. `abandoned`: elejtett.","disabled":true},{"key":"contactId","value":"","description":"Csak az ehhez a kontakthoz kötött üzletek. A kontakt törlése után az API-n létrehozott üzletek kiesnek ebből a szűrőből, akkor is, ha a `contactName` még ki van töltve.","disabled":true},{"key":"limit","value":"","description":"Találatok maximális száma (1-200, alapértelmezés 50; a tartományon kívüli érték a határra szorítódik, nem hibát ad)","disabled":true},{"key":"offset","value":"","description":"Hány találatot ugorjon át (a tartományon kívüli érték a határra szorítódik, nem hibát ad)","disabled":true}]},"description":"Lapozott lista a fiók üzleteiről, a legutóbb létrehozottal kezdve. A szűrők ÉS kapcsolattal érvényesülnek. A szakaszok nevéhez és sorrendjéhez a `GET /pipelines` végpontot hívd le egyszer, és a `stageId` értékeket ahhoz párosítsd.\n\nSzükséges scope: `deals.readonly`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"deals\": [\n    {\n      \"id\": \"dl_1\",\n      \"pipelineId\": \"pl_1\",\n      \"stageId\": \"st_2\",\n      \"title\": \"Céges karácsonyi vacsora\",\n      \"value\": 450000,\n      \"currency\": \"HUF\",\n      \"status\": \"open\",\n      \"contactId\": \"cnt_1\",\n      \"contactName\": \"Kiss Anna\",\n      \"contactEmail\": \"anna@example.com\",\n      \"contactPhone\": \"+36301234567\",\n      \"description\": null,\n      \"tags\": [],\n      \"priority\": null,\n      \"expectedCloseDate\": null,\n      \"closedAt\": null,\n      \"lostReason\": null,\n      \"createdAt\": \"2026-07-20T11:00:00.000Z\",\n      \"updatedAt\": \"2026-08-01T11:00:00.000Z\"\n    }\n  ],\n  \"limit\": 50,\n  \"offset\": 0\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"deals.update - Üzlet módosítása, szakaszváltás, lezárás","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/deals/{{dealId}}","host":["{{baseUrl}}"],"path":["deals","{{dealId}}"]},"body":{"mode":"raw","raw":"{\n  \"title\": \"Példa cím\",\n  \"stageId\": \"id_123\",\n  \"status\": \"open\",\n  \"value\": 25000,\n  \"description\": \"Új érték\",\n  \"tags\": [\n    \"torzsvendeg\"\n  ],\n  \"lostReason\": \"Ár\"\n}","options":{"raw":{"language":"json"}}},"description":"Szakaszváltáskor elindul a szakaszváltás-automatizmus és sorba kerül a `deal.stage_changed` webhook. Egyik sem befolyásolja a választ: ha az automatizmus indítása hibázik, a hívás akkor is `200`-at ad a módosított üzlettel, és csak a szerverlogba kerül bejegyzés. A sikeres válasz tehát azt igazolja, hogy a mentés megtörtént, azt nem, hogy az automatizmus le is futott. A `lostReason` csak akkor mentődik, ha ugyanebben a kérésben a `status` értéke `lost`. Legalább egy ténylegesen VÁLTOZÁST hozó mezőt meg kell adni (`title`, `value`, `description`, `tags`, `stageId`, `status`), egyébként `400` a válasz: a `stageId` csak akkor számít módosításnak, ha eltér az üzlet jelenlegi szakaszától, a többi mező puszta jelenléte viszont akkor is módosításnak számít, ha az érték megegyezik a jelenlegivel. Az új `stageId` az üzlet SAJÁT pipeline-jának szakasza kell legyen; másik pipeline szakaszára `400`. Ha a törzs SÉMAILAG érvénytelen (rossz típus, ismeretlen enum-érték) ÉS az `{id}` sem létezik, a válasz `400`, nem `404` - a séma-ellenőrzés megelőzi a létezés-vizsgálatot, hogy egy formailag hibás kérés hívója se kapjon jelzést az erőforrás létezéséről. A sémailag ÉRVÉNYES, de üres `{}` törzs viszont átmegy a séma-ellenőrzésen, ezért ott a létezés-vizsgálat fut előbb: nem létező azonosítóra `404` a válasz, és csak létező erőforrásnál kapod meg a `400`-at.\n\nSzükséges scope: `deals.write`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"deal\": {\n    \"id\": \"dl_1\",\n    \"pipelineId\": \"pl_1\",\n    \"stageId\": \"st_3\",\n    \"title\": \"Céges karácsonyi vacsora\",\n    \"value\": 450000,\n    \"currency\": \"HUF\",\n    \"status\": \"open\",\n    \"contactId\": \"cnt_1\",\n    \"contactName\": \"Kiss Anna\",\n    \"contactEmail\": \"anna@example.com\",\n    \"contactPhone\": \"+36301234567\",\n    \"description\": null,\n    \"tags\": [],\n    \"priority\": null,\n    \"expectedCloseDate\": null,\n    \"closedAt\": null,\n    \"lostReason\": null,\n    \"createdAt\": \"2026-07-20T11:00:00.000Z\",\n    \"updatedAt\": \"2026-08-01T11:00:00.000Z\"\n  }\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]}]},{"name":"orders","description":"A(z) orders domain végpontjai.","item":[{"name":"orders.get - Egy rendelés lekérdezése","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/orders/{{orderId}}","host":["{{baseUrl}}"],"path":["orders","{{orderId}}"]},"description":"Egyetlen, az étteremben felvett rendelés a tételsoraival és a teljes pénzügyi bontásával. Ismeretlen azonosítóra és más fiók rendelésére egyaránt `404` a válasz, a kettő szándékosan nem különböztethető meg. Számlát vagy nyugtát ez a végpont nem ad ki.\n\nSzükséges scope: `orders.readonly`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"order\": {\n    \"id\": \"ord_1\",\n    \"orderNumber\": \"20260801-A1B2\",\n    \"type\": \"dine_in\",\n    \"status\": \"completed\",\n    \"tableName\": \"12\",\n    \"contactId\": \"cnt_1\",\n    \"customerName\": \"Kiss Anna\",\n    \"reservationId\": null,\n    \"items\": [\n      {\n        \"name\": \"Gulyásleves\",\n        \"quantity\": 2,\n        \"unitPrice\": 2200,\n        \"totalPrice\": 4400\n      }\n    ],\n    \"subtotal\": 4400,\n    \"taxAmount\": 935,\n    \"discountAmount\": 400,\n    \"tipAmount\": 0,\n    \"serviceFee\": 500,\n    \"deliveryFee\": 0,\n    \"totalAmount\": 4500,\n    \"notes\": null,\n    \"source\": \"pos\",\n    \"paymentMethod\": null,\n    \"scheduledPickupTime\": null,\n    \"deliveryAddress\": null,\n    \"deliveryCity\": null,\n    \"deliveryPostalCode\": null,\n    \"deliveryPhone\": null,\n    \"createdAt\": \"2026-08-01T12:00:00.000Z\",\n    \"completedAt\": \"2026-08-01T13:10:00.000Z\"\n  }\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"orders.list - Rendelések listázása","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/orders","host":["{{baseUrl}}"],"path":["orders"],"query":[{"key":"status","value":"","description":"Szűrés a rendelés állapotára.","disabled":true},{"key":"type","value":"","description":"Szűrés a rendelés fajtájára.","disabled":true},{"key":"contactId","value":"","description":"Csak az ehhez a kontakthoz kötött rendelések.","disabled":true},{"key":"dateFrom","value":"","description":"Csak az ettől a naptól kezdve felvett rendelések. A határ UTC-éjfél (`ÉÉÉÉ-HH-NNT00:00:00Z`), nem a hely helyi éjfele: nyári időszámításban (UTC+2) a megadott nap helyi 02:00 órájától kapod a rendeléseket.","disabled":true},{"key":"dateTo","value":"","description":"Csak az eddig a napig bezárólag felvett rendelések. A felső határ `ÉÉÉÉ-HH-NNT23:59:59.999Z`, szintén UTC szerint: nyáron (UTC+2) a következő helyi nap 02:00 órájáig felvett rendelések még beleesnek.","disabled":true},{"key":"limit","value":"","description":"Találatok maximális száma (1-200, alapértelmezés 50; a tartományon kívüli érték a határra szorítódik, nem hibát ad)","disabled":true},{"key":"offset","value":"","description":"Hány találatot ugorjon át (a tartományon kívüli érték a határra szorítódik, nem hibát ad)","disabled":true}]},"description":"A fiók éttermi rendelésfelvételéből (kassza, kioszk, QR-rendelés, hűségalkalmazás, telefon) származó rendelések lapozott listája, a legfrissebbel kezdve. A szűrők ÉS kapcsolattal érvényesülnek. Ez a végpont csak olvas: rendelést az API-n keresztül nem lehet létrehozni vagy módosítani.\n\nSzükséges scope: `orders.readonly`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"orders\": [\n    {\n      \"id\": \"ord_1\",\n      \"orderNumber\": \"20260801-A1B2\",\n      \"type\": \"dine_in\",\n      \"status\": \"completed\",\n      \"tableName\": \"12\",\n      \"contactId\": \"cnt_1\",\n      \"customerName\": \"Kiss Anna\",\n      \"reservationId\": null,\n      \"items\": [\n        {\n          \"name\": \"Gulyásleves\",\n          \"quantity\": 2,\n          \"unitPrice\": 2200,\n          \"totalPrice\": 4400\n        }\n      ],\n      \"subtotal\": 4400,\n      \"taxAmount\": 935,\n      \"discountAmount\": 400,\n      \"tipAmount\": 0,\n      \"serviceFee\": 500,\n      \"deliveryFee\": 0,\n      \"totalAmount\": 4500,\n      \"notes\": null,\n      \"source\": \"pos\",\n      \"paymentMethod\": null,\n      \"scheduledPickupTime\": null,\n      \"deliveryAddress\": null,\n      \"deliveryCity\": null,\n      \"deliveryPostalCode\": null,\n      \"deliveryPhone\": null,\n      \"createdAt\": \"2026-08-01T12:00:00.000Z\",\n      \"completedAt\": \"2026-08-01T13:10:00.000Z\"\n    }\n  ],\n  \"limit\": 50,\n  \"offset\": 0\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]}]},{"name":"menu","description":"A(z) menu domain végpontjai.","item":[{"name":"menu.get - Teljes étlap (kategóriák, tételek, feltét-csoportok)","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/menu","host":["{{baseUrl}}"],"path":["menu"],"query":[{"key":"includeUnavailable","value":"","description":"Az átmenetileg elfogyott (`isAvailable: false`) tételek is jöjjenek. Az étlapról levett, inaktív tételeket ez SEM hozza vissza: azok erről a végpontról semmilyen paraméterrel nem kérdezhetők le, egyesével a `GET /menu/items/{id}` adja csak vissza őket. Kizárólag a szó szerinti `true` érték kapcsolja be; minden más érték - `1`, `igen`, üres string is - kikapcsoltnak számít, és nem ad hibát.","disabled":true}]},"description":"A teljes étlap egyetlen hívásban: a kategóriák a tételeikkel, mellettük külön tömbben a feltét-csoportok. A tételek a `modifierGroupIds` mezőn keresztül hivatkoznak a csoportokra, tehát a két tömböt neked kell összepárosítanod. A válasz csak a bekapcsolt kategóriákat és az étlapon lévő (aktív) tételeket tartalmazza, azon belül alapból csak az elérhetőeket - egy kikapcsolt kategória a tételeivel együtt hiányzik. A `modifierGroups` tömb szintén csak a ténylegesen visszaadott tételek által hivatkozott csoportokat tartalmazza, nem a fiók teljes csoportlistáját. Nem lapozható, és nagy étlapnál a válasz is nagy - érdemes gyorsítótárazni, nem minden oldalbetöltésnél lekérni.\n\nSzükséges scope: `menu.readonly`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"categories\": [\n    {\n      \"id\": \"mc_1\",\n      \"name\": \"Levesek\",\n      \"nameEn\": \"Soups\",\n      \"slug\": \"levesek\",\n      \"description\": null,\n      \"image\": null,\n      \"sortOrder\": 0,\n      \"parentCategoryId\": null,\n      \"items\": [\n        {\n          \"id\": \"mi_1\",\n          \"name\": \"Gulyásleves\",\n          \"nameEn\": \"Goulash soup\",\n          \"description\": \"Marhalábszárból, csipetkével.\",\n          \"categoryId\": \"mc_1\",\n          \"price\": 2200,\n          \"taxRate\": 27,\n          \"image\": null,\n          \"isAvailable\": true,\n          \"allergens\": [\n            \"gluten\",\n            \"celery\"\n          ],\n          \"variants\": [],\n          \"preparationTime\": 12,\n          \"sortOrder\": 0,\n          \"modifierGroupIds\": [\n            \"mg_1\"\n          ],\n          \"channels\": {\n            \"pos\": true,\n            \"kiosk\": false,\n            \"online\": true,\n            \"loyaltyApp\": false\n          }\n        }\n      ]\n    }\n  ],\n  \"modifierGroups\": [\n    {\n      \"id\": \"mg_1\",\n      \"name\": \"Extrák\",\n      \"isRequired\": false,\n      \"minSelect\": 0,\n      \"maxSelect\": 2,\n      \"options\": [\n        {\n          \"id\": \"md_1\",\n          \"name\": \"Extra csipetke\",\n          \"price\": 300,\n          \"isDefault\": false\n        }\n      ]\n    }\n  ]\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"menu.item_get - Egy étlaptétel lekérdezése","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/menu/items/{{menuItemId}}","host":["{{baseUrl}}"],"path":["menu","items","{{menuItemId}}"]},"description":"Egyetlen étlaptétel azonosító alapján. Nincs rajta elérhetőség- vagy étlapon-lét szerinti szűrés: az elfogyott és az étlapról levett, inaktív tételt is visszaadja, és akkor is, ha a tétel kategóriája ki van kapcsolva. A tétel feltét-csoportjait ez a végpont csak azonosítóként adja - a csoportok tartalmát a `GET /menu` válaszának `modifierGroups` tömbjéből vedd.\n\nSzükséges scope: `menu.readonly`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"item\": {\n    \"id\": \"mi_1\",\n    \"name\": \"Gulyásleves\",\n    \"nameEn\": \"Goulash soup\",\n    \"description\": \"Marhalábszárból, csipetkével.\",\n    \"categoryId\": \"mc_1\",\n    \"price\": 2200,\n    \"taxRate\": 27,\n    \"image\": null,\n    \"isAvailable\": true,\n    \"allergens\": [\n      \"gluten\",\n      \"celery\"\n    ],\n    \"variants\": [],\n    \"preparationTime\": 12,\n    \"sortOrder\": 0,\n    \"modifierGroupIds\": [\n      \"mg_1\"\n    ],\n    \"channels\": {\n      \"pos\": true,\n      \"kiosk\": false,\n      \"online\": true,\n      \"loyaltyApp\": false\n    }\n  }\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"menu.item_update - Ár és elérhetőség módosítása (POS-szinkron)","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/menu/items/{{menuItemId}}","host":["{{baseUrl}}"],"path":["menu","items","{{menuItemId}}"]},"body":{"mode":"raw","raw":"{\n  \"price\": 25000,\n  \"isAvailable\": true\n}","options":{"raw":{"language":"json"}}},"description":"A kassza és az étlap összehangolására való: egy tételnek CSAK az árát és az elérhetőségét lehet átírni. A név, a leírás, a kategória, az áfakulcs és a feltétek az API-ból nem módosíthatók - azokat a felületen kell szerkeszteni. Ha mégis beleírod őket a törzsbe, a kérés NEM hibázik: a nem támogatott mezők csendben kimaradnak a feldolgozásból, a támogatottak pedig érvényesülnek. A `{\"price\": 2400, \"name\": \"Új név\"}` törzsre tehát `200` a válasz, az ár átíródik, a név viszont változatlan marad - a válaszban visszaadott tétel a régi nevet mutatja. Ezt mindig a válasz tételén ellenőrizd, ne a beküldött törzsön. Legalább az egyiket (`price` vagy `isAvailable`) meg kell adni: üres törzsre `400` a válasz, és kizárólag ez az az eset, amikor a nem támogatott mezők küldése hibát ad, mert ilyenkor egyetlen támogatott mező sincs a törzsben. Ez az ellenőrzés viszont a tétel létezésének vizsgálata UTÁN fut, tehát üres törzs és ismeretlen `{id}` együtt `404`-et ad, nem `400`-at. Ha a törzs SÉMAILAG érvénytelen (rossz típus, ismeretlen enum-érték) ÉS az `{id}` sem létezik, a válasz `400`, nem `404` - a séma-ellenőrzés megelőzi a létezés-vizsgálatot, hogy egy formailag hibás kérés hívója se kapjon jelzést az erőforrás létezéséről. A sémailag ÉRVÉNYES, de üres `{}` törzs viszont átmegy a séma-ellenőrzésen, ezért ott a létezés-vizsgálat fut előbb: nem létező azonosítóra `404` a válasz, és csak létező erőforrásnál kapod meg a `400`-at.\n\nSzükséges scope: `menu.write`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"item\": {\n    \"id\": \"mi_1\",\n    \"name\": \"Gulyásleves\",\n    \"nameEn\": \"Goulash soup\",\n    \"description\": \"Marhalábszárból, csipetkével.\",\n    \"categoryId\": \"mc_1\",\n    \"price\": 2400,\n    \"taxRate\": 27,\n    \"image\": null,\n    \"isAvailable\": true,\n    \"allergens\": [\n      \"gluten\",\n      \"celery\"\n    ],\n    \"variants\": [],\n    \"preparationTime\": 12,\n    \"sortOrder\": 0,\n    \"modifierGroupIds\": [\n      \"mg_1\"\n    ],\n    \"channels\": {\n      \"pos\": true,\n      \"kiosk\": false,\n      \"online\": true,\n      \"loyaltyApp\": false\n    }\n  }\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]}]},{"name":"loyalty","description":"A(z) loyalty domain végpontjai.","item":[{"name":"loyalty.balance - Hűségtag egyenlege","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/loyalty/balance","host":["{{baseUrl}}"],"path":["loyalty","balance"],"query":[{"key":"contactId","value":"","description":"A tag kontakt-azonosítója. Ez a legpontosabb azonosítás; ha megadod, a többi szűrő nem számít.","disabled":true},{"key":"email","value":"","description":"A tag e-mail címe. Pontos egyezés, a kis- és nagybetű nem számít. Csak akkor érvényesül, ha `contactId`-t nem adtál meg.","disabled":true},{"key":"phone","value":"","description":"A tag telefonszáma. A szóközök nem számítanak: a `+36 30 123 4567` és a `+36301234567` ugyanazt a tagot találja meg. Minden más karakternek egyeznie kell a rögzített alakkal, ezért kötőjel, zárójel, illetve `06` és `+36` eltérés esetén nincs találat. Csak akkor érvényesül, ha sem `contactId`-t, sem `email`-t nem adtál meg.","disabled":true}]},"description":"Egy hűségtag pontjai, szintje és wallet-kártyája egyetlen hívásban. A kontaktot `contactId`, `email` vagy `phone` alapján azonosítod - legalább az egyiket meg kell adni, egyébként `400` a válasz. Ha többet küldesz, a sorrend dönt: a `contactId` erősebb az `email`-nél, az `email` pedig a `phone`-nál, a gyengébb szűrőt a végpont figyelmen kívül hagyja. `404` kizárólag akkor jön, ha ilyen kontakt egyáltalán nincs a fiókban: a végpont a hűségtagságot nem vizsgálja, ezért egy hűségprogramban nem szereplő kontakt is `200`-at kap `loyaltyPoints: 0`, `loyaltyTier: null` és `pass: null` értékekkel - a `200` tehát önmagában nem bizonyítja a tagságot. Az `email` és a `phone` több kontaktra is illeszkedhet, lásd a figyelmeztetéseket. Ez a végpont csak olvas: pontot jóváírni vagy levonni ezen a v3 API-n nem lehet - pontot a kasszaoldali Partner API (hűségkártya / POS) mozgat.\n\nSzükséges scope: `loyalty.readonly`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"contactId\": \"cnt_1\",\n  \"name\": \"Kiss Anna\",\n  \"email\": \"anna@example.com\",\n  \"phone\": \"+36301234567\",\n  \"loyaltyPoints\": 1250,\n  \"loyaltyTier\": \"ezüst\",\n  \"totals\": {\n    \"reservations\": 17,\n    \"orders\": 42,\n    \"spent\": 248000\n  },\n  \"pass\": {\n    \"cardToken\": \"wc_9f2b5c1d\",\n    \"status\": \"active\",\n    \"points\": 1250,\n    \"giftBalance\": 0,\n    \"stamps\": 7\n  }\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]}]},{"name":"reviews","description":"A(z) reviews domain végpontjai.","item":[{"name":"reviews.list - Értékelések listázása","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/reviews","host":["{{baseUrl}}"],"path":["reviews"],"query":[{"key":"platform","value":"","description":"Csak erről a platformról érkezett értékelések. A lista a korábbi rendszerből átvett (`dynexv2` platformú) értékeléseket is tartalmazza, azokat ez a szűrő nem tudja sem kiválasztani, sem kizárni.","disabled":true},{"key":"minRating","value":"","description":"Legalább ennyi csillagos értékelések. Az `1` érték nem szűr semmit (minden értékelés legalább egy csillagos), tehát a szűrés `2`-től kezd hatni. Az 1-5 tartományon kívüli érték nem hibázik, a rendszer a legközelebbi határra szorítja. A `facebook` platform soraira - a bináris ajánlás 1-re és 5-re képzése miatt - a 2 és 5 közötti küszöbök mind ugyanazt a halmazt adják vissza, csak az ajánló értékeléseket.","disabled":true},{"key":"limit","value":"","description":"Találatok maximális száma (1-200, alapértelmezés 50; a tartományon kívüli érték a határra szorítódik, nem hibát ad)","disabled":true},{"key":"offset","value":"","description":"Hány találatot ugorjon át (a tartományon kívüli érték a határra szorítódik, nem hibát ad)","disabled":true}]},"description":"A fiókhoz beérkezett értékelések lapozott listája, a legfrissebbel kezdve, platformtól függetlenül egyetlen egységes alakban. Ez a végpont csak olvas: értékelést az API-n keresztül nem lehet létrehozni, sem válaszolni rá.\n\nSzükséges scope: `reviews.readonly`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"reviews\": [\n    {\n      \"id\": \"rev_1\",\n      \"platform\": \"google\",\n      \"rating\": 5,\n      \"content\": \"Kiváló volt.\",\n      \"customerName\": \"Kiss Anna\",\n      \"contactId\": \"cnt_1\",\n      \"response\": \"\",\n      \"respondedAt\": null,\n      \"status\": \"pending\",\n      \"sentiment\": \"pozitiv\",\n      \"createdAt\": \"2026-07-30T18:25:00.000Z\"\n    }\n  ],\n  \"limit\": 50,\n  \"offset\": 0\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]}]},{"name":"webhooks","description":"A(z) webhooks domain végpontjai.","item":[{"name":"webhooks.create - Webhook-feliratkozás létrehozása","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/webhooks","host":["{{baseUrl}}"],"path":["webhooks"]},"body":{"mode":"raw","raw":"{\n  \"url\": \"https://example.com\",\n  \"events\": [\n    \"reservation.created\",\n    \"reservation.cancelled\"\n  ]\n}","options":{"raw":{"language":"json"}}},"description":"Az aláíró titkot az API kizárólag ebben a válaszban adja vissza; más API-végponton nem küldjük ki. Minden kézbesítés `X-Dynex-Signature` fejléce `sha256=` + HMAC-SHA256(titok, `<időbélyeg>.<nyers törzs>`) hexadecimálisan, ahol az `<időbélyeg>` az `X-Dynex-Timestamp` fejléc Unix-másodperc értéke - NEM a kézbesített törzs `timestamp` mezője, ami ISO-8601 alakú. Az aláírást mindig a nyers, feldolgozatlan törzsön ellenőrizd; mintakód a Webhookok fejezetben.\n\nSzükséges scope: `webhooks.manage`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 201\", function () {","    pm.response.to.have.status(201);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});","","if (pm.response.code < 300) {","    const data = pm.response.json();","    const value = data && data.webhook && data && data.webhook.id;","    if (value) pm.collectionVariables.set(\"webhookId\", value);","}"]}}],"response":[{"name":"Példa 201","status":"OK","code":201,"body":"{\n  \"webhook\": {\n    \"id\": \"whk_1\",\n    \"url\": \"https://partner.example.com/dynex\",\n    \"events\": [\n      \"reservation.created\",\n      \"reservation.cancelled\"\n    ],\n    \"headers\": {},\n    \"filters\": null,\n    \"description\": \"Foglalás-szinkron\",\n    \"isActive\": true,\n    \"consecutiveFailures\": 0,\n    \"lastSuccessAt\": \"2026-08-02T20:00:00.000Z\",\n    \"lastFailureAt\": null,\n    \"createdAt\": \"2026-07-15T08:00:00.000Z\"\n  },\n  \"secret\": \"whsec_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\"\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"webhooks.delete - Webhook-feliratkozás törlése","request":{"method":"DELETE","header":[],"url":{"raw":"{{baseUrl}}/webhooks/{{webhookId}}","host":["{{baseUrl}}"],"path":["webhooks","{{webhookId}}"]},"description":"Véglegesen törli a feliratkozást, és ezzel az aláíró titkot is - a törlés után erre a címre nem megy több kézbesítés. A feliratkozás kézbesítési előzménye és a még függőben lévő kézbesítései is elvesznek, egy újonnan létrehozott feliratkozás pedig új azonosítót és új titkot kap. Ha csak átmenetileg állítanád le, ne törölj: az API-ból kikapcsolni valóban nem lehet, de a Dynex felületén (Beállítások > API) a feliratkozás szüneteltethető, majd ugyanazzal az azonosítóval és titokkal visszakapcsolható.\n\nSzükséges scope: `webhooks.manage`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"deleted\": true,\n  \"id\": \"whk_1\"\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"webhooks.get - Egy webhook-feliratkozás lekérdezése","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/webhooks/{{webhookId}}","host":["{{baseUrl}}"],"path":["webhooks","{{webhookId}}"]},"description":"Egyetlen feliratkozás állapota azonosító alapján. Innen olvasható ki, hogy aktív-e, és hogy sikerülnek-e a kézbesítések. Az aláíró titkot ez a végpont sem adja vissza.\n\nSzükséges scope: `webhooks.manage`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"webhook\": {\n    \"id\": \"whk_1\",\n    \"url\": \"https://partner.example.com/dynex\",\n    \"events\": [\n      \"reservation.created\",\n      \"reservation.cancelled\"\n    ],\n    \"headers\": {},\n    \"filters\": null,\n    \"description\": \"Foglalás-szinkron\",\n    \"isActive\": true,\n    \"consecutiveFailures\": 0,\n    \"lastSuccessAt\": \"2026-08-02T20:00:00.000Z\",\n    \"lastFailureAt\": null,\n    \"createdAt\": \"2026-07-15T08:00:00.000Z\"\n  }\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"webhooks.list - Webhook-feliratkozások listázása","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/webhooks","host":["{{baseUrl}}"],"path":["webhooks"]},"description":"A fiók összes webhook-feliratkozása. Az aláíró titok itt nem szerepel a válaszban - azt az API kizárólag a létrehozáskor adja vissza. Ha elvesztetted, NE töröld a feliratkozást: a titok a Dynex felületén (Beállítások > API) bármikor megnézhető, és törlés nélkül újragenerálható, a feliratkozás azonosítójának és kézbesítési előzményének megtartásával. A `consecutiveFailures` és a `lastFailureAt` mezőből látod, ha a végpontod nem fogadja a kézbesítéseket.\n\nSzükséges scope: `webhooks.manage`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"webhooks\": [\n    {\n      \"id\": \"whk_1\",\n      \"url\": \"https://partner.example.com/dynex\",\n      \"events\": [\n        \"reservation.created\",\n        \"reservation.cancelled\"\n      ],\n      \"headers\": {},\n      \"filters\": null,\n      \"description\": \"Foglalás-szinkron\",\n      \"isActive\": true,\n      \"consecutiveFailures\": 0,\n      \"lastSuccessAt\": \"2026-08-02T20:00:00.000Z\",\n      \"lastFailureAt\": null,\n      \"createdAt\": \"2026-07-15T08:00:00.000Z\"\n    }\n  ]\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]}]},{"name":"conversions","description":"A(z) conversions domain végpontjai.","item":[{"name":"conversions.send - Konverziós esemény küldése (Meta CAPI / GA4 / TikTok)","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/conversions","host":["{{baseUrl}}"],"path":["conversions"]},"body":{"mode":"raw","raw":"{\n  \"eventName\": \"ViewContent\"\n}","options":{"raw":{"language":"json"}}},"description":"Szerveroldali konverzió a bérlő Követés-beállításai szerint. Alapból csak hirdetés-kattintásból érkező eseményt továbbítunk, és mindegyiket csak a saját platformjára: `fbclid` a Meta CAPI-ba, `gclid` a GA4-be, `ttclid` a TikTok Events API-ba (több azonosító együtt több platformra megy). A `force: true` vagy a bérlő „minden forgalom” beállítása ezt felülírja: ilyenkor kattintás-azonosító nélkül is, és minden bekötött platformra elmegy az esemény. Nem minden mezőt kap meg minden platform: a nevet, a települést és az irányítószámot csak a Meta CAPI, az e-mailt és a telefonszámot a Meta CAPI és a TikTok; a GA4 Measurement Protocol felé felhasználói adatot egyáltalán nem továbbítunk. A közvetlen azonosítókat - e-mail, telefonszám, kereszt- és vezetéknév, település, irányítószám - SHA-256 kivonatként küldjük tovább; a `clientIp` és a `userAgent` ezzel szemben kivonatolás nélkül, nyersen jut el a Metához és a TikTokhoz. Ezt vedd figyelembe a saját adatkezelési tájékoztatód elkészítésekor.\n\nSzükséges scope: `conversions.write`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 202\", function () {","    pm.response.to.have.status(202);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 202","status":"OK","code":202,"body":"{\n  \"accepted\": true,\n  \"eventId\": \"purchase_ord_123\"\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"conversions.tracking_config - Kliensoldali követő-konfig (GTM, Pixel ID-k) a saját oldalhoz","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/tracking-config","host":["{{baseUrl}}"],"path":["tracking-config"]},"description":"A saját weboldaladba építhető követő-azonosítók, hogy ne kelljen kézzel átmásolnod őket a Dynex beállításaiból. Csak PUBLIKUS azonosítókat ad vissza - a szerveroldali hozzáférési tokenek soha nem szerepelnek benne, ezért a VÁLASZ értékei nyugodtan kikerülhetnek a böngészőbe kiszolgált oldalra. Kikapcsolt követésnél minden azonosító `null` (az esemény-kapcsolók a beállított értéküket adják vissza ilyenkor is). A hívás a `conversions.write` scope-ot kéri, mert ugyanahhoz az integrációhoz tartozik, mint az esemény-küldés.\n\nSzükséges scope: `conversions.write`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"enabled\": true,\n  \"gtmContainerId\": \"GTM-XXXXXX\",\n  \"fbPixelId\": \"1234567890\",\n  \"googleMeasurementId\": \"G-XXXXXXX\",\n  \"tiktokPixelId\": null,\n  \"events\": {\n    \"viewContent\": true,\n    \"lead\": true,\n    \"purchase\": true\n  }\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]}]},{"name":"content","description":"A(z) content domain végpontjai.","item":[{"name":"content.authors - Blog-szerzők listázása","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/content/authors","host":["{{baseUrl}}"],"path":["content","authors"],"query":[{"key":"websiteId","value":"","description":"Csak ennek a weboldalnak a szerzői. A fiókhoz nem tartozó azonosítóra `422 unprocessable` a válasz, nem üres lista. Elhagyva a fiók összes weboldala.","disabled":true}]},"description":"A fiók blog-szerzői (név, arckép, bemutatkozás), lapozás nélkül. Tájékoztató lista: szerzőt létrehozni nem lehet, és a poszt `authorName` mezője sem köti a posztot ezekhez a szerzőkhöz.\n\nSzükséges scope: `content.readonly`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"authors\": [\n    {\n      \"id\": \"a81c3e5f-7b20-4d96-8e1a-5f3b9c0d2e74\",\n      \"name\": \"Nagy Péter\",\n      \"avatarUrl\": null,\n      \"bio\": \"A Kiskakas séfje.\"\n    }\n  ]\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"content.categories - Blog-kategóriák listázása poszt-számmal","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/content/categories","host":["{{baseUrl}}"],"path":["content","categories"],"query":[{"key":"websiteId","value":"","description":"Csak ennek a weboldalnak a kategóriái. A fiókhoz nem tartozó azonosítóra `422 unprocessable` a válasz, nem üres lista. Elhagyva a fiók összes weboldala.","disabled":true}]},"description":"A fiók blog-kategóriái a posztszámmal, lapozás nélkül. Poszt beküldésekor az innen kapott `slug` garantáltan meglévő kategóriára illeszkedik. Kategóriát létrehozni és törölni ezen az API-n nem lehet.\n\nSzükséges scope: `content.readonly`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"categories\": [\n    {\n      \"id\": \"c4a7e210-3b88-4f6d-9c01-7d2e5f8a1b44\",\n      \"name\": \"Hírek\",\n      \"slug\": \"hirek\",\n      \"description\": null,\n      \"postCount\": 12\n    },\n    {\n      \"id\": \"f0b2d845-6e19-4c73-a25f-91c8b3d7e206\",\n      \"name\": \"Receptek\",\n      \"slug\": \"receptek\",\n      \"description\": \"Séfünk havi receptajánlói.\",\n      \"postCount\": 5\n    }\n  ]\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"content.create - Blogposzt létrehozása","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"{{$guid}}"}],"url":{"raw":"{{baseUrl}}/content/posts","host":["{{baseUrl}}"],"path":["content","posts"]},"body":{"mode":"raw","raw":"{\n  \"title\": \"Őszi vadmenü indul a Kiskakasban\",\n  \"contentHtml\": \"<p>Szeptember 20-tól új, őszi vadmenüvel várjuk a vendégeinket.</p>\"\n}","options":{"raw":{"language":"json"}}},"description":"Új blogposztot hoz létre a fiók egyik weboldalán, azonnali mentéssel. Kötelező a `title`, és a `contentHtml` vagy a `rawHtml` mezőben a HTML törzs. A válasz a poszt azonosítóját, VÉGLEGES slugját, nyilvános címét és állapotát adja; a teljes alakot a `GET /content/posts/{id}` adja vissza. Módosító és törlő végpont nincs: egy hibásan beküldött posztot csak a Dynex felületén lehet javítani.\n\nSzükséges scope: `content.write`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 201\", function () {","    pm.response.to.have.status(201);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});","","if (pm.response.code < 300) {","    const data = pm.response.json();","    const value = data && data.post && data && data.post.id;","    if (value) pm.collectionVariables.set(\"blogPostId\", value);","}"]}}],"response":[{"name":"Példa 201","status":"OK","code":201,"body":"{\n  \"post\": {\n    \"id\": \"9b1f8a36-0c4d-4d1e-9a7f-2b5c7d8e3f10\",\n    \"url\": \"https://kiskakas-etterem.hu/blog/oszi-vadmenu-indul-a-kiskakasban\",\n    \"slug\": \"oszi-vadmenu-indul-a-kiskakasban\",\n    \"status\": \"published\"\n  }\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"content.get - Egy blogposzt lekérdezése teljes tartalommal","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/content/posts/{{blogPostId}}","host":["{{baseUrl}}"],"path":["content","posts","{{blogPostId}}"]},"description":"Egyetlen poszt teljes alakja: a lista mezőin felül a HTML törzs, a SEO-adatok, az olvasási idő és a `websiteId`. Más fiók posztjára ugyanúgy `404` a válasz, mint nem létezőre.\n\nSzükséges scope: `content.readonly`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"post\": {\n    \"id\": \"9b1f8a36-0c4d-4d1e-9a7f-2b5c7d8e3f10\",\n    \"title\": \"Őszi vadmenü indul a Kiskakasban\",\n    \"slug\": \"oszi-vadmenu-indul-a-kiskakasban\",\n    \"status\": \"published\",\n    \"excerpt\": \"Szeptember 20-tól vaddisznópörkölt, szarvasragu és sült gesztenyés desszert kerül az étlapra.\",\n    \"coverImageUrl\": \"https://storage.googleapis.com/dynex-app/tenants/tn_kiskakas/blog/covers/1757930400000_a1b2c3.jpg\",\n    \"authorName\": \"Nagy Péter\",\n    \"tags\": [\n      \"oszi-menu\",\n      \"vadetelek\"\n    ],\n    \"category\": {\n      \"id\": \"c4a7e210-3b88-4f6d-9c01-7d2e5f8a1b44\",\n      \"name\": \"Hírek\",\n      \"slug\": \"hirek\"\n    },\n    \"publishedAt\": \"2026-09-15T08:00:00.000Z\",\n    \"scheduledFor\": null,\n    \"url\": \"https://kiskakas-etterem.hu/blog/oszi-vadmenu-indul-a-kiskakasban\",\n    \"createdAt\": \"2026-09-14T16:42:11.000Z\",\n    \"updatedAt\": \"2026-09-15T08:00:00.000Z\",\n    \"websiteId\": \"3e5d9f77-1c2b-49a8-b0d6-8f4e2a6c1937\",\n    \"contentHtml\": \"<p>Szeptember 20-tól új, őszi vadmenüvel várjuk a vendégeinket.</p>\",\n    \"seo\": {\n      \"title\": \"Őszi vadmenü a Kiskakasban\",\n      \"description\": \"Vaddisznópörkölt, szarvasragu és gesztenyés desszert szeptember 20-tól.\"\n    },\n    \"readingTimeMinutes\": 2\n  }\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"content.list - Blogposztok listázása","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/content/posts","host":["{{baseUrl}}"],"path":["content","posts"],"query":[{"key":"status","value":"","description":"Csak az ilyen állapotú posztok. A `published` nem adja vissza a már megjelent, `scheduled` állapotú posztokat.","disabled":true},{"key":"category","value":"","description":"Kategória neve vagy slugja (azonosító nem). Nem létező kategóriára üres lista.","disabled":true},{"key":"tag","value":"","description":"Egyetlen címke, betű szerint pontos egyezéssel (a kis- és nagybetű számít).","disabled":true},{"key":"search","value":"","description":"Részlet-keresés a CÍMBEN, kis- és nagybetű-függetlenül. A törzsben nem keres, a `%` és `_` szó szerinti karakter.","disabled":true},{"key":"websiteId","value":"","description":"Csak ennek a weboldalnak a posztjai. A fiókhoz nem tartozó azonosítóra `422 unprocessable` a válasz, nem üres lista. Elhagyva a fiók összes weboldala.","disabled":true},{"key":"limit","value":"","description":"Találatok maximális száma (1-200, alapértelmezés 50; a tartományon kívüli érték a határra szorítódik, nem hibát ad)","disabled":true},{"key":"offset","value":"","description":"Hány találatot ugorjon át (a tartományon kívüli érték a határra szorítódik, nem hibát ad)","disabled":true}]},"description":"A fiók blogposztjainak lapozott listája minden állapotból, a legfrissebbel kezdve. A szűrők ÉS-kapcsolatban működnek, a `total` a szűrt találatok teljes száma. A HTML törzset a lista nem tartalmazza, ahhoz a `GET /content/posts/{id}` kell.\n\nSzükséges scope: `content.readonly`"},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"posts\": [\n    {\n      \"id\": \"9b1f8a36-0c4d-4d1e-9a7f-2b5c7d8e3f10\",\n      \"title\": \"Őszi vadmenü indul a Kiskakasban\",\n      \"slug\": \"oszi-vadmenu-indul-a-kiskakasban\",\n      \"status\": \"published\",\n      \"excerpt\": \"Szeptember 20-tól vaddisznópörkölt, szarvasragu és sült gesztenyés desszert kerül az étlapra.\",\n      \"coverImageUrl\": \"https://storage.googleapis.com/dynex-app/tenants/tn_kiskakas/blog/covers/1757930400000_a1b2c3.jpg\",\n      \"authorName\": \"Nagy Péter\",\n      \"tags\": [\n        \"oszi-menu\",\n        \"vadetelek\"\n      ],\n      \"category\": {\n        \"id\": \"c4a7e210-3b88-4f6d-9c01-7d2e5f8a1b44\",\n        \"name\": \"Hírek\",\n        \"slug\": \"hirek\"\n      },\n      \"publishedAt\": \"2026-09-15T08:00:00.000Z\",\n      \"scheduledFor\": null,\n      \"url\": \"https://kiskakas-etterem.hu/blog/oszi-vadmenu-indul-a-kiskakasban\",\n      \"createdAt\": \"2026-09-14T16:42:11.000Z\",\n      \"updatedAt\": \"2026-09-15T08:00:00.000Z\"\n    }\n  ],\n  \"total\": 37,\n  \"limit\": 50,\n  \"offset\": 0\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]}]},{"name":"blog","description":"A(z) blog domain végpontjai.","item":[{"name":"blog.authors - Blog-szerzők listázása","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrlV1}}/blog/authors","host":["{{baseUrlV1}}"],"path":["blog","authors"],"query":[{"key":"websiteId","value":"","description":"Csak ennek a weboldalnak a szerzői. A fiókhoz nem tartozó azonosítóra a válasz `422 unknown_website`. Elhagyva a fiók összes weboldalának szerzője visszajön. Az érték alakját a rendszer nem vizsgálja, csak azt, hogy a fiókodhoz tartozik-e: a hibatáblában felsorolt `400 validation_error` ezért ezen a végponton a gyakorlatban nem keletkezik.","disabled":true}]},"description":"A fiók újrafelhasználható blog-szerzői: név, arckép és bemutatkozás. Lapozás nincs, a végpont minden szerzőt visszaad egyszerre. A lista TÁJÉKOZTATÓ jellegű: szerzőt létrehozni ezen az API-n nem lehet, és a `POST /blog/posts` `authorName` mezője sem köti a posztot egyik itteni szerzőhöz sem - oda szabad szövegként kerül a név. Szerzőt a poszthoz kötni csak a Dynex felületén lehet. Kivezetés alatt: a v3-as utódja a `GET /api/v3/content/authors`, új integrációt arra építs.\n\nSzükséges scope: `content.readonly` (a v1 kulcson: `blog.read`)\n\nFelület: v1 (kivezetés alatt). A kérés a `{{baseUrlV1}}` változót használja (`/api/v1` előtag), a végpont 2027-02-03-ig szolgál ki. Sikeres válasz: `{ success: true, ... }` - a hasznos adat a `success` mező mellett, erőforrás-nevű kulcson. Hibaválasz: `{ success: false, error: { code, message } }` - nincs `details[]` mező."},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});","","pm.test(\"success: true boríték\", function () {","    pm.expect(pm.response.json().success).to.eql(true);","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"success\": true,\n  \"authors\": [\n    {\n      \"id\": \"a71c3e08-4d52-4b19-9f63-0e8a5c2d7b41\",\n      \"name\": \"Kovács Éva\",\n      \"avatarUrl\": \"https://storage.googleapis.com/dynex-app/tenants/tn_kiskakas/blog/authors/kovacs-eva.jpg\",\n      \"bio\": \"Séf, a Kiskakas konyhájának vezetője.\"\n    },\n    {\n      \"id\": \"b93f6a27-8c04-4e75-a1d8-53b7e9f0c612\",\n      \"name\": \"Nagy Péter\",\n      \"avatarUrl\": null,\n      \"bio\": null\n    }\n  ]\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"blog.categories - Blog-kategóriák listázása poszt-számmal","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrlV1}}/blog/categories","host":["{{baseUrlV1}}"],"path":["blog","categories"],"query":[{"key":"websiteId","value":"","description":"Csak ennek a weboldalnak a kategóriái. A fiókhoz nem tartozó azonosítóra a válasz `422 unknown_website`. Elhagyva a fiók összes weboldalának kategóriája visszajön. Az érték alakját a rendszer nem vizsgálja, csak azt, hogy a fiókodhoz tartozik-e: a hibatáblában felsorolt `400 validation_error` ezért ezen a végponton a gyakorlatban nem keletkezik.","disabled":true}]},"description":"A fiók blog-kategóriái, mindegyiknél a hozzá tartozó posztok számával. Lapozás nincs: a végpont MINDEN kategóriát visszaad egyszerre. Ez a lista a helyes forrása annak, hogy a poszt beküldésekor milyen `category` értéket küldj: az innen kapott `slug` érték garantáltan meglévő kategóriára illeszkedik, tehát nem hoz létre újat. Kategóriát létrehozni és törölni ezen az API-n nem lehet; új kategória a poszt beküldésekor, a `category` mező hatására keletkezik. Kivezetés alatt: a v3-as utódja a `GET /api/v3/content/categories`, új integrációt arra építs.\n\nSzükséges scope: `content.readonly` (a v1 kulcson: `blog.read`)\n\nFelület: v1 (kivezetés alatt). A kérés a `{{baseUrlV1}}` változót használja (`/api/v1` előtag), a végpont 2027-02-03-ig szolgál ki. Sikeres válasz: `{ success: true, ... }` - a hasznos adat a `success` mező mellett, erőforrás-nevű kulcson. Hibaválasz: `{ success: false, error: { code, message } }` - nincs `details[]` mező."},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});","","pm.test(\"success: true boríték\", function () {","    pm.expect(pm.response.json().success).to.eql(true);","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"success\": true,\n  \"categories\": [\n    {\n      \"id\": \"c4a7e210-3b88-4f6d-9c01-7d2e5f8a1b44\",\n      \"name\": \"Hírek\",\n      \"slug\": \"hirek\",\n      \"description\": null,\n      \"postCount\": 12\n    },\n    {\n      \"id\": \"f0b2d845-6e19-4c73-a25f-91c8b3d7e206\",\n      \"name\": \"Receptek\",\n      \"slug\": \"receptek\",\n      \"description\": \"Séfünk havi receptajánlói.\",\n      \"postCount\": 5\n    }\n  ]\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"blog.create - Blogposzt létrehozása","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrlV1}}/blog/posts","host":["{{baseUrlV1}}"],"path":["blog","posts"]},"body":{"mode":"raw","raw":"{\n  \"title\": \"Őszi vadmenü indul a Kiskakasban\",\n  \"contentHtml\": \"<p>Szeptember 20-tól új, őszi vadmenüvel várjuk a vendégeinket.</p>\"\n}","options":{"raw":{"language":"json"}}},"description":"Új blogposztot hoz létre a fiók egyik weboldalán. A mentés azonnali, jóváhagyási lépés nincs. Kötelező a `title`, és a `contentHtml` vagy a `rawHtml` mezőben a HTML törzs; minden más elhagyható. A válasz a poszt azonosítóját, a VÉGLEGES slugját, a nyilvános címét és az állapotát adja vissza - a poszt teljes alakját ezután a `GET /blog/posts/{id}` végponttal olvashatod vissza. FIGYELEM: ez az EGYETLEN író blog-végpont. Módosítani és törölni az API-n nem lehet, tehát egy elgépelt címet vagy rossz weboldalra küldött posztot csak a Dynex felületén lehet helyrehozni. Kivezetés alatt: a v3-as utódja a `POST /api/v3/content/posts`, új integrációt arra építs.\n\nSzükséges scope: `content.write` (a v1 kulcson: `blog.write`)\n\nFelület: v1 (kivezetés alatt). A kérés a `{{baseUrlV1}}` változót használja (`/api/v1` előtag), a végpont 2027-02-03-ig szolgál ki. Sikeres válasz: `{ success: true, ... }` - a hasznos adat a `success` mező mellett, erőforrás-nevű kulcson. Hibaválasz: `{ success: false, error: { code, message } }` - nincs `details[]` mező."},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 201\", function () {","    pm.response.to.have.status(201);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});","","pm.test(\"success: true boríték\", function () {","    pm.expect(pm.response.json().success).to.eql(true);","});","","if (pm.response.code < 300) {","    const data = pm.response.json();","    const value = data && data.post && data && data.post.id;","    if (value) pm.collectionVariables.set(\"blogPostId\", value);","}"]}}],"response":[{"name":"Példa 201","status":"OK","code":201,"body":"{\n  \"success\": true,\n  \"post\": {\n    \"id\": \"9b1f8a36-0c4d-4d1e-9a7f-2b5c7d8e3f10\",\n    \"url\": \"https://kiskakas-etterem.hu/blog/oszi-vadmenu-indul-a-kiskakasban\",\n    \"slug\": \"oszi-vadmenu-indul-a-kiskakasban\",\n    \"status\": \"published\"\n  }\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"blog.get - Egy blogposzt lekérdezése teljes tartalommal","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrlV1}}/blog/posts/{{blogPostId}}","host":["{{baseUrlV1}}"],"path":["blog","posts","{{blogPostId}}"]},"description":"Egyetlen poszt teljes alakja azonosító alapján: a lista mezőin felül a HTML törzs (`contentHtml`), a SEO-adatok, az olvasási idő és a `websiteId`. Ez az egyetlen végpont, amelyik a poszt tartalmát is kiadja, és ez az egyetlen, amelyik a poszt `websiteId` mezőjét visszaadja. Az `{id}` értéke a `POST /blog/posts` válaszának vagy a lista `id` mezőjének a másolata; a rendszer az alakját nem vizsgálja, tehát bármilyen szöveget elfogad, és minden fel nem ismert értékre `404` a válasz. Más fiók posztjára `404` a válasz, pontosan ugyanaz, mint egy nem létező azonosítóra - a kettő szándékosan megkülönböztethetetlen. Kivezetés alatt: a v3-as utódja a `GET /api/v3/content/posts/{id}`, új integrációt arra építs.\n\nSzükséges scope: `content.readonly` (a v1 kulcson: `blog.read`)\n\nFelület: v1 (kivezetés alatt). A kérés a `{{baseUrlV1}}` változót használja (`/api/v1` előtag), a végpont 2027-02-03-ig szolgál ki. Sikeres válasz: `{ success: true, ... }` - a hasznos adat a `success` mező mellett, erőforrás-nevű kulcson. Hibaválasz: `{ success: false, error: { code, message } }` - nincs `details[]` mező."},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});","","pm.test(\"success: true boríték\", function () {","    pm.expect(pm.response.json().success).to.eql(true);","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"success\": true,\n  \"post\": {\n    \"id\": \"9b1f8a36-0c4d-4d1e-9a7f-2b5c7d8e3f10\",\n    \"title\": \"Őszi vadmenü indul a Kiskakasban\",\n    \"slug\": \"oszi-vadmenu-indul-a-kiskakasban\",\n    \"status\": \"published\",\n    \"excerpt\": \"Szeptember 20-tól vaddisznópörkölt, szarvasragu és sült gesztenyés desszert kerül az étlapra.\",\n    \"coverImageUrl\": \"https://storage.googleapis.com/dynex-app/tenants/tn_kiskakas/blog/covers/1757930400000_a1b2c3.jpg\",\n    \"authorName\": \"Nagy Péter\",\n    \"tags\": [\n      \"oszi-menu\",\n      \"vadetelek\"\n    ],\n    \"category\": {\n      \"id\": \"c4a7e210-3b88-4f6d-9c01-7d2e5f8a1b44\",\n      \"name\": \"Hírek\",\n      \"slug\": \"hirek\"\n    },\n    \"publishedAt\": \"2026-09-15T08:00:00.000Z\",\n    \"scheduledFor\": null,\n    \"url\": \"https://kiskakas-etterem.hu/blog/oszi-vadmenu-indul-a-kiskakasban\",\n    \"createdAt\": \"2026-09-14T16:42:11.000Z\",\n    \"updatedAt\": \"2026-09-15T08:00:00.000Z\",\n    \"websiteId\": \"3e5d9f77-1c2b-49a8-b0d6-8f4e2a6c1937\",\n    \"contentHtml\": \"<p>Szeptember 20-tól új, őszi vadmenüvel várjuk a vendégeinket.</p><h2>A menüsor</h2><ul><li>Vaddisznópörkölt házi galuskával</li><li>Szarvasragu gesztenyés burgonyapürével</li></ul>\",\n    \"seo\": {\n      \"title\": \"Őszi vadmenü a Kiskakasban\",\n      \"description\": \"Vaddisznópörkölt, szarvasragu és gesztenyés desszert szeptember 20-tól.\"\n    },\n    \"readingTimeMinutes\": 2\n  }\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]},{"name":"blog.list - Blogposztok listázása","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrlV1}}/blog/posts","host":["{{baseUrlV1}}"],"path":["blog","posts"],"query":[{"key":"limit","value":"","description":"Hány poszt jöjjön vissza egy lapon. Alapértelmezés `20`, felső határ `100` - a nagyobb érték nem hibázik, csendben 100-ra szorul. A `0` érvényes, és üres listát ad a valós `total` mellett. Nem nem-negatív egész értékre (tizedes, negatív, szöveg) a válasz `400 validation_error`.","disabled":true},{"key":"offset","value":"","description":"Hány posztot ugorjon át a lista elejéről. Alapértelmezés `0`. Felső korlátja nincs: a találatok számán túli eltolás üres listát ad a valós `total` mellett, nem hibát. Nem nem-negatív egész értékre a válasz `400 validation_error`.","disabled":true},{"key":"status","value":"","description":"Csak az ilyen állapotú posztok. A három érték valamelyike, különben `400 validation_error` - a szélső szóközök itt sem vágódnak le, tehát a `?status=%20draft` is hibát ad. FIGYELEM: a `published` szűrő NEM a nyilvánosan látható posztokat adja vissza - a már megjelent, ütemezett posztok `scheduled` állapotúak maradnak. Az élő posztok teljes körének lekérdezéséhez a `published` találatokhoz vedd hozzá a múltbeli `scheduledFor` értékű `scheduled` posztokat.","disabled":true},{"key":"category","value":"","description":"Szűrés kategóriára, NÉV vagy SLUG alapján - kategória-azonosítóval nem működik. A párosítás ugyanaz, mint a poszt beküldésénél: két egyenrangú ág, az egyik a slugosított alakot veti össze a tárolt sluggal (kisbetűsítve, ékezet nélkül, a szélső szóközöket és az írásjeleket levágva), a másik a kisbetűs nevet a tárolt névvel (a szélső szóközöket itt is levágva, de ÉKEZET-érzékenyen). Nem létező kategóriára `200` a válasz, üres listával.","disabled":true},{"key":"tag","value":"","description":"Szűrés egyetlen címkére. Az egyezésnek BETŰ SZERINT pontosnak kell lennie: a kis- és nagybetű számít, és a szélső szóközök sem vágódnak le, ezért a `?tag=%20vegan` NEM ugyanaz, mint a `?tag=vegan`. Ez az egyetlen szűrő, ami a szóközöket így kezeli. Több címkére egyszerre nem lehet szűrni.","disabled":true},{"key":"search","value":"","description":"Keresés a poszt CÍMÉBEN, részlet-egyezéssel, a kis- és nagybetűt figyelmen kívül hagyva. A törzsre és a bevezetőre nem keres. A szélső szóközök levágódnak, tehát a `?search=%20vegan` ugyanazt adja, mint a `?search=vegan`, egy csupa szóközből álló érték (`?search=%20`) pedig úgy viselkedik, mintha meg sem adtad volna: a válasz az összes posztot hozza. A `%` és a `_` közönséges karakterként keresődik, nem helyettesítő jelként.","disabled":true},{"key":"websiteId","value":"","description":"Csak ennek a weboldalnak a posztjai. Az azonosítót a `GET /blog/posts/{id}` válaszának `websiteId` mezőjéből vagy a Dynex felületéről kapod - EBBEN a lista-válaszban nincs benne. A fiókhoz nem tartozó azonosítóra a válasz `422 unknown_website` - nem üres lista, tehát az elgépelt azonosító azonnal kiderül. Az érték alakját a rendszer nem vizsgálja, és a szóközöket sem vágja le róla.","disabled":true}]},"description":"A fiók blogposztjainak lapozott listája, minden állapotból (a piszkozatokat is beleértve), a legfrissebbel kezdve. A szűrők ÉS-kapcsolatban működnek. A válasz a `total` mezőben a SZŰRT találatok teljes számát adja meg, tehát a lapok száma ebből számolható. A posztok HTML törzsét ez a végpont MÉRETOKOKBÓL nem adja vissza: ahhoz hívd a `GET /blog/posts/{id}` végpontot. Kivezetés alatt: a v3-as utódja a `GET /api/v3/content/posts`, új integrációt arra építs.\n\nSzükséges scope: `content.readonly` (a v1 kulcson: `blog.read`)\n\nFelület: v1 (kivezetés alatt). A kérés a `{{baseUrlV1}}` változót használja (`/api/v1` előtag), a végpont 2027-02-03-ig szolgál ki. Sikeres válasz: `{ success: true, ... }` - a hasznos adat a `success` mező mellett, erőforrás-nevű kulcson. Hibaválasz: `{ success: false, error: { code, message } }` - nincs `details[]` mező."},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"státusz 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"JSON válasz\", function () {","    pm.response.to.be.json;","});","","pm.test(\"success: true boríték\", function () {","    pm.expect(pm.response.json().success).to.eql(true);","});"]}}],"response":[{"name":"Példa 200","status":"OK","code":200,"body":"{\n  \"success\": true,\n  \"total\": 37,\n  \"posts\": [\n    {\n      \"id\": \"9b1f8a36-0c4d-4d1e-9a7f-2b5c7d8e3f10\",\n      \"title\": \"Őszi vadmenü indul a Kiskakasban\",\n      \"slug\": \"oszi-vadmenu-indul-a-kiskakasban\",\n      \"status\": \"published\",\n      \"excerpt\": \"Szeptember 20-tól vaddisznópörkölt, szarvasragu és sült gesztenyés desszert kerül az étlapra.\",\n      \"coverImageUrl\": \"https://storage.googleapis.com/dynex-app/tenants/tn_kiskakas/blog/covers/1757930400000_a1b2c3.jpg\",\n      \"authorName\": \"Nagy Péter\",\n      \"tags\": [\n        \"oszi-menu\",\n        \"vadetelek\"\n      ],\n      \"category\": {\n        \"id\": \"c4a7e210-3b88-4f6d-9c01-7d2e5f8a1b44\",\n        \"name\": \"Hírek\",\n        \"slug\": \"hirek\"\n      },\n      \"publishedAt\": \"2026-09-15T08:00:00.000Z\",\n      \"scheduledFor\": null,\n      \"url\": \"https://kiskakas-etterem.hu/blog/oszi-vadmenu-indul-a-kiskakasban\",\n      \"createdAt\": \"2026-09-14T16:42:11.000Z\",\n      \"updatedAt\": \"2026-09-15T08:00:00.000Z\"\n    },\n    {\n      \"id\": \"2d0e7c91-5a13-4b8e-8f44-6c9a1e2b7d55\",\n      \"title\": \"Karácsonyi menüsor - előfoglalás indul\",\n      \"slug\": \"karacsonyi-menusor-elofoglalas-indul\",\n      \"status\": \"scheduled\",\n      \"excerpt\": null,\n      \"coverImageUrl\": null,\n      \"authorName\": null,\n      \"tags\": [],\n      \"category\": null,\n      \"publishedAt\": null,\n      \"scheduledFor\": \"2026-11-02T07:00:00.000Z\",\n      \"url\": \"https://kiskakas-etterem.hu/blog/karacsonyi-menusor-elofoglalas-indul\",\n      \"createdAt\": \"2026-09-12T11:05:47.000Z\",\n      \"updatedAt\": \"2026-09-12T11:05:47.000Z\"\n    }\n  ]\n}","_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}]}]}]}]}