Tapaya
Přijímání plateb v prodejněPrůvodce integracíCloud Accept APIBeta

Cloud Accept API

Beta

Spouštějte platby v prodejně na spárovaném zařízení Tapaya ze svého ECR nebo backendu POS.

Cloud Accept API umožňuje vaší elektronické registrační pokladně (ECR) nebo backendu POS spustit platbu na zařízení Tapaya přes cloud. Váš systém nikdy nekomunikuje se zařízením přímo: odešle požadavek na platbu do Tapaya, Tapaya upozorní spárované zařízení a zařízení zobrazí zákazníkovi platební obrazovku. Informace o průběhu k vám přicházejí jako webhooky, případně si je zjišťujete dotazováním (pollingem).

Výběr způsobu párování zařízení

Každé zařízení, na které posíláte platby, potřebuje externalDeviceId: název, pod kterým jej zná váš systém, například till-01. Přiřadit jej můžete jedním ze dvou způsobů:

Než začnete

  1. Získejte svůj Server Secret Token na stránce API Keys. Níže jej vyměníte za přístupový token omezený na obchodníka (viz autentizace Platform API).
  2. Zaregistrujte obchodníka a uchovejte si jeho merchantToken. Viz Registrace nového obchodníka.
  3. Připravte každé zařízení s aplikací Tapaya přihlášenou za daného obchodníka, aby je bylo možné spárovat a mohlo přijímat požadavky.

Jeden token, jeden obchodník

Každé volání Cloud Accept API je omezeno právě na jednoho obchodníka. Chcete-li obsluhovat více obchodníků, získejte výměnou samostatný přístupový token pro každého z nich.

Spárování zařízení

Párování přiřadí zařízení Tapaya externalDeviceId, takže je můžete najít při výpisu zařízení a zacílit na ně při spuštění platby.

Přiřazení z vaší aplikace

Vaše aplikace zavolá na zařízení funkci Accept SDK, která mu přiřadí externalDeviceId. Ve všech voláních Cloud Accept API pro toto zařízení používejte stejný identifikátor.

Naskenování QR kódu

Obchodník otevře v Tapaya Platform postup párování, který zobrazí QR kód pro přiřazované externalDeviceId. Obchodník jej naskenuje aplikací Tapaya pro obchodníky na cílovém zařízení a aplikace párování dokončí.

Výměna za přístupový token

Vyměňte svůj Server Secret Token a merchantToken obchodníka za přístupový token pomocí POST /ecr/auth. merchantToken se odesílá pouze zde; všechna další volání odesílají jen Authorization: Bearer <accessToken>.

curl -X 'POST' 'https://api.tapaya.com/ecr/auth' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer REPLACE_ME' \
-d '{
        "merchantToken": "unique_merchant_id_from_your_db"
    }'
200 OK
{
    "accessToken": "...",
    "tokenType": "Bearer",
    "expiresAt": "2026-01-13T16:30:59Z"
}
KódPopis
401Neplatný API token nebo API token s prošlou platností.
403Přístup k obchodníkovi není povolen.

Obnovte token před expiresAt. Zavolejte POST /ecr/auth/refresh s aktuálním, stále platným accessToken v hlavičce Authorization. Endpoint vrátí stejné tělo s novým tokenem; uložte si jej a nadále používejte už jen ten nový.

curl -X 'POST' 'https://api.tapaya.com/ecr/auth/refresh' \
-H 'Authorization: Bearer ACCESS_TOKEN'
KódPopis
401Přístupový token je neplatný, vypršel nebo byl zneplatněn. Získejte nový výměnou přes POST /ecr/auth.
403K obchodníkovi již nemáte přístup. Nový token se nevydá.

Vyhledání připraveného zařízení

Zařízení obchodníka vypište pomocí GET /ecr/devices. Přidáním ?connected=true vynecháte odpojená zařízení; jedno konkrétní zařízení načtete pomocí GET /ecr/devices/{externalDeviceId}.

curl 'https://api.tapaya.com/ecr/devices/till-01' \
-H 'Authorization: Bearer ACCESS_TOKEN'
200 OK
{
    "externalDeviceId": "till-01",
    "name": "Front counter",
    "connected": true,
    "availability": "ready",
    "lastSeenAt": "2026-01-13T16:30:59Z",
    "updatedAt": "2026-01-13T16:30:59Z"
}

Platby posílejte pouze na zařízení, jehož availability je ready. Výpis je jen momentální snímek: dostupnost se znovu ověřuje při odeslání, takže i zařízení ve stavu ready může požadavek odmítnout. Viz Dostupnost zařízení.

Odeslání požadavku na platbu

Částku odešlete na zařízení pomocí POST /ecr/payment-requests. Tapaya požadavek uloží a upozorní zařízení, které zobrazí platební obrazovku.

curl -X 'POST' 'https://api.tapaya.com/ecr/payment-requests' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer ACCESS_TOKEN' \
-H 'Idempotency-Key: order-1042-attempt-1' \
-d '{
        "externalDeviceId": "till-01",
        "amount": 12500,
        "tipAmount": 500,
        "currency": "CZK"
    }'

Parametry:

PoleTypPovinnéPopis
externalDeviceIdstring✓Spárované zařízení, které má platbu zobrazit.
amountinteger✓Částka v nejmenší jednotce měny (12500 je 125,00 Kč).
tipAmountintegerSpropitné v nejmenší jednotce měny.
currencystring✓Kód měny podle ISO 4217.
paymentTokenstringExistující platba, ke které se má požadavek připojit.
202 Accepted
{
    "requestId": "...",
    "status": "pending",
    "paymentToken": null,
    "expiresAt": "2026-01-13T16:30:59Z"
}

202 není výsledek platby

202 Accepted znamená, že Tapaya požadavek uložila. Neznamená to, že jej zařízení zaznamenalo ani že zákazník zaplatil. Cokoli, co selže později, se k vám dostane jako změna stavu.

Zajistěte bezpečné opakování požadavků. Hlavička Idempotency-Key je povinná. Opětovné použití klíče se stejným tělem vrátí původní požadavek místo spuštění druhé platby; opětovné použití s jiným tělem vrátí 409 idempotency_conflict. Svažte klíč s prodejem a pokusem, například order-1042-attempt-1.

Sledování výsledku

Sledujte požadavek přes jeho stavy pomocí webhooků, nebo pravidelně volejte GET /ecr/payment-requests/{requestId}. Jakmile požadavek dosáhne stavu payment_created, odpověď obsahuje paymentToken a průběh samotné platby hlásí události payment.updated.

Chcete-li přijímat webhooky, zaregistrujte svůj HTTPS endpoint pomocí POST /ecr/webhook-subscriptions, nebo pro obchodníka nastavte callback URL a typy událostí v Tapaya Platform.

curl -X 'POST' 'https://api.tapaya.com/ecr/webhook-subscriptions' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer ACCESS_TOKEN' \
-d '{
        "url": "https://integrator.example.com/webhooks/tapaya",
        "events": ["payment_request.updated", "payment.updated"]
    }'
201 Created
{
    "subscriptionId": "...",
    "url": "https://integrator.example.com/webhooks/tapaya",
    "events": ["payment_request.updated", "payment.updated"],
    "signingSecret": "..."
}

Uložte si signing secret

signingSecret se vrací pouze při vytvoření odběru. Bezpečně si jej uložte; budete jej potřebovat k ověření podpisu příchozích webhooků.

Odběr patří integrátorovi a obchodníkovi, nikoli přístupovému tokenu, takže při obnovení tokenu zůstává zachován. Na každou událost odpovězte kódem 2xx, jakmile ji přijmete.

Před uzavřením prodeje ověřte výsledek

Webhooky jsou oznámení, nikoli doklad o platbě, a některý může dorazit pozdě, nebo nemusí dorazit vůbec. Nikdy neuzavírejte prodej pouze na základě webhooku:

  • Když webhook dorazí, ověřte konečný výsledek přes API, například pomocí Načtení podrobností platby.
  • Když webhook nedorazí v časovém limitu vhodném pro váš pokladní proces, nejpozději však do expiresAt požadavku, zavolejte GET /ecr/payment-requests/{requestId}, abyste zjistili jeho aktuální stav, a poté ověřte platbu přes API, jak je uvedeno výše.

Reference

Endpointy

MetodaEndpointPopis
POST/ecr/authVymění váš API token a merchantToken za přístupový token.
POST/ecr/auth/refreshObnoví dosud platný přístupový token.
GET/ecr/devicesVypíše zařízení obchodníka. Volitelný filtr connected=true.
GET/ecr/devices/{externalDeviceId}Vrátí jedno zařízení a jeho aktuální dostupnost.
POST/ecr/payment-requestsUloží požadavek na platbu a upozorní zařízení. Vyžaduje Idempotency-Key.
GET/ecr/payment-requests/{requestId}Vrátí stav požadavku, případný důvod odmítnutí a paymentToken.
POST/ecr/webhook-subscriptionsZaregistruje HTTPS URL a typy událostí. Signing secret (podpisový klíč) vrátí jen jednou.
GET/ecr/webhook-subscriptionsVypíše vaše odběry pro obchodníka, bez signing secretů.
DELETE/ecr/webhook-subscriptions/{subscriptionId}Odstraní odběr.

Dostupnost zařízení

Oba endpointy pro zařízení vracejí externalDeviceId, name, connected, availability, lastSeenAt a updatedAt.

HodnotaPopis
readyPřipojeno a schopné přijmout a zobrazit požadavek.
busyZpracovává platbu nebo má aktivní požadavek.
unavailableOdpojeno, bez platné relace nebo neschopné zobrazit platební obrazovku.

Stavy požadavku

StavPopis
pendingUložen a čeká, až jej zařízení přijme.
acknowledgedZařízení jej obdrželo; platba ještě nemusí existovat.
payment_createdPlatba a její paymentToken existují. Další průběh sledujte na platbě.
rejectedZařízení nebo Tapaya požadavek odmítly.

Chyby

KódDůvodPopis
403 / 404Objekt není dostupnýNemáte oprávnění nebo objekt neexistuje.
409device_busyZařízení již má aktivní požadavek nebo platbu.
409device_unavailableZařízení je připojeno, ale není připraveno.
409idempotency_conflictKlíč již byl použit s jiným tělem.
503device_offlineZařízení není připojeno.

Chyby validace částky a měny se řídí stejnými konvencemi jako zbytek Platform API.

Události webhooků

UdálostOdesílá se, kdyžObsah data
device.connectedZařízení naváže nové aktivní spojení.externalDeviceId, connected, availability, lastSeenAt
device.disconnectedSpojení se uzavře nebo vyprší časový limit kontroly aktivity spojení.externalDeviceId, connected, availability, lastSeenAt
device.availability_changedDostupnost se změní mezi ready, busy a unavailable.externalDeviceId, availability, volitelně reason
payment_request.updatedPožadavek je uložen, potvrzen, odmítnut, vyprší nebo k němu vznikne platba.requestId, externalDeviceId, status, paymentToken, reference, reason, expiresAt
payment.updatedZmění se stav platby.paymentToken, requestId, externalDeviceId, status, reference, amount, currency, volitelně receiptUrl

Každá událost přichází jako HTTP POST ve stejné obálce:

{
    "eventId": "...",
    "type": "payment_request.updated",
    "occurredAt": "2026-01-13T16:30:59Z",
    "data": {
        "requestId": "...",
        "externalDeviceId": "till-01",
        "status": "acknowledged",
        "paymentToken": null,
        "reference": "ORDER-1042",
        "reason": null,
        "expiresAt": "2026-01-13T16:30:59Z"
    }
}
Chybí vám něco na této stránce?Navrhněte funkci. Připojíme tuto stránku, aby tým viděl souvislosti.