Přejít na hlavní obsah
← Reference API

Rychlý start

Tři kroky dovedou obchod z nuly k bezpečné objednávce: vložit konfigurátor, ověřit nabídku na svém serveru před košíkem a přijmout podepsaný webhook. Volání ze stránky obchodu provádí vložený konfigurátor za vás; váš kód řeší jen stranu serveru.

Základní URL https://cfg.cutoptim.com · Verze kontraktu v1 · Dokument OpenAPI 3.1

Předběžný přístup: API pro obchodníky je hotové a lze je vyzkoušet v sandbox obchodě; moduly pro platformy e-shopů jsou stále ve vývoji. CutOptim nevybírá žádné platby: košík, pokladna i platba zůstávají ve vašem obchodě.

Cesty, názvy polí, chybové kódy, názvy hlaviček a ukázky kódu zůstávají anglicky: jsou součástí kontraktu.

1. Vložte konfigurátor

Přidejte na stránku produktu skript a prvek s vaším veřejným klíčem (pk_live_…, nebo testovacím klíčem pk_test_…, dokud vyvíjíte). Origin stránky musí být mezi povolenými originy klíče. Vložený konfigurátor pak sám volá GET /cfg/v1/config/public, POST /cfg/v1/preview, POST /cfg/v1/quote a POST /cfg/v1/order.

Když zákazník objedná, služba uloží podepsanou objednávku a prvek vyvolá událost prohlížeče cutoptim:order s { orderId, order, idempotencyKey }. Berte ji jako nápovědu pro svou stránku, nikdy jako důkaz ceny.

<script type="module" src="https://cfg.cutoptim.com/embed/assets/cutoptim-configurator.js"></script>

<button data-cutoptim-open="#cut">…</button>
<cutoptim-configurator id="cut" mode="modal" key="pk_live_your_publishable_key" lang="cs">
</cutoptim-configurator>

<script>
  document.getElementById('cut').addEventListener('cutoptim:order', (e) => {
    // e.detail = { orderId, order, idempotencyKey } - send it to YOUR server, which verifies it
  });
</script>

2. Ověřte na svém serveru před košíkem

Váš server pošle token nabídky na POST /cfg/v1/quote/verify s tajným klíčem. Odpověď obsahuje valid a redeemed; zamítnutí je stále odpověď 200 s valid: false a reason. Poté dohledá objednávku, kterou prohlížeč uvedl, pomocí GET /cfg/v1/orders/{id} a porovná hash plánu, hash nabídky, měnu a součty s ověřeným tokenem. Teprve pak vytvoří řádek v košíku za ověřenou cenu.

curl -X POST https://cfg.cutoptim.com/cfg/v1/quote/verify \
  -H "Authorization: Bearer $CUTOPTIM_API_SECRET" \
  -H "Content-Type: application/json" \
  -d '{"quoteToken":"<order.quote.quoteToken>"}'
# {"valid":true,"redeemed":true,"claims":{…},"test":false}

curl https://cfg.cutoptim.com/cfg/v1/orders/<orderId> \
  -H "Authorization: Bearer $CUTOPTIM_API_SECRET"
# {"orderId":"…","status":"received","priced":true,"planHash":"…","quoteHash":"…","totals":{…}}

3. Přijměte podepsaný webhook

Zveřejněte v konfiguraci obchodu endpoint webhooku. Každá ostrá objednávka odešle order.created, každá změna stavu order.status_changed. Načtěte surové tělo, zkontrolujte hlavičku CutOptim-Signature a objednávku uložte jednou pro každé CutOptim-Event-Id. Přijímač níže je referenční příklad, beze změny.

// example-server.mjs - a webhook endpoint on node:http, to read and adapt.   CUTOPTIM_WEBHOOK_SIGNING=whsec_... node example-server.mjs
// (whsec_REPLACE_ME is a placeholder: the real secret comes from the CutOptim admin route.)
import { createServer } from 'node:http';
import { createWebhookReceiver } from './cutoptim-verify.mjs';

const secret = process.env.CUTOPTIM_WEBHOOK_SIGNING;
if (!secret) { console.error('set CUTOPTIM_WEBHOOK_SIGNING (whsec_REPLACE_ME is a placeholder)'); process.exit(1); }

const receive = createWebhookReceiver({
  secrets: [secret],
  async onEvent(event) {
    // event.type === 'order.created'; event.data.order is the signed order document. Store it in YOUR order table here,
    // keyed by event.data.orderId, in the same transaction that records the event id as seen.
    console.log('order.created', event.data.orderId);
  },
});

createServer(async (req, res) => {
  if (req.method !== 'POST') { res.writeHead(405).end(); return; }
  const chunks = []; let size = 0;
  for await (const c of req) { size += c.length; if (size > 2_000_000) { res.writeHead(413).end(); return; } chunks.push(c); }
  const out = await receive({ rawBody: Buffer.concat(chunks), headers: req.headers });   // the RAW bytes, not parsed JSON
  res.writeHead(out.status, { 'Content-Type': 'application/json' }).end(JSON.stringify({ result: out.reason }));
}).listen(Number(process.env.PORT ?? 8787));

Dále

Klíče, testovací klíče a originy: Klíče a autentizace. Kompletní přijímač, verze v PHP a plán opakování: Webhooky. Postup krok za krokem pro vlastní platformu: Vlastní e-shop nebo ERP.

Tlačítko „vyzkoušet“ tu záměrně není: tajný klíč patří na váš server, nikdy do prohlížeče. Demo obchod ukazuje vložení i předání objednávky v provozu od začátku do konce.

Právní informacePodmínky konfigurátoru (EN) ·Smlouva o zpracování údajů (EN) ·Zásady ochrany osobních údajů pro kupující ·Licence třetích stran (EN)