Princípy a životný cyklus
Profil obchodu, hlavička UCP-Agent, vyjednávanie schopností, košík a checkout, stavy, peniaze, jazyky a odovzdanie cez continue_url.
Na tejto stránke
- Jeden obchod, jedna doména
- Ďalšie domény a primárna doména
- Ako rýchlo sa k vám dostane zmena obchodníka
- Profil obchodu
- Profil platformy a hlavička UCP-Agent
- Čo musí profil obsahovať
- Hlavička
- Ako si ho obchod stiahne
- Cache a rozpočty
- Keď sa profil nedá použiť
- Čo hlavička nerobí
- Vyjednávanie schopností
- Obálka ucp
- Keď schopnosť chýba
- Košík a checkout
- Keď sa nedá kúpiť žiadna položka
- Identifikátory
- Z košíka checkout
- Stavy checkoutu
- Čo je potrebné na pripravenosť
- Ako sa stav určuje
- Uzavretý checkout
- Košík nemá stav
- Zmena relácie
- Peniaze, súčty a daň
- Jazyk a mena
- Keď sa zmení sklad alebo cena
- Katalógový režim
- Platnosť a jej uplynutie
- Odovzdanie kupujúcemu
- Odkaz
- Čo sa stane, keď ho kupujúci otvorí
- Čo sa prenesie a čo nie
- Viacnásobné otvorenie odkazu
- Po odovzdaní je relácia zmrazená
- Prihlásený kupujúci a hosť
- Dokončenie objednávkou
- Kedy sa checkout stane dokončeným
- Čo odpoveď obsahuje
- Kedy objednávka checkout nedokončí
- Zisťovanie stavu
- Ako to celé do seba zapadá
Táto kapitola opisuje model, na ktorom stojí každé volanie UCP v obchode na Monokaide: ktorý obchod odpovedá, čo sľubuje jeho profil, ako sa predstaví vaša platforma, na čom sa obe strany dohodnú, ako sa správajú košík a checkout a ako nákup z API prejde do vlastnej pokladne obchodu. Presné polia nájdete v Referencii API, všetky kódy v Chybách a správach a opakovanie požiadaviek, súbežnosť a limity v kapitole Idempotencia, súbežnosť a limity.
Príklady používajú obchod https://shop.example.com a platformu, ktorej profil
je na adrese https://platform.example.com/.well-known/ucp.
Jeden obchod, jedna doména
Monokaido prevádzkuje veľa obchodov na tých istých serveroch. Požiadavka UCP
nájde svoj obchod podľa jedinej veci: podľa názvu hostiteľa, na ktorý bola
poslaná. Nie je tu žiadny API kľúč, účet ani id obchodu v ceste. Obchod určuje
hlavička Host, s ktorou požiadavka prišla.
Hostiteľ poskytuje UCP, iba kým platí každá z týchto podmienok:
| Podmienka | Kto ju nastavuje |
|---|---|
| Hostiteľ je vlastná doména obchodu s overeným DNS a aktívnym TLS certifikátom | obchodník v časti Vlastné domény |
| Obchodník pre obchod zapol Nákup cez AI agentov (UCP) | obchodník |
| Vstavaný obchod je zapnutý a kľúč obchodu je aktívny a neprekročil dátum platnosti | obchodník |
| Firma má zapnutý modul E-shop | predplatné obchodníka |
Ak niektorá neplatí, profil a každé volanie /ucp/v1 na danom hostiteľovi
odpovie 404 s telom
{"code":"not_found","content":"No UCP business on this host"} a stránka
continue_url odpovie 404 prázdnou stránkou HTML. Odpoveď je zámerne
rovnaká bez ohľadu na príčinu. Adresy Monokaida *.shop.monokaido.com UCP neposkytujú nikdy. Obchod,
ktorý má UCP zapnuté, ale jeho firma je deaktivovaná alebo zablokovaná pre
nezaplatené predplatné, odpovedá namiesto toho na každú požiadavku
503 service_unavailable s Retry-After: 60.
Cesty používajte presne tak, ako sú zverejnené: /.well-known/ucp (bez
lomky na konci) a /ucp/v1/… malými písmenami. Iný zápis môže skončiť na
webových stránkach obchodu namiesto API. Obyčajné http:// webový server
presmeruje na https:// kódom 301; volajte rovno https://.
Ďalšie domény a primárna doména
Obchod môže mať viac vlastných domén. Každá z nich, na ktorej sa UCP
poskytuje, odpovedá za ten istý obchod — rovnaký katalóg aj rovnaké košíky a checkouty: relácia
vytvorená na jednej doméne sa nájde aj na ostatných. Každá adresa, ktorú obchod
zverejní, však obsahuje jeho primárnu doménu: endpoint v profile,
každé continue_url, order.permalink_url, adresy produktov, adresy obrázkov
obchodu aj continue_url v chybových odpovediach. Ak sa na samotnej primárnej
doméne UCP neposkytuje (DNS nie je overené alebo chýba aktívny certifikát)
alebo žiadna doména nie je označená ako primárna, každá doména, na ktorej sa
UCP poskytuje, uvádza samu seba.
| Voláte | Dostanete späť |
|---|---|
https://shop.example.net/.well-known/ucp (ďalšia doména obchodu) | "endpoint": "https://shop.example.com/ucp/v1" |
POST https://shop.example.net/ucp/v1/carts | "continue_url": "https://shop.example.com/ucp/continue/…" |
Obchod objavte cez jeho profil, uložte si endpoint, ktorý zverejní, a každé
ďalšie volanie posielajte na tohto hostiteľa. Kupujúcemu odovzdajte presne to
continue_url, ktoré ste dostali.
Ako rýchlo sa k vám dostane zmena obchodníka
Zmena, ktorú obchodník uloží v administrácii, platí hneď: zapnutie či
vypnutie UCP, vypnutie obchodu alebo jeho kľúča, odobratie domény alebo jej
nastavenie ako primárnej. Rovnako hneď platí vypnutie modulu e-shop a
deaktivácia či zablokovanie firmy. Novo pridanú doménu API začne poskytovať
až vtedy, keď má overené DNS a aktívny certifikát, a odvtedy do 30 sekúnd;
aj uplynutie platnosti kľúča sa prejaví najneskôr do 30 sekúnd. Vaša
kópia profilu obchodu môže byť až päť minút stará
(Cache-Control: public, max-age=300), takže ešte niekoľko minút po vypnutí
dostávate spomínaný 404. Odpoveď 404 not_found na profil chápte ako „tento
obchod teraz UCP neposkytuje“.
Profil obchodu
GET /.well-known/ucp na doméne obchodu vráti profil obchodu (business
profile): obchod opísaný jazykom protokolu. Nepotrebuje hlavičku UCP-Agent
ani žiadnu inú, nikdy nepresmerováva, odpovedá s
Cache-Control: public, max-age=300 a počíta sa do limitu čítaní (600
požiadaviek za minútu z jednej IP adresy).
{
"ucp": {
"version": "2026-04-08",
"services": {
"dev.ucp.shopping": [
{
"version": "2026-04-08",
"spec": "https://ucp.dev/2026-04-08/specification/overview",
"transport": "rest",
"endpoint": "https://shop.example.com/ucp/v1",
"schema": "https://ucp.dev/2026-04-08/services/shopping/rest.openapi.json"
}
]
},
"capabilities": {
"dev.ucp.shopping.catalog.search": [
{
"version": "2026-04-08",
"spec": "https://ucp.dev/2026-04-08/specification/catalog/search",
"schema": "https://ucp.dev/2026-04-08/schemas/shopping/catalog_search.json"
}
],
"dev.ucp.shopping.catalog.lookup": [
{
"version": "2026-04-08",
"spec": "https://ucp.dev/2026-04-08/specification/catalog/lookup",
"schema": "https://ucp.dev/2026-04-08/schemas/shopping/catalog_lookup.json"
}
],
"dev.ucp.shopping.cart": [
{
"version": "2026-04-08",
"spec": "https://ucp.dev/2026-04-08/specification/cart",
"schema": "https://ucp.dev/2026-04-08/schemas/shopping/cart.json"
}
],
"dev.ucp.shopping.checkout": [
{
"version": "2026-04-08",
"spec": "https://ucp.dev/2026-04-08/specification/checkout",
"schema": "https://ucp.dev/2026-04-08/schemas/shopping/checkout.json"
}
],
"dev.ucp.shopping.fulfillment": [
{
"version": "2026-04-08",
"spec": "https://ucp.dev/2026-04-08/specification/fulfillment",
"schema": "https://ucp.dev/2026-04-08/schemas/shopping/fulfillment.json",
"extends": "dev.ucp.shopping.checkout"
}
],
"dev.ucp.shopping.discount": [
{
"version": "2026-04-08",
"spec": "https://ucp.dev/2026-04-08/specification/discount",
"schema": "https://ucp.dev/2026-04-08/schemas/shopping/discount.json",
"extends": [
"dev.ucp.shopping.checkout",
"dev.ucp.shopping.cart"
]
}
]
},
"payment_handlers": {}
}
}GET https://shop.example.com/.well-known/ucp for a shop whose primary domain is shop.example.com, not in catalog mode.
| Kľúč | Hodnota | Na čo slúži |
|---|---|---|
ucp.version | vždy "2026-04-08" | Verzia protokolu, ktorou obchod hovorí. Profil vašej platformy musí uvádzať tú istú. |
ucp.services | jeden kľúč dev.ucp.shopping s presne jednou položkou | Nákupná služba. Väzba MCP, A2A ani embedded neexistuje. |
….transport | "rest" | Jediný transport. |
….endpoint | https://<primárna doména>/ucp/v1 | Základ každého volania API. |
….version | "2026-04-08" | Verzia väzby. |
….spec, ….schema | https://ucp.dev/2026-04-08/specification/overview, https://ucp.dev/2026-04-08/services/shopping/rest.openapi.json | Oficiálna špecifikácia a REST schéma. Presné správanie Monokaida opisuje dokument OpenAPI tohto manuálu. |
ucp.capabilities | názov schopnosti → pole s jedným {version, spec, schema, extends?} | Čo obchod práve ponúka: šesť schopností, v katalógovom režime dve. |
ucp.payment_handlers | vždy {} | Cez UCP sa nič neplatí: kupujúci platí v obchode. |
V profile nie sú: supported_versions (existuje jediná verzia),
signing_keys (Monokaido neposiela webhooky a nič nepodpisuje) ani názov či
logo obchodu. Medzi obchodmi sa líši iba hostiteľ v endpoint a v
katalógovom režime kratší zoznam schopností. Profil sa môže zmeniť, keď
obchodník zmení obchod, preto si ho po uplynutí platnosti kópie načítajte
znova a nedržte ho naveky.
Profil platformy a hlavička UCP-Agent
Každé volanie pod /ucp/v1 uvádza v hlavičke UCP-Agent profil vašej
platformy — JSON dokument, ktorý hostujete vy:
UCP-Agent: profile="https://platform.example.com/.well-known/ucp"
Obchod si dokument stiahne, overí verziu protokolu a schopnosti, ktoré
dokument uvádza, porovná so svojimi. Profil obchodu a cesty continue_url túto
hlavičku nikdy nečítajú.
Čo musí profil obsahovať
Profil, ktorý odomkne všetko, čo obchod môže ponúknuť:
{
"ucp": {
"version": "2026-04-08",
"capabilities": {
"dev.ucp.shopping.catalog.search": [{ "version": "2026-04-08" }],
"dev.ucp.shopping.catalog.lookup": [{ "version": "2026-04-08" }],
"dev.ucp.shopping.cart": [{ "version": "2026-04-08" }],
"dev.ucp.shopping.checkout": [{ "version": "2026-04-08" }],
"dev.ucp.shopping.fulfillment": [{ "version": "2026-04-08" }],
"dev.ucp.shopping.discount": [{ "version": "2026-04-08" }]
}
}
}
| Časť | Pravidlo |
|---|---|
| Dokument | JSON objekt s objektom ucp. |
ucp.version | Reťazec v tvare YYYY-MM-DD. Aby obchod odpovedal, musí byť presne 2026-04-08. |
ucp.capabilities | Nepovinné. Názov schopnosti → pole { "version": "YYYY-MM-DD" }. Názvy sa píšu malými písmenami a majú aspoň jednu bodku (dev.ucp.shopping.cart). Pri každom názve sa číta prvých 20 položiek; položka bez platného version sa zahodí. |
| Všetko ostatné | Ignoruje sa — services, payment_handlers, podpisové kľúče, spec, schema aj vaše vlastné extends. |
Profil bez ucp.capabilities je platný, ale nič neodomkne: každá operácia
potom odpovie capabilities_incompatible.
Hlavička
Hlavička je malá podmnožina slovníka (dictionary) podľa RFC 8941, najviac 4096 znakov:
- Člen
profilemusí byť reťazec v úvodzovkách,profile="https://…". Zápis bez úvodzoviekprofile=https://…sa odmietne. - Kľúče sa píšu malými písmenami (
Profile=sa odmietne). Ostatné členy aj;parametresa prijmú a ignorujú. - Reťazec smie obsahovať iba tlačiteľné znaky ASCII a escape sekvencie
\"a\\. - Keď sa
profileobjaví dvakrát, platí posledný. Hlavička, ktorú sa na ktoromkoľvek mieste nepodarí rozobrať, sa ignoruje celá.
Adresa musí začínať https://, mať najviac 1000 znakov a nesmie obsahovať
medzery ani meno a heslo. Prijme sa akýkoľvek port, cesta aj query string:
cesta /.well-known/ucp zo špecifikácie sa nevynucuje, hoci je pre dokument
prirodzeným miestom. Hlavička, ktorá niektoré z pravidiel poruší, dostane
odpoveď 400 invalid_profile_url.
Ako si ho obchod stiahne
| Hľadisko | Správanie |
|---|---|
| Požiadavka | GET s Accept: application/json a User-Agent: Monokaido-UCP/1.0 (+https://monokaido.com). HTTP klient pošle aj Host a Connection: close; inú hlavičku neposiela. |
| Presmerovania | Nesledujú sa: presmerovanie znamená zlyhanie. |
| Stav | Platí iba 200. Akýkoľvek iný stav vrátane 304 je zlyhanie. |
| Veľkosť a čas | Najviac 256 KiB; 3 s bez dát, spolu 5 s (DNS, spojenie aj telo). |
| Adresa | Hostiteľ sa musí preložiť na adresu mimo rozsahov uvedených nižšie. Adresa sa preloží raz a spojenie sa na ňu pripne. |
| Telo | Číta sa ako JSON v UTF-8. Content-Type sa nekontroluje. |
Obchod odmietne hostiteľa profilu, ktorý sa preloží na adresu z týchto rozsahov:
- IPv4:
0.0.0.0/8,10.0.0.0/8,100.64.0.0/10(carrier-grade NAT),127.0.0.0/8,169.254.0.0/16,172.16.0.0/12,192.168.0.0/16,198.18.0.0/15a všetko od224.0.0.0vyššie (multicast a rezervované adresy). - IPv6:
::/96(nešpecifikovaná adresa, loopback a adresy kompatibilné s IPv4),fe80::/10,fec0::/10,fc00::/7,ff00::/8a prefixy NAT6464:ff9b::/96a64:ff9b:1::/48. Adresa IPv4 mapovaná do IPv6 (::ffff:0:0/96) sa posudzuje podľa adresy IPv4, ktorú obsahuje.
Každá iná adresa sa prijme.
Dokument posielajte ako obyčajný, nekomprimovaný JSON v UTF-8 bez BOM: obchod
neposiela Accept-Encoding a telo spracuje tak, ako príde.
Cache a rozpočty
- Stiahnutý profil sa uloží na čas podľa
max-agez jehoCache-Control, obmedzený na 60 sekúnd až 1 hodinu; bez neho na 5 minút.no-store,no-cache,privateas-maxagesa ignorujú. - Po uplynutí tohto času sa uložená kópia používa ešte najviac hodinu, kým na pozadí beží jediné obnovenie. Neúspešné obnovenie ponechá starú kópiu.
- Neúspešné stiahnutie si obchod pamätá 60 sekúnd: počas nich odpovedá tou istou chybou bez ďalšieho sťahovania.
- Profil s inou verziou protokolu sa ukladá ako každý platný. Keď verziu
opravíte, obchod to uvidí po uplynutí platnosti svojej kópie — podľa vášho
max-age, najviac do hodiny. - Kľúčom cache je celý reťazec adresy vrátane query stringu a cache drží server Monokaida, nie každý obchod zvlášť.
- Sťahovanie profilov, ktoré server ešte nepozná, má rozpočet: 5 nových adries
profilu za minútu na klienta (jedna IPv4 adresa alebo jedna IPv6 /64) a
spolu 60 za minútu. Nad rozpočet obchod odpovie
503 service_unavailablesRetry-After. Už známy profil na rozpočet nikdy nečaká.
Keď sa profil nedá použiť
| HTTP | code | Kedy | Čo urobiť |
|---|---|---|---|
| 400 | invalid_profile_url | Hlavička chýba alebo sa nedá rozobrať, prípadne adresa porušuje pravidlo. | Opravte hlavičku. Opakovanie bez zmeny neuspeje. |
| 424 | profile_unreachable | DNS, spojenie, TLS, vypršaný časový limit, presmerovanie, iný stav ako 200, viac ako 256 KiB alebo súkromná adresa. | Opravte hosting. Zlyhanie sa pamätá 60 s. |
| 422 | profile_malformed | Telo nie je JSON alebo nemá ucp.version v tvare YYYY-MM-DD. | Opravte dokument. Pamätá sa 60 s. |
| 422 | version_unsupported | Platný profil inej verzie protokolu. | Uveďte 2026-04-08. |
| 503 | service_unavailable | Rozpočet na nové profily je minutý. | Počkajte toľko, koľko udáva Retry-After. |
Každá z týchto odpovedí nesie continue_url na úvodnú stránku obchodu.
Kontroly prebiehajú v tomto poradí: najprv obchod (neznámy hostiteľ odpovie 404 aj
bez hlavičky), potom hlavička a stiahnutie profilu, potom verzia a nakoniec
vyjednávanie.
Čo hlavička nerobí
Hlavička vašu platformu identifikuje, ale neoveruje. Monokaido nekontroluje
žiadny podpis, kľúč ani certifikát, takže ktokoľvek môže uviesť akúkoľvek
adresu profilu. Hodnoty Idempotency-Key sú viazané na adresu profilu, relácie
však nie: k relácii stačí jej id, preto ho držte v tajnosti. Viac v kapitole
Bezpečnosť a ochrana údajov.
Vyjednávanie schopností
Na každú požiadavku sa odpovedá tým, čo podporujú obe strany. Obchod uvádza svoje schopnosti (capabilities) v profile obchodu, vy svoje v profile platformy a pri každej požiadavke sa urobí ich prienik.
| Schopnosť | Druh | Čo odomkne |
|---|---|---|
dev.ucp.shopping.catalog.search | koreňová | POST /ucp/v1/catalog/search |
dev.ucp.shopping.catalog.lookup | koreňová | POST /ucp/v1/catalog/lookup a POST /ucp/v1/catalog/product |
dev.ucp.shopping.cart | koreňová | Všetky cesty /ucp/v1/carts a cart_id pri vytváraní checkoutu |
dev.ucp.shopping.checkout | koreňová | Všetky cesty /ucp/v1/checkout-sessions |
dev.ucp.shopping.fulfillment | rozšírenie checkoutu | fulfillment checkoutu: adresu, spôsoby dopravy a ich ceny |
dev.ucp.shopping.discount | rozšírenie checkoutu aj košíka | discounts košíka a checkoutu: zľavové kódy |
Vyjednávanie postupuje takto:
- Verzia.
ucp.versionvášho profilu sa musí ako reťazec rovnať2026-04-08. Čokoľvek iné, staršie aj novšie, skončí chybou422 version_unsupportedskôr, ako sa spustí čokoľvek ďalšie. - Prienik. Schopnosť obchodu je aktívna, keď ju váš profil uvádza —
presne, s rozlišovaním veľkosti písmen — vo verzii, ktorú uvádzajú obe
strany. Vyhrá najvyššia spoločná verzia; dnes je to vždy
2026-04-08. - Orezanie. Rozšírenie zostane aktívne, iba kým je aktívny aspoň jeden
z jeho rodičov, ako ich uvádza obchod; opakuje sa to, kým sa nič nezmení.
dev.ucp.shopping.discountvydrží aj so samotným košíkom,dev.ucp.shopping.fulfillmentpotrebuje checkout. Vaše vlastnéextendsnemá vplyv. - Zvyšok. Schopnosti, ktoré uvádza iba váš profil (napríklad vlastné
názvy
com.example.…), sa ignorujú.
Výsledok vyjednávania sa nikde neukladá. Pri každej požiadavke sa vyjednáva znova s kópiou vášho profilu, ktorú obchod práve má.
Obálka ucp
Každá JSON odpoveď okrem chyby protokolu obsahuje objekt ucp:
| Kľúč | Kedy je prítomný |
|---|---|
version | Vždy: "2026-04-08". |
status | "error" iba vtedy, keď sa nedal vrátiť žiadny zdroj (obchodná chyba). Inak chýba — jeho absenciu čítajte ako úspech. |
capabilities | Vždy. Koreňová schopnosť operácie a každé jej vyjednané rozšírenie, každé ako [{ "version": "2026-04-08" }]; v odpovedi capabilities_incompatible je to {}. |
payment_handlers | {} v odpovediach checkoutu, ktoré nie sú chybou. |
Poradie kľúčov v JSON objekte nemá žiadny význam. Odpovede zostavené z
uložených údajov — zápis zopakovaný s jeho Idempotency-Key, uzavretý
checkout, relácia po odovzdaní — prichádzajú s kľúčmi v poradí PostgreSQL
JSONB (najprv kratšie kľúče, potom abecedne), takže ani ucp nemusí byť
prvý. Každú odpoveď čítajte podľa kľúčov.
S profilom, ktorý uvádza všetkých šesť schopností:
| Operácia | ucp.capabilities obsahuje |
|---|---|
| Vyhľadávanie v katalógu | dev.ucp.shopping.catalog.search |
| Vyhľadanie podľa identifikátorov (lookup), detail produktu | dev.ucp.shopping.catalog.lookup |
| Všetky cesty košíka | dev.ucp.shopping.cart, dev.ucp.shopping.discount |
| Všetky cesty checkoutu | dev.ucp.shopping.checkout, dev.ucp.shopping.fulfillment, dev.ucp.shopping.discount |
Rozšírenie, ktoré ste nevyjednali, v zozname chýba. Zápis zopakovaný s tým
istým Idempotency-Key vráti obálku uloženú s prvou odpoveďou.
Keď schopnosť chýba
Koreňová schopnosť operácie. Odpoveď je HTTP 200 s
ucp.status: "error", ucp.capabilities: {}, správou
capabilities_incompatible a continue_url na úvodnú stránku obchodu. Nič sa
nevykoná: telo sa nekontroluje a žiadny Idempotency-Key sa nepoužije. Rovnako
odpovedá každé volanie košíka a checkoutu v obchode v katalógovom režime.
{
"ucp": {
"version": "2026-04-08",
"status": "error",
"capabilities": {}
},
"messages": [
{
"type": "error",
"code": "capabilities_incompatible",
"content": "The platform and this business share no version of the capability this operation needs",
"severity": "unrecoverable"
}
],
"continue_url": "https://shop.example.com/"
}Any operation whose root capability your profile does not declare at 2026-04-08 — e.g. a cart call when the profile lists only the catalog capabilities, or any cart / checkout call on a shop in catalog mode. Nothing runs, no Idempotency-Key is used.
Rozšírenie. Jeho polia sa ignorujú bez kontroly a v odpovedi chýba jeho objekt:
- Bez
dev.ucp.shopping.fulfillmentcheckout nemáfulfillment, v súčtoch nemá dopravu a na pripravenosť nepotrebuje adresu. Dopravu si kupujúci vyberie v obchode. - Bez
dev.ucp.shopping.discountkošík ani checkout nemádiscounts, poslané kódy sa ignorujú a kód, ktorý už v relácii bol, sa pri najbližšomPUTodstráni — súčty potom žiadnu zľavu neukazujú.
Ak zámerne nechcete menej, uveďte všetkých šesť schopností vo verzii
2026-04-08.
Košík a checkout
UCP má dva druhy relácie. Obe nacení obchod cez vlastný košík podľa svojich cien, DPH, prirážok, skladu a pravidiel zliav — podľa tých istých pravidiel ako na webe.
| Košík | Checkout | |
|---|---|---|
| Koreňová schopnosť | dev.ucp.shopping.cart | dev.ucp.shopping.checkout |
| Cesty | POST /carts, GET a PUT /carts/{id}, POST /carts/{id}/cancel | POST /checkout-sessions, GET a PUT /checkout-sessions/{id}, POST …/{id}/complete, POST …/{id}/cancel |
| Obsahuje | položky, kupujúceho, kontext, zľavové kódy | to isté a navyše dopravu, stav, právne odkazy a po objednaní objednávku |
Pole status | nie je | incomplete, requires_escalation, completed, canceled |
| Doprava | nikdy sa nenacení | nacení sa s rozšírením fulfillment |
PUT | line_items povinné, zakaždým celý zoznam | line_items nepovinné |
| Platnosť | 7 dní od posledného vytvorenia alebo PUT | 24 hodín od posledného vytvorenia alebo PUT |
| Po uplynutí | každé volanie odpovie not_found | canceled |
continue_url | v každej odpovedi; otvorí košík obchodu (alebo otvorený checkout košíka) | kým je otvorený; otvorí pokladňu obchodu |
| Dokončí ho objednávka kupujúceho | nikdy | áno |
Košík použite na zbieranie položiek, kým neviete, kto bude kupovať, alebo
keď chcete kupujúcemu odovzdať nákup tak, ako je. Checkout použite, keď
máte e-mail kupujúceho a chcete dopravu a konečné súčty — a vždy, keď chcete
zistiť, či nasledovala objednávka, pretože stav completed môže dosiahnuť iba checkout.
Košík nie je podmienkou: checkout môžete vytvoriť rovno z line_items.
Keď sa nedá kúpiť žiadna položka
Vytvorenie — košíka, checkoutu z line_items alebo checkoutu z košíka —, pri
ktorom zlyhajú všetky položky, nevytvorí žiadnu reláciu. Odpoveď je HTTP 200
s ucp.status: "error", bez id a s jedinou správou so závažnosťou
unrecoverable: out_of_stock, ak bola každá správa požiadavky
out_of_stock, inak item_unavailable. Jej continue_url vedie na úvodnú
stránku obchodu. Prázdne line_items takým zlyhaním nie je: vytvorí košík bez
položiek alebo checkout, ktorý zostane incomplete, kým položky nedostane.
Identifikátory
| Identifikátor | Formát | Poznámka |
|---|---|---|
id relácie | UUID v4 malými písmenami | Jediný prístupový údaj k relácii. Na id v ceste, ktoré nie je UUID, obchod odpovie not_found. |
line_items[].id | UUID | Položka obchodu. Nemení sa, kým položka existuje; po zmene jazyka je nové a v checkoute vytvorenom z košíka je iné. |
line_items[].item.id | UUID variantu | Posielajte id variantu. Id produktu sa prijme, zmení sa však na ten aktívny variant produktu, ktorý vznikol najskôr — nemusí to byť odporúčaný, dostupný ani nacenený variant, ktorý ukazuje vyhľadávanie, lookup a detail produktu — a odpoveď potom ukazuje id tohto variantu. Akýkoľvek iný reťazec, napríklad SKU, aj id produktu, ktorý firma nepredáva, vedie k item_unavailable. |
id možnosti dopravy | UUID | Spôsob dopravy obchodu. |
| Id spôsobu, skupiny a cieľa doručenia | "shipping", "default", "destination" | Konštanty. |
Položky v odpovedi prichádzajú v poradí obchodu, nie vo vašom: párujte ich
podľa item.id, nikdy podľa pozície. path správy, napríklad
$.line_items[1], ukazuje do odpovede, v ktorej prišla.
O svojom tovare toho položka povie málo:
item.titleje názov produktu v jazyku relácie — nikdy nie názov variantu. Dve položky jedného produktu (bicykel v modrej M a v modrej L) sa volajú rovnako. Variant, ktorý ste vybrali — jehotitle,optionsaskuz katalógu —, si uchovajte podľaitem.idalebo id dohľadajte cezPOST /ucp/v1/catalog/lookup({"ids": [item.id, …]}), skôr než košík ukážete kupujúcemu.item.idsa overuje voči produktom firmy, nie voči katalógu tohto obchodu. Položka sa prijme pre každý aktívny variant publikovaného produktu firmy; vylučovacie filtre a blokované kategórie obchodu, ktoré produkty skrývajú vo vyhľadávaní a v lookupe, sa na ňu neuplatnia. Používajte iba id variantov, ktoré ste dostali z katalógu tohto obchodu: id uložené z iného obchodu tej istej firmy sa tu môže prijať.quantityaitem.pricepočítajú jednotku, ktorú obchod predáva. Pri tovare predávanom v baleniach (napríklad krabica podlahových dosiek) je to jedno balenie. UCP obsah balenia nezverejňuje, takže množstvo v štvorcových metroch cez UCP na balenia neprepočítate.
Z košíka checkout
POST /ucp/v1/checkout-sessions s {"cart_id": "<id košíka>"} urobí z košíka
checkout. cart_id sa uplatní, iba keď je vyjednaná schopnosť košíka; inak je
požiadavka priamym vytvorením a potrebuje line_items.
| Pole checkoutu | Pochádza z |
|---|---|
| Položky | Aktuálne položky košíka, do checkoutu pridané nanovo: skontroluje sa sklad a platia aktuálne ceny obchodu, takže odpoveď môže niesť správy k položkám. line_items v požiadavke sa ignoruje. |
| Kupujúci | Košík. buyer v požiadavke sa skontroluje, ale nepoužije. |
| Kontext a jazyk | Košík. context v požiadavke sa skontroluje, ale nepoužije. |
Doprava (fulfillment) | Požiadavka. |
| Zľavové kódy | discounts.codes z požiadavky, ak je vyjednané rozšírenie discount a kódy sú poslané; inak kódy košíka. |
- K jednému košíku jeden otvorený checkout. Na opakovaný prevod košíka
obchod odpovie otvoreným checkoutom s HTTP 200 a z novej požiadavky sa nepoužije
nič: checkout meňte cez
PUT. - Otvorený checkout košíka, ktorému uplynula platnosť, sa najprv zruší a
vytvorí sa nový (
201). - Košík, ktorý si kupujúci už odniesol do obchodu (alebo ktorého checkout si
odniesol), sa odmietne s
200,ucp.status: "error"a správouhanded_off;continue_urlodpovede vedie na stránku košíka obchodu. Ak má košík ešte otvorený checkout, obchod namiesto toho odpovie týmto checkoutom. - Na neznáme, zrušené alebo vypršané
cart_idobchod odpovie200 not_founds textomCheckout session not found. - Checkout má vlastné položky s novými id. Košík zostane, aký bol, a jeho neskoršie zmeny sa do checkoutu nedostanú: po prevode pracujte s checkoutom.
Stavy checkoutu
| Z | Do | Kedy |
|---|---|---|
| (nový) | incomplete | Vytvorenie, keď ešte niečo chýba — položka, e-mail kupujúceho alebo s rozšírením fulfillment adresa či spôsob dopravy — alebo keď odpoveď obsahuje chybu položky (položku, ktorú obchod nemohol pridať). |
| (nový) | requires_escalation | To isté volanie, keď nič nechýba. |
incomplete | requires_escalation | PUT, ktorý doplní, čo chýbalo. Aj GET a POST …/complete stav znova odvodia z aktuálneho košíka. |
requires_escalation | incomplete | PUT, po ktorom niektorá požiadavka nie je splnená; rovnako ho môže vrátiť GET alebo POST …/complete, ktoré stav odvodia znova. |
incompleterequires_escalation | completed | Kupujúci otvoril continue_url a objednávka z obchodu, ktorá z toho košíka vznikla, obsahuje aspoň jednu položku z relácie. Agent to uvidí pri ďalšom čítaní. POST …/complete checkout nikdy nedokončí. |
incompleterequires_escalation | canceled | POST …/cancel alebo uplynutie platnosti: 24 hodín od vytvorenia alebo posledného PUT. Zruší ho najbližšia požiadavka, ktorá sa relácie dotkne. |
completedcanceled | — | Konečné stavy. Neskorší PUT, POST …/complete či POST …/cancel vráti reláciu bez zmeny; continue_url už nefunguje. |
Keď kupujúci continue_url otvorí a položky sa presunú do jeho košíka, PUT agenta už reláciu nemení — vráti posledný stav s upozornením handed_off.
| Stav | Význam | continue_url | Váš ďalší krok |
|---|---|---|---|
incomplete | Aspoň jedna správa je error so závažnosťou recoverable. | áno | PUT toho, čo si správy pýtajú. |
requires_escalation | Nechýba nič, čo môžete dodať vy. Obsahuje správu payment_required. | áno | Odovzdajte continue_url kupujúcemu. |
completed | Kupujúci v obchode objednal z košíka, ktorý naplnilo odovzdanie. order je vyplnené. | nie | Prestaňte stav zisťovať; ukážte objednávku. |
canceled | Zrušený cez POST …/cancel alebo vypršaný. | nie | Ak chce kupujúci stále nakúpiť, začnite nový checkout. |
Stavy ready_for_complete a complete_in_progress zo špecifikácie sa nikdy
neobjavia: API samo checkout nikdy nedokončí.
Čo je potrebné na pripravenosť
| Požiadavka | Bez fulfillment | S fulfillment | Správa, kým chýba |
|---|---|---|---|
| Aspoň jedna položka | povinné | povinné | missing na $.line_items |
Platný buyer.email | povinné | povinné | missing na $.buyer.email, aj pri adrese, ktorá nie je platným e-mailom |
| Cieľ doručenia | — | povinné | missing na $.fulfillment.methods[0].destinations |
V ňom street_address, address_locality, postal_code a address_country | — | povinné | invalid_address |
| Obchod na adresu doručuje | — | povinné | address_undeliverable |
| Vybraná možnosť spomedzi ponúkaných | — | povinné, kým nejaké možnosti existujú | missing alebo invalid_option pre možnosť, ktorá sa už neponúka |
| Žiadna chyba položky v tejto odpovedi | povinné | povinné | item_unavailable, out_of_stock, vat_mix_not_allowed |
| Meno, telefón | nepovinné | nepovinné | — |
| Výdajné miesto (Packeta) | — | nepovinné | pickup_point_required so závažnosťou requires_buyer_input; neblokuje |
Pripravený checkout má stav requires_escalation. Vždy nesie payment_required
(závažnosť requires_buyer_input) a continue_url:
{
"ucp": {
"version": "2026-04-08",
"capabilities": {
"dev.ucp.shopping.checkout": [
{
"version": "2026-04-08"
}
],
"dev.ucp.shopping.fulfillment": [
{
"version": "2026-04-08"
}
],
"dev.ucp.shopping.discount": [
{
"version": "2026-04-08"
}
]
},
"payment_handlers": {}
},
"id": "3d7b9e2a-6f14-4c58-9b3e-8a2f1c6d4e97",
"status": "requires_escalation",
"currency": "EUR",
"line_items": [
{
"id": "f6a3c8e1-9d27-4b54-8e6a-2c1f7b9d3a58",
"item": {
"id": "1e8a6c4f-2b93-4d71-9f05-6a3c8e2b1d47",
"title": "Trek Marlin 5",
"price": 69900,
"image_url": "https://shop.example.com/api/public/uploads/c4d1e5a2-8b3f-4a6c-9e07-5f2d8a1b3c40/products/trek-marlin-5-modra.webp"
},
"quantity": 1,
"totals": [
{
"type": "subtotal",
"amount": 69900
},
{
"type": "total",
"amount": 69900
}
]
},
{
"id": "2e9d5b7a-4c83-4f16-a9b2-6d8e1c3f7a49",
"item": {
"id": "b5f81c3d-6e49-4a2b-8d73-9c0e4f1a6b25",
"title": "Fľaša na vodu 750 ml",
"price": 990
},
"quantity": 2,
"totals": [
{
"type": "subtotal",
"amount": 1980
},
{
"type": "total",
"amount": 1980
}
]
}
],
"totals": [
{
"type": "subtotal",
"amount": 71880
},
{
"type": "discount",
"amount": -5844,
"display_text": "JESEN10"
},
{
"type": "fulfillment",
"amount": 490
},
{
"type": "total",
"amount": 66526
}
],
"messages": [
{
"type": "error",
"code": "payment_required",
"content": "Payment is completed on the shop website — continue there to place the order",
"severity": "requires_buyer_input"
}
],
"links": [
{
"type": "terms_of_service",
"url": "https://shop.example.com/obchodne-podmienky",
"title": "Obchodné podmienky"
},
{
"type": "privacy_policy",
"url": "https://shop.example.com/ochrana-osobnych-udajov",
"title": "Ochrana osobných údajov"
}
],
"buyer": {
"first_name": "Jana",
"last_name": "Nováková",
"email": "jana.novakova@example.com",
"phone_number": "+421 905 123 456"
},
"context": {
"language": "sk",
"address_country": "SK"
},
"fulfillment": {
"methods": [
{
"id": "shipping",
"type": "shipping",
"line_item_ids": [
"f6a3c8e1-9d27-4b54-8e6a-2c1f7b9d3a58",
"2e9d5b7a-4c83-4f16-a9b2-6d8e1c3f7a49"
],
"destinations": [
{
"id": "destination",
"street_address": "Hlavná 12",
"address_locality": "Bratislava",
"postal_code": "811 01",
"address_country": "SK",
"first_name": "Jana",
"last_name": "Nováková"
}
],
"selected_destination_id": "destination",
"groups": [
{
"id": "default",
"line_item_ids": [
"f6a3c8e1-9d27-4b54-8e6a-2c1f7b9d3a58",
"2e9d5b7a-4c83-4f16-a9b2-6d8e1c3f7a49"
],
"options": [
{
"id": "0c5e8a3f-7b21-4d96-8f4c-9e2a6d1b3c75",
"title": "GLS kuriér",
"description": "Doručenie na adresu do 1–2 pracovných dní",
"totals": [
{
"type": "total",
"amount": 490
}
]
},
{
"id": "6b2d9f4e-3a17-4c68-9d5b-1f8e3a7c2b40",
"title": "Packeta – výdajné miesto",
"description": "Delivery in 2–3 business days",
"totals": [
{
"type": "total",
"amount": 290
}
]
}
],
"selected_option_id": "0c5e8a3f-7b21-4d96-8f4c-9e2a6d1b3c75"
}
]
}
]
},
"discounts": {
"codes": [
"JESEN10"
],
"applied": [
{
"code": "JESEN10",
"title": "JESEN10",
"amount": 5844,
"method": "across"
}
]
},
"continue_url": "https://shop.example.com/ucp/continue/9bbd3dedf887f93c6287fa7f4b8de141501155714c3b2050bb83551e36ec780b",
"expires_at": "2026-10-27T09:21:30.551Z"
}The answer to CheckoutUpdateRequest (step 4), and to a GET before the buyer has ordered. Nothing the platform can provide is missing: status requires_escalation, payment_required (requires_buyer_input) and continue_url. GLS 4.90 € is the fulfillment total: 718.80 − 58.44 + 4.90 = 665.26 €. The destination id came back as destination. Give continue_url to the buyer now.
Ako sa stav určuje
- Stav otvoreného checkoutu sa určí nanovo pri každom vytvorení,
PUT,GETajPOST …/complete, podľa aktuálneho stavu relácie. Akákoľvek správaerrorso závažnosťourecoverablez neho urobíincomplete; inak jerequires_escalation. Po odovzdaní sa už nemení (pozri Po odovzdaní je relácia zmrazená). - Správy k položkám —
out_of_stock,item_unavailable,quantity_adjusted,vat_mix_not_allowed— sú iba v odpovedi na zápis, ktorý ich spôsobil. V tej odpovedi je položka už odstránená, znížená alebo ponechaná bez zmeny, takže ďalšíGETmôže ten istý checkout vrátiť akorequires_escalation. Na správy reagujte v odpovedi na svoj zápis. POST …/completeobjednávku nevytvorí. AkoGETodpovie aktuálnym stavom, určeným nanovo, a nepredĺži platnosť.completedvzniká iba objednávkou, ktorú kupujúci vytvorí v obchode.
Uzavretý checkout
completed a canceled sú konečné. Každá odpoveď je HTTP 200, stav sa
nemení, chýba continue_url aj ucp.status:
| Operácia | Pri completed | Pri canceled |
|---|---|---|
GET | messages: [], s order | messages: [] |
PUT | checkout_completed | checkout_canceled |
POST …/complete | messages: [] | checkout_canceled |
POST …/cancel | checkout_completed | checkout_canceled |
Nič sa nezapíše. Objednávka dokončeného checkoutu sa cez UCP nikdy nezruší.
Košík nemá stav
Odpoveď s košíkom nemá status. Na zrušenie košíka obchod odpovie košíkom v stave, v akom bol — aj
s continue_url, ktoré už nefunguje. Odvtedy, rovnako ako po uplynutí
platnosti, obchod na každé volanie odpovie 200 not_found s
Cart not found or has expired. Zrušenie košíka nezruší checkout, ktorý z
neho vznikol: ten zrušte samostatne.
Zmena relácie
PUT uvádza polia; pole, ktoré vynechá, si ponechá uloženú hodnotu. Niektoré polia
však uložený obsah nahrádzajú celý:
| Pole | Poslané s hodnotou | Poslané ako null | Vynechané |
|---|---|---|---|
line_items | Nahradí všetky položky. | 400 | Košík: 400 line_items must be an array. Checkout: položky zostanú. |
buyer | Nahradí celého kupujúceho. | Kupujúceho vymaže. | Zostane. |
context | Nahradí celý kontext. | Vymaže ho (jazyk relácie zostane). | Zostane. |
| Cieľ doručenia | Nahradí ho vybraný cieľ; prázdny zoznam destinations nič nezmení. | Zostane (fulfillment: null nič nezmení). | Zostane. Nedá sa odstrániť, iba nahradiť. |
| Vybraná možnosť dopravy | Vyberie sa. | groups[0].selected_option_id: null ju zruší. | Zostane. |
discounts.codes | Nahradí zoznam; [] ho vymaže. | Zostane. | Zostane. |
| Pole rozšírenia, ktoré ste nevyjednali | Ignoruje sa. | Ignoruje sa. | — |
Položky.
- Zoznam nahradí položky relácie. Párujú sa podľa variantu; položka, ktorú
vynecháte, sa odstráni.
id, ktoré pri položke pošlete, sa ignoruje. quantityje kladné celé číslo, predvolene 1. Množstvo nad 999 sa bez správy zníži na 999; viac položiek s tým istým variantom sa sčíta a súčet nad 999 sa zníži s upozornenímquantity_adjusted.- V jednej požiadavke najviac 100 položiek (pri viacerých obchod odpovie
400).
Kupujúci. Posielajte vždy celého kupujúceho:
{"buyer":{"first_name":"Jana"}} vymaže uložený e-mail. E-mail sa uloží tak,
ako prišiel, a ak je platný, malými písmenami; neplatný sa hlási ako
missing $.buyer.email.
Doprava (fulfillment, s rozšírením):
- Číta sa prvý spôsob, ktorého
typeje"shipping"alebo chýba. Iné typy vrátanepickupsa ignorujú. Číta sa iba prvých 10 spôsobov a prvých 10 cieľov doručenia spôsobu. - Jeho cieľom doručenia je ten, ktorý určuje
selected_destination_id, inak prvý. Uloží sa celá adresa a jejidsa zmení na"destination". Kontroluje sa iba krajina tohto cieľa: na krajinu, ktorú obchod nerozpozná, odpovie400so žiadosťou o kód ISO 3166-1 alpha-2, napríklad"SK". groups[0].selected_option_idvyberie možnosť;nullju zruší; chýbajúca alebo prázdna hodnota nič nemení.- Možnosti sú aktívne spôsoby dopravy obchodu pre tento obchod, filtrované podľa krajiny cieľa (bez cieľa sa podľa krajiny zatiaľ nefiltruje) a podľa vlastných pravidiel spôsobov pre produkty, v poradí obchodu.
- Vybraná možnosť, ktorá sa už neponúka — napríklad po zmene krajiny — zostane
vybraná: odpoveď ukazuje
selected_option_id: nullainvalid_option, kým nevyberiete znova. titlemožnosti je názov spôsobu dopravy v jazyku relácie. Jejdescriptionje popis spôsobu v tomto jazyku, inak vlastný popis spôsobu, ktorý môže byť v inom jazyku obchodu, inak anglická veta zostavená z odhadu doručenia (Delivery in 2–3 business days); najviac 300 znakov a chýba, ak nie je nič z toho. Ukazujtetitle, prípadne sidescriptionpreložte sami.
Zľavové kódy (discounts, s rozšírením):
- Pri každom vytvorení a
PUTsa kódy skúšajú v poradí a uplatní sa prvý, ktorý obchod prijme. Každý ďalší dostane upozorneniediscount_code_combination_disallowed. Odmietnutý kód dostanediscount_code_expired,discount_code_user_ineligiblealebodiscount_code_invalida skúsi sa ďalší. Tieto správy sú upozornenia: checkout nikdy nedržia v staveincomplete.discounts.appliedobsahuje najviac jednu položku, a to iba vtedy, keď uplatnený kód niečo odpočíta. - Najviac 10 kódov (pri viacerých obchod odpovie
400), každý skrátený na 50 znakov; duplicity sa odstránia bez ohľadu na veľkosť písmen.GETkódy znova neuplatňuje. - V relácii bez položiek sa neuplatní žiadny kód:
discounts.appliedje prázdne a súčty žiadnu zľavu neukazujú. Kódy zostanú uložené a pri ďalšom vytvorení aleboPUTsa skúsia znova.
Platnosť. Každý PUT košíka predĺži platnosť košíka na 7 dní odteraz a
každý PUT checkoutu platnosť checkoutu na 24 hodín odteraz. PUT checkoutu
s {} znova uplatní
kódy, znova nacení dopravu a predĺži ho; PUT košíka vždy potrebuje jeho
položky.
Peniaze, súčty a daň
Každá suma je celé číslo v najmenších jednotkách meny currency, ktorá je
pri nej, podľa ISO 4217:
| Desatinné miesta | Meny |
|---|---|
| 0 | BIF, CLP, DJF, GNF, ISK, JPY, KMF, KRW, PYG, RWF, UGX, UYI, VND, VUV, XAF, XOF, XPF |
| 3 | BHD, IQD, JOD, KWD, LYD, OMR, TND |
| 4 | CLF, UYW |
| 2 | každá iná mena vrátane HUF: 1 990 Ft je 199000 |
Sumy sa zaokrúhľujú tak, že polovica sa zaokrúhli smerom od nuly. Sú s DPH: item.price je
jednotková cena s DPH, súčty položiek sú s DPH a prirážky obchodu sú už v nich.
Samostatný riadok dane ani suma bez DPH neexistuje.
totals[].type | Suma | Kedy |
|---|---|---|
subtotal | Súčet súčtov položiek. | Vždy, prvý. |
discount | Záporná. display_text je uplatnený kód veľkými písmenami. | Keď uplatnený kód niečo odpočíta. |
fulfillment | Cena vybranej možnosti dopravy s DPH; môže byť 0. | Checkout, keď je vybraná platná možnosť. |
total | subtotal + discount + fulfillment | Vždy, posledný. |
Položky pred total dajú v súčte vždy presne total. Zľava sa na položky
nerozpočítava: súčty položiek zostávajú bez zľavy.
Tri pravidlá sa správajú rovnako ako pokladňa obchodu a môžu prekvapiť:
- Percentuálny kód je percentom zo sumy bez DPH, odpočíta sa však od sumy s DPH. Bicykel za 699,00 € a dve fľaše po 9,90 € dajú medzisúčet 718,80 €; pri 23 % DPH je medzisúčet bez DPH 584,39 €, takže 10 % kód odpočíta 58,44 €, nie 71,88 €.
- Hranica dopravy zadarmo sa porovnáva s medzisúčtom bez DPH, pred
odpočítaním zľavy — ak ju však obchod pri spôsobe dopravy nastavil vrátane
DPH a beží na Storefront v2, s medzisúčtom s DPH (
subtotalrelácie). Na klasickom storefronte sa aj vtedy porovnáva medzisúčet bez DPH. - Minimálna hodnota objednávky pri kóde sa tiež porovnáva s medzisúčtom bez
DPH, pred odpočítaním zľavy. Košík za 718,80 € z príkladu vyššie má
medzisúčet bez DPH 584,39 €, takže kód s minimálnou hodnotou objednávky
600 € sa odmietne s
discount_code_user_ineligible.
Nenacení sa: príplatok za spôsob platby, ktorý si kupujúci vyberie v obchode. Kupujúci tam môže zmeniť aj položky či dopravu, takže konečná objednávka sa môže od posledného súčtu z UCP líšiť.
Jazyk a mena
Jazyk relácie určuje preklady (názvy produktov, spôsobov dopravy, právnych odkazov) a menu každej ceny. Vyberie sa pri vytvorení relácie:
context.languagez tela požiadavky, ak je to jazyková značka v tvareskaleboen-GB(najviac 35 znakov; reťazec v inom tvare sa potichu zahodí);- potom značky z
Accept-Languagev poradí hlavičky — prvých 10, váhyqsa ignorujú,*sa preskočí.
Vyhrá prvý kandidát, ktorý obchod ponúka: presná značka (bez ohľadu na
veľkosť písmen), inak prvý jazyk obchodu s rovnakou hlavnou časťou (en-US →
en alebo en-GB). Ak sa nič nezhoduje, použije sa prvý jazyk obchodu.
Obchod bez vlastného zoznamu jazykov vezme hlavnú časť prvého kandidáta
(en-GB → en) a bez kandidáta odpovedá v predvolenom jazyku firmy; jazyk,
ktorý firma nemá nastavený, sa nacení ako predvolený. Relácia vytvorená v
takom obchode bez kandidáta si jazyk neuloží: kým ho niektorá požiadavka
neurčí, odpovedá sa na každú ďalšiu v jazyku, ktorý vyberie jej vlastná
hlavička Accept-Language, a iný výber položky pridá znova (nové id, prípadne
iná mena). Pri vytvorení preto posielajte context.language.
- Mena. Každý jazyk obchodu má svoju menu.
context.currencymenu cien nikdy nemení: v košíku a checkoute sa iba vráti späť a v katalógu určuje menufilters.price(bez neho sú hranice v mene odpovede). Ak chcete ceny v inej mene, žiadajte jazyk, v ktorom obchod v tej mene predáva. - Jazyk zostáva. Keď relácia jazyk raz má, vyberá sa znova iba vtedy, keď
telo požiadavky pošle
context.languageodlišný (bez ohľadu na veľkosť písmen) odcontext.languageuloženého v relácii. Výber potom prebehne ako vyššie, sAccept-Languagetejto požiadavky. Samotná hlavičkaAccept-Languagejazyk nikdy neprepne a opätovné poslanie toho istého jazyka nie je zmena. Checkout vytvorený z košíka si ponechá jazyk košíka. - Prepnutie všetko prepočíta. Keď výber určí iný jazyk, položky sa pridajú znova v novom jazyku a mene: dostanú nové id aj aktuálne ceny obchodu a kódy sa uplatnia znova.
- Jazyk sa nevracia.
context.languagezopakuje, čo ste poslali, aj jazyk, ktorý obchod neponúka. Skutočný jazyk prezradí ibacurrencya preložené názvy.
context.language pošlite pri vytvorení relácie a držte sa ho. Ak kupujúci
jazyk zmení, počítajte s novými id položiek a novými cenami.
Keď sa zmení sklad alebo cena
Reláciu nacení košík obchodu, no nie každé volanie všetko znova preverí:
| Čo | Kedy sa preverí znova |
|---|---|
| Sklad a to, či obchod tovar ešte ponúka | Pri každom zápise, ktorý posiela položky: pri vytvorení, každom PUT košíka, PUT checkoutu s line_items a pri prepnutí jazyka. Vypredaná položka sa odstráni (out_of_stock); množstvo nad stav skladu sa zníži (quantity_adjusted, „Only 2 available — quantity lowered from 5“); tovar, ktorý obchod už neponúka, sa odstráni (item_unavailable). Varianty na predobjednávku sklad nikdy neobmedzuje. PUT checkoutu bez line_items (a bez prepnutia jazyka) ani žiadne čítanie sklad nepreverí. |
| Jednotkové ceny | Položka si ponechá jednotkovú cenu, ktorú dostala, keď jej variant prišiel do relácie, aj keď sa zmení jej množstvo alebo keď ju PUT pošle bez zmeny. Aktuálnu cenu obchodu dostane každá položka pri vytvorení relácie (aj z košíka) a pri prepnutí jazyka. Výnimkou je obchod so zapnutým nastavením Živé ceny pri načítaní košíka: tam položky nanovo nacení každé čítanie aj zápis. Profil obchodu neprezradí, či ho má zapnuté. |
| Zľavové kódy | Pri každom vytvorení a PUT: kód, ktorému vypršala platnosť alebo ktorý vyčerpal limit použití, sa zmení |
| na upozornenie a zo súčtov zmizne. Čítanie kódy znova neuplatňuje. |
- Položka odstránená ako vypredaná v relácii už nie je: keď sa tovar vráti na
sklad, pošlite ju znova v ďalšom
PUT. - Správy k položkám sú iba v odpovedi na zápis, ktorý ich spôsobil. Namiesto
čakania na správu porovnávajte
totalsmedzi odpoveďami. - Checkout, ktorý dlho udržiavate otvorený cez
PUT, si ponechá ceny z chvíle, keď doň položky prišli. Ak chcete položku naceniť znova, vynechajte ju v jednomPUTa v ďalšom ju pošlite znova (dostane nové id), alebo začnite nový checkout: zline_itemsalebo z košíka, keď zrušíte jeho otvorený checkout. - Odovzdanie pridá položky do košíka kupujúceho za ceny obchodu platné v tej chvíli, preto je záväzná cena v pokladni obchodu.
Tesne pred odovzdaním checkoutu pošlite PUT s jeho aktuálnymi line_items:
odpoveď už má znova preverený sklad aj zľavový kód (jednotkové ceny iba v
obchode so živými cenami). Kupujúcemu ukážte tieto súčty.
Katalógový režim
Obchodník môže obchod prevádzkovať ako katalóg: produkty a ceny sú viditeľné,
ale nič sa nedá kúpiť. Pre UCP to platí, keď je obchod v katalógovom režime a
beží na Storefront v2. Taký obchod uvádza iba
dev.ucp.shopping.catalog.search a dev.ucp.shopping.catalog.lookup:
{
"ucp": {
"version": "2026-04-08",
"services": {
"dev.ucp.shopping": [
{
"version": "2026-04-08",
"spec": "https://ucp.dev/2026-04-08/specification/overview",
"transport": "rest",
"endpoint": "https://shop.example.com/ucp/v1",
"schema": "https://ucp.dev/2026-04-08/services/shopping/rest.openapi.json"
}
]
},
"capabilities": {
"dev.ucp.shopping.catalog.search": [
{
"version": "2026-04-08",
"spec": "https://ucp.dev/2026-04-08/specification/catalog/search",
"schema": "https://ucp.dev/2026-04-08/schemas/shopping/catalog_search.json"
}
],
"dev.ucp.shopping.catalog.lookup": [
{
"version": "2026-04-08",
"spec": "https://ucp.dev/2026-04-08/specification/catalog/lookup",
"schema": "https://ucp.dev/2026-04-08/schemas/shopping/catalog_lookup.json"
}
]
},
"payment_handlers": {}
}
}The same shop with catalog mode in effect (storefront v2 with “Katalógový režim” on): only the two catalog capabilities. Every cart and checkout call then answers 200 capabilities_incompatible.
- Vyhľadávanie, vyhľadanie podľa identifikátorov (lookup) aj detail produktu fungujú ako zvyčajne; dostupnosť stále zodpovedá skladu.
- Na každú operáciu košíka a checkoutu vrátane
GETobchod odpovie HTTP 200capabilities_incompatiblea nič sa nevykoná. Relácie vytvorené pred zapnutím už cez API nedosiahnete. continue_urlvydané pred zapnutím pošle kupujúceho na úvodnú stránku obchodu a do košíka mu nič nepridá.
Platnosť a jej uplynutie
| Čo | Platí | Predĺži ju | Potom |
|---|---|---|---|
| Košík | 7 dní | vytvorenie, PUT | Na každé volanie obchod odpovie not_found; jeho continue_url vráti 410. |
| Checkout | 24 hodín | vytvorenie (aj z košíka), PUT | Najbližší GET, PUT, complete alebo cancel — alebo prevod jeho košíka — ho zruší: status: "canceled". Jeho continue_url vráti 410. |
| Relácia, ktorú si kupujúci odniesol do obchodu | posledné expires_at pred odovzdaním | nič | Ako vyššie. |
| Údaje relácie | 30 dní po expires_at | — | Zmaže ich čistenie, ktoré beží každú hodinu; na volania obchod odpovedá not_found. |
Idempotency-Key | najmenej 25 hodín od prvého použitia; spoliehajte sa na 24 | — | Zmaže ho čistenie, ktoré beží každú hodinu, počas nasledujúcej hodiny; potom sa kľúč dá použiť znova. |
GET, complete ani cancel reláciu nikdy nepredĺžia. expires_at je ISO
8601 v UTC s milisekundami, napríklad 2026-10-27T09:21:30.551Z. Predvolená
platnosť checkoutu v špecifikácii je 6 hodín; v Monokaide je to 24 hodín. Uplynutie sa
vyhodnocuje až pri ďalšej požiadavke: v samotnej chvíli termínu sa nič
nedeje a checkout zruší až najbližšia požiadavka, ktorá sa ho dotkne.
Odovzdanie kupujúcemu
Monokaido cez UCP platbu neprijíma. Pripravený checkout sa odovzdá kupujúcemu, ktorý nákup dokončí na webe obchodu, spôsobmi platby obchodu.
Odkaz
continue_url vyzerá ako
https://shop.example.com/ucp/continue/9bbd3ded…ec780b: primárna doména
obchodu a 64-znakový hexadecimálny token.
- Token je samostatné tajomstvo, nikdy nie id relácie. Počas životnosti relácie sa nemení.
- Je v každej odpovedi košíka a v každej odpovedi otvoreného checkoutu; v
checkoute
completedacanceledchýba. - Je to stránka pre prehliadač človeka. Odovzdajte ju kupujúcemu — ako odkaz
alebo tlačidlo — vo chvíli, keď je checkout
requires_escalation. Nevolajte ju zo svojho servera. - Funguje pri každej otvorenej relácii vrátane checkoutu v stave
incompletea prvá položka, ktorá sa dostane do košíka kupujúceho, reláciu zmrazí v stave, ktorý má práve vtedy (pozri Po odovzdaní je relácia zmrazená). Príliš skoro ukázaný odkaz preto zanechá checkoutincomplete, ktorý už nedokončíte. To isté platí pre odkaz košíka: keď z košíka vytvoríte checkout,continue_urlkošíka odovzdá tento checkout, preto odkaz košíka („pozrieť košík“) po prevode už neukazujte.
Čo sa stane, keď ho kupujúci otvorí
- Obchod vráti malú stránku. Jej načítanie nič nemení, takže náhľad odkazu ani prednačítanie neuškodí.
- Skript stránky pridá položky relácie a jej uplatnený zľavový kód do košíka kupujúceho v tomto prehliadači: do zákazníckeho košíka, ak je kupujúci v obchode prihlásený v tejto karte prehliadača, inak do košíka hosťa v tomto prehliadači. Bez JavaScriptu stránka ukáže iba odkaz do obchodu a nepridá nič.
- Prehliadač pokračuje do pokladne obchodu (pri checkoute), do košíka obchodu (pri košíku) alebo na úvodnú stránku (obchod v katalógovom režime). Odkaz košíka, z ktorého vznikol otvorený checkout, odovzdá tento checkout.
Stránka potrebuje JavaScript a úložisko prehliadača pre doménu obchodu: košík
hosťa obchod pozná iba podľa id uloženého v localStorage tohto prehliadača a
prihlásenú kartu podľa prihlásenia v jej sessionStorage. Položky preto
skončia v košíku toho prehliadača — a toho oddielu úložiska —, ktorý odkaz
otvoril. Prehliadač vnútri aplikácie alebo WebView mobilnej aplikácie má
vlastný košík, preto musí kupujúci nákup dokončiť v tom istom prehliadači,
alebo odkaz otvoriť rovno v systémovom prehliadači. Kde je úložisko
zablokované, položky skončia v košíku, ktorý žiadna stránka obchodu neukáže, a
relácia sa aj tak zmrazí: vytvorte nový checkout.
Košík kupujúceho si ponechá všetko ostatné, čo v ňom bolo. Pri variante, ktorý v ňom už je, sa množstvá sčítajú (najviac do 999) a kód relácie, ak pre tento košík platí, nahradí kód, ktorý si kupujúci uplatnil sám. Položku, ktorú košík obchodu odmietne — medzičasom sa vypredala, na sčítané množstvo nie je dosť tovaru na sklade alebo by v košíku vznikla zmes tovaru s nulovou a nenulovou DPH, ktorú obchod nepovoľuje —, stránka bez upozornenia preskočí. Ak košík kupujúceho už obsahuje tovar v inej mene, položky sa pridajú v jazyku toho košíka, pokiaľ sa v ňom ceny v tej mene počítajú; inak sa nepridá nič a kupujúci skončí na stránke košíka.
Čo sa prenesie a čo nie
| Prenesie sa do obchodu | Zostane v relácii UCP |
|---|---|
| Položky: variant a množstvo (najviac 999 z každej) | Kupujúci: meno, e-mail, telefón |
| Uplatnený zľavový kód | Adresa doručenia |
| Vybraná doprava a výdajné miesto |
Kupujúci svoje údaje v pokladni obchodu zadá znova a môže tam objednávku aj zmeniť. Povedzte mu to: čo vaša platforma zozbierala, sa vopred nevyplní.
Viacnásobné otvorenie odkazu
- Opätovné načítanie stránky, druhé kliknutie alebo druhá karta v tom istom prehliadači nepridá nič ďalšie. Karta, v ktorej je kupujúci prihlásený, sa počíta ako iný košík.
- Iný prehliadač alebo zariadenie, ktoré odkaz otvorí, dostane položky ešte raz, do vlastného košíka. Kým je relácia otvorená, môže to urobiť ktokoľvek, kto odkaz má, preto ho zdieľajte iba s kupujúcim.
- Keď je relácia dokončená, zrušená alebo vypršaná, odkaz vráti
410; keď obchod UCP prestane poskytovať, odpovie404.
Po odovzdaní je relácia zmrazená
Keď je v košíku kupujúceho aspoň jedna položka, relácia sa už nemení. Odovzdanie, ktoré nepridalo ani jednu položku, ju nechá tak, ako bola.
| Volanie | Odpoveď |
|---|---|
GET košíka alebo checkoutu, POST …/complete | Posledná odpoveď uložená pred odovzdaním vrátane jej správ (checkout s aktuálnym stavom). Ak to bola odpoveď na zápis, jej správy k položkám a kódom — napríklad quantity_adjusted — prídu pri každom čítaní: kupujúcemu ich znova nehláste a nepovažujte ich za znak odovzdania. Odovzdanie nič neoznačuje. |
PUT | To isté a navyše upozornenie handed_off. Nič sa neuloží. |
POST /checkout-sessions s cart_id toho košíka | 200 s chybou handed_off a continue_url na stránku košíka obchodu. |
POST …/cancel | Reláciu stále zruší. Objednávka vytvorená potom ju už nedokončí. |
Jej expires_at sa už nedá predĺžiť. GET vám nepovie, či kupujúci odkaz
otvoril; PUT áno (handed_off), no v relácii, ktorá odovzdaná nebola,
reláciu zmení a predĺži.
Prihlásený kupujúci a hosť
Stránka vidí iba prihlásenie v tej karte prehliadača, v ktorej sa otvorí.
Odkaz otvorený v novej karte — bežný prípad — naplní košík hosťa v tomto
prehliadači, ktorý ukazuje aj táto karta obchodu. Ak sa kupujúci potom
prihlási až v pokladni obchodu, obchod košík hosťa zlúči do zákazníckeho košíka
a výsledná objednávka checkout UCP už dokončiť nemôže: checkout si ponechá stav,
v ktorom bol odovzdaný (zvyčajne requires_escalation), kým nevyprší.
Samotnú objednávku to neovplyvní.
Dokončenie objednávkou
Kedy sa checkout stane dokončeným
Checkout sa stane completed, keď kupujúci v pokladni obchodu vytvorí
objednávku z košíka, ktorý naplnilo odovzdanie, a táto objednávka obsahuje
aspoň jeden z variantov relácie. Na množstvách nezáleží. Ukáže to
najbližšie čítanie; webhooky ani schopnosť pre objednávky neexistujú, takže to
zistíte čítaním checkoutu.
- Dokončí sa iba checkout, košík nikdy. Ak chcete poznať výsledok, odovzdajte checkout.
completedznamená, že objednávka bola vytvorená, nie zaplatená. Nastaví sa hneď, ako obchod začne platbu, pri akomkoľvek spôsobe platby, a na výsledok platby nečaká.- Dokončenie nie je zaručené. Beží po uložení objednávky, keď obchod začal
platbu a odovzdal objednávku do svojho ERP, takže môže za objednávkou
zaostať o čas, ktorý tieto kroky zaberú. Ak zlyhá, chyba sa iba zapíše do
logu na strane Monokaida a checkout si ponechá svoj stav: objednávka môže
existovať aj pri checkoute, ktorý nikdy nebude
completed. - Obchod pošle svoj bežný e-mail s potvrdením objednávky na adresu, ktorú kupujúci zadal v jeho pokladni.
Čo odpoveď obsahuje
Odpoveď je posledná, ktorú ste pred odovzdaním dostali, so
status: "completed", messages: [], bez continue_url a s order:
| Pole | Hodnota |
|---|---|
order.id | UUID objednávky (pri objednávke rozdelenej podľa sadzby DPH nadradená objednávka). |
order.label | Číslo objednávky obchodu; chýba, ak žiadne nie je. |
order.permalink_url | https://<primárna doména>/order-confirmation?orderNumber=<číslo>&orderId=<id> (bez orderNumber, keď objednávka číslo nemá) — stránka potvrdenia obchodu, ktorá nevyžaduje prihlásenie. |
line_items a totals sú stále vaša posledná ponuka, nie objednávka:
kupujúci mohol v obchode zmeniť množstvá, dopravu aj platbu. Ponuku nikdy
nevydávajte za súčet objednávky.
{
"ucp": {
"version": "2026-04-08",
"capabilities": {
"dev.ucp.shopping.checkout": [
{
"version": "2026-04-08"
}
],
"dev.ucp.shopping.fulfillment": [
{
"version": "2026-04-08"
}
],
"dev.ucp.shopping.discount": [
{
"version": "2026-04-08"
}
]
},
"payment_handlers": {}
},
"id": "3d7b9e2a-6f14-4c58-9b3e-8a2f1c6d4e97",
"buyer": {
"email": "jana.novakova@example.com",
"last_name": "Nováková",
"first_name": "Jana",
"phone_number": "+421 905 123 456"
},
"links": [
{
"url": "https://shop.example.com/obchodne-podmienky",
"type": "terms_of_service",
"title": "Obchodné podmienky"
},
{
"url": "https://shop.example.com/ochrana-osobnych-udajov",
"type": "privacy_policy",
"title": "Ochrana osobných údajov"
}
],
"status": "completed",
"totals": [
{
"type": "subtotal",
"amount": 71880
},
{
"type": "discount",
"amount": -5844,
"display_text": "JESEN10"
},
{
"type": "fulfillment",
"amount": 490
},
{
"type": "total",
"amount": 66526
}
],
"context": {
"language": "sk",
"address_country": "SK"
},
"currency": "EUR",
"messages": [],
"discounts": {
"codes": [
"JESEN10"
],
"applied": [
{
"code": "JESEN10",
"title": "JESEN10",
"amount": 5844,
"method": "across"
}
]
},
"expires_at": "2026-10-27T09:21:30.551Z",
"line_items": [
{
"id": "f6a3c8e1-9d27-4b54-8e6a-2c1f7b9d3a58",
"item": {
"id": "1e8a6c4f-2b93-4d71-9f05-6a3c8e2b1d47",
"price": 69900,
"title": "Trek Marlin 5",
"image_url": "https://shop.example.com/api/public/uploads/c4d1e5a2-8b3f-4a6c-9e07-5f2d8a1b3c40/products/trek-marlin-5-modra.webp"
},
"totals": [
{
"type": "subtotal",
"amount": 69900
},
{
"type": "total",
"amount": 69900
}
],
"quantity": 1
},
{
"id": "2e9d5b7a-4c83-4f16-a9b2-6d8e1c3f7a49",
"item": {
"id": "b5f81c3d-6e49-4a2b-8d73-9c0e4f1a6b25",
"price": 990,
"title": "Fľaša na vodu 750 ml"
},
"totals": [
{
"type": "subtotal",
"amount": 1980
},
{
"type": "total",
"amount": 1980
}
],
"quantity": 2
}
],
"fulfillment": {
"methods": [
{
"id": "shipping",
"type": "shipping",
"groups": [
{
"id": "default",
"options": [
{
"id": "0c5e8a3f-7b21-4d96-8f4c-9e2a6d1b3c75",
"title": "GLS kuriér",
"totals": [
{
"type": "total",
"amount": 490
}
],
"description": "Doručenie na adresu do 1–2 pracovných dní"
},
{
"id": "6b2d9f4e-3a17-4c68-9d5b-1f8e3a7c2b40",
"title": "Packeta – výdajné miesto",
"totals": [
{
"type": "total",
"amount": 290
}
],
"description": "Delivery in 2–3 business days"
}
],
"line_item_ids": [
"f6a3c8e1-9d27-4b54-8e6a-2c1f7b9d3a58",
"2e9d5b7a-4c83-4f16-a9b2-6d8e1c3f7a49"
],
"selected_option_id": "0c5e8a3f-7b21-4d96-8f4c-9e2a6d1b3c75"
}
],
"destinations": [
{
"id": "destination",
"last_name": "Nováková",
"first_name": "Jana",
"postal_code": "811 01",
"street_address": "Hlavná 12",
"address_country": "SK",
"address_locality": "Bratislava"
}
],
"line_item_ids": [
"f6a3c8e1-9d27-4b54-8e6a-2c1f7b9d3a58",
"2e9d5b7a-4c83-4f16-a9b2-6d8e1c3f7a49"
],
"selected_destination_id": "destination"
}
]
},
"order": {
"id": "8e1c4f7a-2d95-4b36-a7e8-5c3f9b1d6a24",
"label": "SK2600417",
"permalink_url": "https://shop.example.com/order-confirmation?orderNumber=SK2600417&orderId=8e1c4f7a-2d95-4b36-a7e8-5c3f9b1d6a24"
}
}GET after the buyer opened continue_url and placed order SK2600417 on the shop (step 6). The body is the last answer the platform received (step 4) without continue_url, with status: "completed", messages: [] and order appended. It does not reflect what the buyer changed on the shop. “Completed” means placed, not paid.
Kedy objednávka checkout nedokončí
| Prípad | Prečo |
|---|---|
| Kupujúci sa po odovzdaní ako hosť prihlásil v pokladni obchodu | Objednávka vznikne zo zákazníckeho košíka, nie z košíka, ktorý naplnilo odovzdanie. |
| Objednávka neobsahuje žiadny z variantov relácie | Kupujúci ich odstránil a kúpil niečo iné. |
| Do košíka kupujúceho sa nedostala žiadna položka | Košík obchodu pri odovzdaní odmietol každú položku, takže checkout nebol nikdy odovzdaný. |
| Checkout bol skôr zrušený | Cez POST …/cancel alebo požiadavkou po expires_at. |
| Relácia je košík | Košík sa nikdy nedokončí. |
| Objednávka nevznikla v pokladni obchodu na webe | Počítajú sa iba objednávky vytvorené tam. |
| Samotné dokončenie zlyhalo | Nie je zaručené; chyba sa iba zapíše do logu. |
Uplynutie platnosti súťaží s objednávkou. Dokončenie na expires_at
neprihliada, ale akákoľvek vaša požiadavka, ktorá sa checkoutu dotkne po
expires_at, ho najprv zruší. Po termíne preto rozhodne jediný GET:
completed, ak objednávka prišla skôr, inak canceled.
Zisťovanie stavu
- Stav zisťujte cez
GET /ucp/v1/checkout-sessions/{id}s bežnou hlavičkouUCP-Agent. Každé čítanie checkoutu čaká, kým sa pri relácii dostane na rad, preto majte na reláciu naraz rozpracovanú najviac jednu požiadavku; pri503dodržteRetry-After. - Server interval neurčuje. Rozumné je pýtať sa každých 5–10 sekúnd počas prvej štvrťhodiny od chvíle, keď kupujúci dostal odkaz, potom raz za minútu.
- Stav zisťujte pri akomkoľvek otvorenom stave checkoutu: aj checkout
odovzdaný v stave
incompletesa objednávkou kupujúceho dokončí. Prestaňte pricompletedalebocanceled. Poexpires_atrozhodne ešte jedno čítanie. - „Nikdy nedokončené“ berte ako bežný výsledok: kupujúci mohol objednať spôsobom, ktorý sa nedá spätne spárovať (pozri tabuľku vyššie). Kupujúci vždy vidí vlastné potvrdenie obchodu.
Ako to celé do seba zapadá
Agent / platforma → Obchod (UCP API):
GET /.well-known/ucpNačíta profil obchodu: verziu protokolu, adresu REST API a schopnosti, ktoré obchod ponúka. Netreba žiadnu hlavičku; odpoveď sa smie uchovať v cache päť minút.
Agent / platforma → Obchod (UCP API):
POST /ucp/v1/catalog/searchHľadá v katalógu obchodu (lookup a product čítajú položky podľa id). Každé volanie /ucp/v1 nesie hlavičku UCP-Agent s adresou profilu platformy.
Agent / platforma → Obchod (UCP API):
POST /ucp/v1/cartsZaloží košík, ktorý nacení obchod — jeho ceny, sklad a zľavy. Košík platí 7 dní od poslednej zmeny.
Agent / platforma → Obchod (UCP API):
POST /ucp/v1/checkout-sessionsincompleteVytvorí checkout z košíka (cart_id) alebo priamo z line_items. Kým niečo chýba, má stav incomplete.
Agent / platforma → Obchod (UCP API):
PUT /ucp/v1/checkout-sessions/{id}requires_escalationDoplní e-mail kupujúceho a s rozšírením fulfillment aj adresu a spôsob dopravy. Keď nič nechýba: requires_escalation so správou payment_required a s continue_url.
Agent / platforma → Kupujúci (prehliadač):
continue_urlOdovzdá continue_url kupujúcemu. Monokaido cez UCP platbu neprijíma a POST …/complete checkout nedokončí.
Kupujúci (prehliadač) → Obchod (UCP API):
GET /ucp/continue/{token}Otvorí continue_url na doméne obchodu. Stránka presunie položky a zľavový kód do jeho košíka v tomto prehliadači a otvorí pokladňu obchodu.
Kupujúci (prehliadač) → Obchod (UCP API):
/checkoutV pokladni obchodu dokončí nákup vrátane platby — ako ktorýkoľvek zákazník.
Agent / platforma → Obchod (UCP API):
GET /ucp/v1/checkout-sessions/{id}completedKeď objednávka obsahuje aspoň jednu položku z relácie, ďalšie čítanie checkoutu vráti completed s objednávkou (order). Webhooky neexistujú: stav treba zisťovať čítaním.
continue_url košíka (bez checkoutu) funguje rovnako, len otvorí košík obchodu namiesto pokladne.
Objavenie
GET /.well-known/ucp. Uložte siendpointa overte, že obsahuje schopnosti, ktoré potrebujete. V cache ho držte najviac päť minút.Čítanie katalógu
POST /ucp/v1/catalog/search,/ucp/v1/catalog/lookupalebo/ucp/v1/catalog/productna hostiteľovi zendpoint, zakaždým sUCP-Agentacontext.language. Zapamätajte si id variantov.Košík, alebo rovno checkout
POST /ucp/v1/cartssline_items, aleboPOST /ucp/v1/checkout-sessions. Ku každému zápisu pošliteIdempotency-Key. Čítajte správy v každej odpovedi a položky párujte podľaitem.id.Príprava checkoutu
Ak máte košík, preveďte ho cez
cart_id, potom cezPUTdoplňte kupujúceho (celého), cieľ doručenia a spôsob dopravy, kým nie jestatusrequires_escalation.Odovzdanie
Pošlite ešte raz
PUTsline_itemscheckoutu, ukážte kupujúcemu súčty z tej odpovede a odovzdajte mucontinue_url. Povedzte mu, že nákup dokončí a zaplatí v obchode.Zistenie výsledku
Čítajte
GET /ucp/v1/checkout-sessions/<id>, kým nedostanetecompleted(ukážteorder.labelaorder.permalink_url) alebocanceled.
Ten istý postup ako spustiteľný kód v curl, JavaScripte a Pythone nájdete v Rýchlom štarte pre vývojárov. Kde sa toto správanie drží špecifikácie a kde sa od nej odchyľuje, opisuje kapitola Zhoda so špecifikáciou UCP.