Cloud Accept API
BetaSpouš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ů:
Z vaší aplikace
Vaše aplikace přiřadí externalDeviceId prostřednictvím Accept SDK na zařízení.
QR kód z Tapaya Platform
Obchodník zobrazí QR kód v Tapaya Platform a naskenuje jej aplikací pro obchodníky.
Než začnete
- 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).
- Zaregistrujte obchodníka a uchovejte si jeho
merchantToken. Viz Registrace nového obchodníka. - 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"
}'{
"accessToken": "...",
"tokenType": "Bearer",
"expiresAt": "2026-01-13T16:30:59Z"
}| Kód | Popis |
|---|---|
401 | Neplatný API token nebo API token s prošlou platností. |
403 | Pří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ód | Popis |
|---|---|
401 | Přístupový token je neplatný, vypršel nebo byl zneplatněn. Získejte nový výměnou přes POST /ecr/auth. |
403 | K 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'{
"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:
| Pole | Typ | Povinné | Popis |
|---|---|---|---|
externalDeviceId | string | ✓ | Spárované zařízení, které má platbu zobrazit. |
amount | integer | ✓ | Částka v nejmenší jednotce měny (12500 je 125,00 Kč). |
tipAmount | integer | Spropitné v nejmenší jednotce měny. | |
currency | string | ✓ | Kód měny podle ISO 4217. |
paymentToken | string | Existující platba, ke které se má požadavek připojit. |
{
"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"]
}'{
"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
expiresAtpožadavku, zavolejteGET /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
| Metoda | Endpoint | Popis |
|---|---|---|
POST | /ecr/auth | Vymění váš API token a merchantToken za přístupový token. |
POST | /ecr/auth/refresh | Obnoví dosud platný přístupový token. |
GET | /ecr/devices | Vypíš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-requests | Uloží 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-subscriptions | Zaregistruje HTTPS URL a typy událostí. Signing secret (podpisový klíč) vrátí jen jednou. |
GET | /ecr/webhook-subscriptions | Vypíš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.
| Hodnota | Popis |
|---|---|
ready | Připojeno a schopné přijmout a zobrazit požadavek. |
busy | Zpracovává platbu nebo má aktivní požadavek. |
unavailable | Odpojeno, bez platné relace nebo neschopné zobrazit platební obrazovku. |
Stavy požadavku
| Stav | Popis |
|---|---|
pending | Uložen a čeká, až jej zařízení přijme. |
acknowledged | Zařízení jej obdrželo; platba ještě nemusí existovat. |
payment_created | Platba a její paymentToken existují. Další průběh sledujte na platbě. |
rejected | Zařízení nebo Tapaya požadavek odmítly. |
Chyby
| Kód | Důvod | Popis |
|---|---|---|
403 / 404 | Objekt není dostupný | Nemáte oprávnění nebo objekt neexistuje. |
409 | device_busy | Zařízení již má aktivní požadavek nebo platbu. |
409 | device_unavailable | Zařízení je připojeno, ale není připraveno. |
409 | idempotency_conflict | Klíč již byl použit s jiným tělem. |
503 | device_offline | Zařízení není připojeno. |
Chyby validace částky a měny se řídí stejnými konvencemi jako zbytek Platform API.
Události webhooků
| Událost | Odesílá se, když | Obsah data |
|---|---|---|
device.connected | Zařízení naváže nové aktivní spojení. | externalDeviceId, connected, availability, lastSeenAt |
device.disconnected | Spojení se uzavře nebo vyprší časový limit kontroly aktivity spojení. | externalDeviceId, connected, availability, lastSeenAt |
device.availability_changed | Dostupnost se změní mezi ready, busy a unavailable. | externalDeviceId, availability, volitelně reason |
payment_request.updated | Požadavek je uložen, potvrzen, odmítnut, vyprší nebo k němu vznikne platba. | requestId, externalDeviceId, status, paymentToken, reference, reason, expiresAt |
payment.updated | Změ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"
}
}