{"title":"Building a cloud integration","category":"default","creationDate":1560352500,"content":"<div class=\"additional-info-block output-inline\">\n<div class=\"additional-info-block__body\"><p><img style=\"width: 25px;\" alt=\"\" src=\"\/user\/pages\/docs\/03.point-of-sale\/04.design-your-integration\/06.choose-your-architecture\/02.cloud\/postman-logo-vertical-orange-2021.svg?decoding=auto&amp;fetchpriority=auto\" \/>&nbsp;&nbsp;<a href=\"https:\/\/www.postman.com\/adyendev\/workspace\/adyen-in-person-payments\/overview\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">Postman collection<\/a><\/p><p><strong>Implementation examples<\/strong><br \/><img style=\"width: 25px;\" alt=\"\" src=\"\/user\/pages\/reuse\/development-resources\/additional-info-resources\/java-original.svg?decoding=auto&amp;fetchpriority=auto\" \/>&nbsp;&nbsp;<a href=\"https:\/\/github.com\/adyen-examples\/adyen-java-spring-online-payments\/tree\/main\/in-person-payments-example\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">Java Spring<\/a><br \/><img style=\"width: 25px;\" alt=\"\" src=\"\/user\/pages\/reuse\/development-resources\/additional-info-resources\/dot-net-original.svg?decoding=auto&amp;fetchpriority=auto\" \/>&nbsp;&nbsp;<a href=\"https:\/\/github.com\/adyen-examples\/adyen-dotnet-online-payments\/tree\/main\/in-person-payments-example\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">.NET<\/a><br \/><img style=\"width: 25px;\" alt=\"\" src=\"\/user\/pages\/reuse\/development-resources\/additional-info-resources\/nodejs-original.svg?decoding=auto&amp;fetchpriority=auto\" \/>&nbsp;&nbsp;<a href=\"https:\/\/github.com\/adyen-examples\/adyen-node-online-payments\/tree\/main\/in-person-payments-example\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">Node.js<\/a><\/p><\/div><\/div>\n\n<p>With an integration that uses cloud communications, your POS app and the payment terminal communicate with each other over the internet:<\/p>\n<ol>\n<li>Your POS app makes an API request to the Adyen payments platform.<\/li>\n<li>The Adyen payments platform routes the request to your payment terminal, to start the payment on the device.<\/li>\n<li>The terminal sends the transaction to the Adyen payments platform for processing.<\/li>\n<li>You receive the result of the transaction synchronously or asynchronously, depending on how you build your integration:\n<ul>\n<li><strong>Synchronously<\/strong>: when your POS app makes an API request, it keeps the connection open until the transaction result is known.<\/li>\n<li><strong>Asynchronously<\/strong>: your POS app makes an API request, then closes the connection. You receive the transaction result including the receipt data in an event notification or by making a transaction status request.<\/li>\n<\/ul><\/li>\n<\/ol>\n<p>To build a cloud integration, you need to:<\/p>\n<ol>\n<li><a href=\"#configure-network\">Configure your network<\/a>.<\/li>\n<li><a href=\"#install-library\">Optionally install an API library<\/a>.<\/li>\n<li><a href=\"#build-payment-flow\">Build your payment flow<\/a>.<\/li>\n<li>Learn how to <a href=\"#handle-network-issues\">handle network issues<\/a>.<\/li>\n<\/ol>\n<h2 id=\"configure-network\">Step 1: Configure your network<\/h2>\n<p>To enable your POS app to connect to Adyen:<\/p>\n<ol>\n<li>\n<p>Add Adyen's domains to your firewall's allowlist.<br \/>\nConfigure your firewall to allow outgoing HTTPS traffic from the IP addresses of your POS apps and terminals to:<\/p>\n<ul>\n<li><code>*.adyen.com<\/code><\/li>\n<li><code>*.adyenpayments.com<\/code><\/li>\n<\/ul>\n<p>Allowlisting should be based on the DNS name of these URLs. Your firewall should dynamically check for IP address updates, at least every 60 seconds.<\/p>\n<div class=\"notices red\">\n<p>Do not hard-code Adyen's IP addresses, because these can change over time. We do not share a list of our IP addresses publicly.<\/p>\n<\/div>\n<\/li>\n<li>\n<p>Open the ports:<\/p>\n<ul>\n<li><span translate=\"no\"><strong>tcp\/443<\/strong><\/span> to the internet.<\/li>\n<li><span translate=\"no\"><strong>tcp\/8443<\/strong><\/span> on your LAN.<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>Contact our <a href=\"https:\/\/ca-test.adyen.com\/ca\/ca\/contactUs\/support.shtml?form=other\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">Support Team<\/a> to enable web sockets for your account.<\/p>\n<\/li>\n<\/ol>\n<div class=\"notices blue\">\n<p>For more information, see <a href=\"\/point-of-sale\/design-your-integration\/network-and-connectivity\">Network and connectivity<\/a>.<\/p>\n<\/div>\n<h2 id=\"install-library\">Step 2 (optional): Install a GitHub API library<\/h2>\n<p>On our <a href=\"https:\/\/github.com\/adyen\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">GitHub<\/a>, we provide API libraries in several languages. Because the libraries are connected to managed package systems (Gradle, Maven, npm, NuGet) they are easy to include in your project.<br \/>\nInstalling a GitHub library is not required, but can save you development time, because a library includes all Terminal API models so you can use these to create requests. Most libraries also send requests to Adyen using a built-in HTTP client and construct the correct TEST and LIVE endpoints.<\/p>\n<p>The following GitHub libraries are available for a Terminal API integration that uses cloud communications:<\/p>\n<ul>\n<li>.NET - <a href=\"https:\/\/github.com\/Adyen\/adyen-dotnet-api-library\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">adyen-dotnet-api-library<\/a><\/li>\n<li>Java - <a href=\"https:\/\/github.com\/Adyen\/adyen-java-api-library\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">adyen-java-api-library<\/a><\/li>\n<li>Go - <a href=\"https:\/\/github.com\/Adyen\/adyen-go-api-library\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">adyen-go-api-library<\/a><\/li>\n<li>Node - <a href=\"https:\/\/github.com\/Adyen\/adyen-node-api-library\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">adyen-node-api-library<\/a><\/li>\n<li>PHP - <a href=\"https:\/\/github.com\/Adyen\/adyen-php-api-library\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">adyen-php-api-library<\/a><\/li>\n<li>Ruby - <a href=\"https:\/\/github.com\/Adyen\/adyen-ruby-api-library\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">adyen-ruby-api-library<\/a><\/li>\n<li>iOS\/macOS - <a href=\"https:\/\/github.com\/Adyen\/adyen-terminal-api-ios\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">adyen-terminal-api-ios<\/a>. This package is intended for following scenarios:\n<ul>\n<li>when integrating the <a href=\"\/point-of-sale\/ipp-mobile\">POS Mobile SDK<\/a><\/li>\n<li>when integrating server-side with Adyen payment terminals using cloud communications<\/li>\n<\/ul><\/li>\n<\/ul>\n<div class=\"sc-notice warning\"><div>\n<p>These GitHub libraries work with Terminal API and are completely separate from the <a href=\"\/point-of-sale\/classic-library-deprecation\">classic libraries, which are being deprecated<\/a>.<\/p>\n<\/div><\/div>\n<h2 id=\"build-payment-flow\">Step 3: Build your payment flow<\/h2>\n<p>When building your payment flow, decide how you want to receive the result of your Terminal API requests:<\/p>\n<ul>\n<li><a href=\"#sync\">Synchronously<\/a>, as an API response. The request returns the response with all the details.<\/li>\n<li><a href=\"#async\">Asynchronously<\/a>, from a webhook. The request returns <code>200 OK<\/code>. The response with all the details is sent to a webhook server that you set up for event notifications. For payments, you can also get the payment response by making a transaction status request.<\/li>\n<\/ul>\n<h3 id=\"sync\">Receiving a synchronous result<\/h3>\n<p>To receive the payment result synchronously:<\/p>\n<ul>\n<li>\n<p>Your POS app needs to make HTTPS requests to the synchronous endpoint:<br \/>\n<a href=\"https:\/\/terminal-api-test.adyen.com\/sync\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">https:\/\/terminal-api-test.adyen.com\/sync<\/a><br \/>\nThis request must use an extended time-out of more than 150 seconds. During this time the connection is kept alive and a synchronous response will follow.<\/p>\n<\/li>\n<li>\n<p>Optionally show <a href=\"\/point-of-sale\/design-your-integration\/notifications\/display-notifications\">display notifications<\/a> in your POS app.<br \/>\nDuring a transaction or <em><a href=\"\/get-started-with-adyen\/adyen-glossary\/#tender\">tender<\/a><\/em>, the payment terminal generates display notifications. You can show these in your POS app to keep your staff up-to-date on the progress of the tender. For example, whether the customer has selected Dynamic Currency Conversion, or finished entering their PIN.<\/p>\n<\/li>\n<li>\n<p>As a fallback in case the synchronous response is not received due to network or WebSocket connection issues, consider also setting up platform-generated <a href=\"\/development-resources\/webhooks\">standard webhooks<\/a>.<\/p>\n<\/li>\n<\/ul>\n<p><img alt=\"\" src=\"\/user\/pages\/docs\/03.point-of-sale\/04.design-your-integration\/06.choose-your-architecture\/02.cloud\/synchronous_flow.png\" \/><\/p>\n<p>The synchronous <a href=\"\/point-of-sale\/design-your-integration\/terminal-api#responses\">Terminal API payment response<\/a> provides:<\/p>\n<ul>\n<li>The result of the payment.<\/li>\n<li>Adyen's <a href=\"\/get-started-with-adyen\/adyen-glossary\/#psp-reference\">PSP reference<\/a> that uniquely identifies the transaction.<\/li>\n<li>Your unique transaction reference.<\/li>\n<li>Data that you can use to <a href=\"\/point-of-sale\/basic-tapi-integration\/generate-receipts\">generate a receipt<\/a>. You can generate a printed receipt, show it on the terminal display, or email it to the customer.<\/li>\n<\/ul>\n<h3 id=\"async\">Receiving an asynchronous result<\/h3>\n<p>If you do not want to use an extended time-out of 150 seconds, you can instead receive the response asynchronously. In this case:<\/p>\n<ul>\n<li>\n<p>Your POS app needs to make an HTTPS request to the asynchronous endpoint:<br \/>\n<a href=\"https:\/\/terminal-api-test.adyen.com\/async\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">https:\/\/terminal-api-test.adyen.com\/async<\/a><br \/>\nThis returns an HTTP status code of 200 OK when the terminal receives the request.<br \/>\nThe time between making the request and receiving the HTTP status code depends on the quality of the terminal's internet connection.<\/p>\n<\/li>\n<li>\n<p>To asynchronously receive the actual Terminal API response, you need to set up <a href=\"\/point-of-sale\/design-your-integration\/notifications\/event-notifications\">event notifications<\/a>. The terminal will send the Terminal API response over the WebSocket connection to your event notifications endpoint. However, you need to filter out the Terminal API responses from the event notifications.<\/p>\n<\/li>\n<li>\n<p>You need to <a href=\"\/point-of-sale\/design-your-integration\/notifications\/event-notifications#accept-event-notifications\">accept<\/a> the event notification with the Terminal API response when you receive it, by responding with a successful HTTP response status code.<\/p>\n<\/li>\n<li>\n<p>We retry sending asynchronous Terminal API responses up to three times, but only if the HTTP response code you send is <span translate=\"no\"><strong>5xx<\/strong><\/span>. Any other response code is treated as a success.<\/p>\n<\/li>\n<li>\n<p>As a fallback in case event notifications are not sent due to an issue with the WebSocket connection, consider also setting up platform-generated <a href=\"\/development-resources\/webhooks\">standard webhooks<\/a>.<\/p>\n<\/li>\n<li>\n<p>To synchronously receive data to generate a receipt, your POS app needs to make a <a href=\"\/point-of-sale\/basic-tapi-integration\/verify-transaction-status\">transaction status request<\/a> to the synchronous endpoint <a href=\"https:\/\/terminal-api-test.adyen.com\/sync\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">https:\/\/terminal-api-test.adyen.com\/sync<\/a>.<\/p>\n<\/li>\n<li>\n<p>Optionally show <a href=\"\/point-of-sale\/design-your-integration\/notifications\/display-notifications\">display notifications<\/a> in your POS app.<br \/>\nDuring a transaction or <em><a href=\"\/get-started-with-adyen\/adyen-glossary\/#tender\">tender<\/a><\/em>, the payment terminal generates display notifications. You can show these in your POS app to keep your staff up-to-date on the progress of the tender. For example, whether the customer has selected Dynamic Currency Conversion, or finished entering their PIN.<\/p>\n<\/li>\n<\/ul>\n<p><img alt=\"\" src=\"\/user\/pages\/docs\/03.point-of-sale\/04.design-your-integration\/06.choose-your-architecture\/02.cloud\/async_cloud_trans_status.svg?decoding=auto&amp;fetchpriority=auto\" \/><\/p>\n<p>Both the event notification with the <a href=\"\/point-of-sale\/design-your-integration\/terminal-api#responses\">Terminal API payment response<\/a> and the transaction status response provide:<\/p>\n<ul>\n<li>The result of the payment.<\/li>\n<li>Adyen's <a href=\"\/get-started-with-adyen\/adyen-glossary\/#psp-reference\">PSP reference<\/a> that uniquely identifies the transaction.<\/li>\n<li>Your unique transaction reference.<\/li>\n<li>Data that you can use to <a href=\"\/point-of-sale\/basic-tapi-integration\/generate-receipts\">generate a receipt<\/a>. You can generate a printed receipt, show it on the terminal display, or email it to the customer.<\/li>\n<\/ul>\n<h4 id=\"guarantee\">Guarantee payment response delivery<\/h4>\n<p>By default, we stop trying to send a payment response to your event notifications endpoint after three attempts. To make sure you do not miss a Terminal API response, you can enable the guarantee payment response delivery feature. It keeps sending the Terminal API response until your server acknowledges the webhook with a <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Status#successful_responses\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">successful HTTP response status code<\/a>, for example <strong>200<\/strong>.<\/p>\n<p>To enable the feature, contact the <a href=\"https:\/\/ca-test.adyen.com\/ca\/ca\/contactUs\/support.shtml?form=other\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">Support Team<\/a>.<\/p>\n<div class=\"notices blue\">\n<p>Because the <a href=\"\/point-of-sale\/design-your-integration\/notifications\/event-notifications#async-response\">Terminal API response<\/a> is sent asynchronously, the POS app might receive it in the middle of a different transaction.<\/p>\n<\/div>\n<h2 id=\"handle-network-issues\">Step 4: Handle network issues<\/h2>\n<p>To make your integration more resilient in case of connection issues, your integration should automatically <a href=\"\/point-of-sale\/basic-tapi-integration\/verify-transaction-status\">make a transaction status request<\/a> when it does not receive a payment response from Adyen.<\/p>\n<p>Payment requests time out after 150 seconds. If you do not receive a payment response (or a response indicating a time-out) after 150 seconds, your integration should automatically make a transaction status request.<\/p>\n<p>Displaying the result of the transaction status request in your POS app reduces the risk that your store staff will unnecessarily attempt to cancel or refund the transaction, or make a duplicate transaction.<\/p>\n<div class=\"notices blue\">\n<p>You can optionally request the status of a transaction before 150 seconds. For example, you may also want to let store staff manually request the status of a payment at any time from your POS app.<\/p>\n<\/div>\n<hr \/>\n<p>Now that you are familiar with how to build your integration, you can learn about the basics of our Terminal API.<\/p>","url":"https:\/\/docs.adyen.com\/point-of-sale\/design-your-integration\/choose-your-architecture\/cloud","articleFields":{"description":"Learn how to build an integration with cloud communications.","next_steps":[{"title":"Terminal API fundamentals","description":"Learn about our point of sale API.","url":"\/point-of-sale\/design-your-integration\/terminal-api","required":true},{"title":"Set up display notifications","description":"Keep your store staff informed of the transaction progress.","url":"\/point-of-sale\/design-your-integration\/notifications\/display-notifications","required":false},{"title":"Set up event notifications","description":"Receive asynchronous responses and notifications of terminal events.","url":"\/point-of-sale\/design-your-integration\/notifications\/event-notifications","required":false}],"last_edit_on":"29-08-2023 10:29","feedback_component":true,"filters_component":false,"page_id":"31480c5f-8906-46b5-95b7-61b85d287f23","parameters":{"built_integration":"<a href=\"\/online-payments\/build-your-integration\/advanced-flow?platform=Web&integration=Components\">Built a Components integration<\/a>","logo_1":"![](\/reuse\/development-resources\/additional-info-resources\/java-original.svg?resize=25)","example_1":"[Java Spring](https:\/\/github.com\/adyen-examples\/adyen-java-spring-online-payments\/tree\/main\/in-person-payments-example)","logo_2":"![](\/reuse\/development-resources\/additional-info-resources\/dot-net-original.svg?resize=25)","example_2":"[.NET](https:\/\/github.com\/adyen-examples\/adyen-dotnet-online-payments\/tree\/main\/in-person-payments-example)","logo_3":"![](\/reuse\/development-resources\/additional-info-resources\/nodejs-original.svg?resize=25)","example_3":"[Node.js](https:\/\/github.com\/adyen-examples\/adyen-node-online-payments\/tree\/main\/in-person-payments-example)"},"decision_tree":"[]"},"algolia":{"url":"https:\/\/docs.adyen.com\/point-of-sale\/design-your-integration\/choose-your-architecture\/cloud","title":"Building a cloud integration","content":"\n&nbsp;&nbsp;Postman collectionImplementation examples&nbsp;&nbsp;Java Spring&nbsp;&nbsp;.NET&nbsp;&nbsp;Node.js\n\nWith an integration that uses cloud communications, your POS app and the payment terminal communicate with each other over the internet:\n\nYour POS app makes an API request to the Adyen payments platform.\nThe Adyen payments platform routes the request to your payment terminal, to start the payment on the device.\nThe terminal sends the transaction to the Adyen payments platform for processing.\nYou receive the result of the transaction synchronously or asynchronously, depending on how you build your integration:\n\nSynchronously: when your POS app makes an API request, it keeps the connection open until the transaction result is known.\nAsynchronously: your POS app makes an API request, then closes the connection. You receive the transaction result including the receipt data in an event notification or by making a transaction status request.\n\n\nTo build a cloud integration, you need to:\n\nConfigure your network.\nOptionally install an API library.\nBuild your payment flow.\nLearn how to handle network issues.\n\nStep 1: Configure your network\nTo enable your POS app to connect to Adyen:\n\n\nAdd Adyen's domains to your firewall's allowlist.\nConfigure your firewall to allow outgoing HTTPS traffic from the IP addresses of your POS apps and terminals to:\n\n*.adyen.com\n*.adyenpayments.com\n\nAllowlisting should be based on the DNS name of these URLs. Your firewall should dynamically check for IP address updates, at least every 60 seconds.\n\nDo not hard-code Adyen's IP addresses, because these can change over time. We do not share a list of our IP addresses publicly.\n\n\n\nOpen the ports:\n\ntcp\/443 to the internet.\ntcp\/8443 on your LAN.\n\n\n\nContact our Support Team to enable web sockets for your account.\n\n\n\nFor more information, see Network and connectivity.\n\nStep 2 (optional): Install a GitHub API library\nOn our GitHub, we provide API libraries in several languages. Because the libraries are connected to managed package systems (Gradle, Maven, npm, NuGet) they are easy to include in your project.\nInstalling a GitHub library is not required, but can save you development time, because a library includes all Terminal API models so you can use these to create requests. Most libraries also send requests to Adyen using a built-in HTTP client and construct the correct TEST and LIVE endpoints.\nThe following GitHub libraries are available for a Terminal API integration that uses cloud communications:\n\n.NET - adyen-dotnet-api-library\nJava - adyen-java-api-library\nGo - adyen-go-api-library\nNode - adyen-node-api-library\nPHP - adyen-php-api-library\nRuby - adyen-ruby-api-library\niOS\/macOS - adyen-terminal-api-ios. This package is intended for following scenarios:\n\nwhen integrating the POS Mobile SDK\nwhen integrating server-side with Adyen payment terminals using cloud communications\n\n\n\nThese GitHub libraries work with Terminal API and are completely separate from the classic libraries, which are being deprecated.\n\nStep 3: Build your payment flow\nWhen building your payment flow, decide how you want to receive the result of your Terminal API requests:\n\nSynchronously, as an API response. The request returns the response with all the details.\nAsynchronously, from a webhook. The request returns 200 OK. The response with all the details is sent to a webhook server that you set up for event notifications. For payments, you can also get the payment response by making a transaction status request.\n\nReceiving a synchronous result\nTo receive the payment result synchronously:\n\n\nYour POS app needs to make HTTPS requests to the synchronous endpoint:\nhttps:\/\/terminal-api-test.adyen.com\/sync\nThis request must use an extended time-out of more than 150 seconds. During this time the connection is kept alive and a synchronous response will follow.\n\n\nOptionally show display notifications in your POS app.\nDuring a transaction or tender, the payment terminal generates display notifications. You can show these in your POS app to keep your staff up-to-date on the progress of the tender. For example, whether the customer has selected Dynamic Currency Conversion, or finished entering their PIN.\n\n\nAs a fallback in case the synchronous response is not received due to network or WebSocket connection issues, consider also setting up platform-generated standard webhooks.\n\n\n\nThe synchronous Terminal API payment response provides:\n\nThe result of the payment.\nAdyen's PSP reference that uniquely identifies the transaction.\nYour unique transaction reference.\nData that you can use to generate a receipt. You can generate a printed receipt, show it on the terminal display, or email it to the customer.\n\nReceiving an asynchronous result\nIf you do not want to use an extended time-out of 150 seconds, you can instead receive the response asynchronously. In this case:\n\n\nYour POS app needs to make an HTTPS request to the asynchronous endpoint:\nhttps:\/\/terminal-api-test.adyen.com\/async\nThis returns an HTTP status code of 200 OK when the terminal receives the request.\nThe time between making the request and receiving the HTTP status code depends on the quality of the terminal's internet connection.\n\n\nTo asynchronously receive the actual Terminal API response, you need to set up event notifications. The terminal will send the Terminal API response over the WebSocket connection to your event notifications endpoint. However, you need to filter out the Terminal API responses from the event notifications.\n\n\nYou need to accept the event notification with the Terminal API response when you receive it, by responding with a successful HTTP response status code.\n\n\nWe retry sending asynchronous Terminal API responses up to three times, but only if the HTTP response code you send is 5xx. Any other response code is treated as a success.\n\n\nAs a fallback in case event notifications are not sent due to an issue with the WebSocket connection, consider also setting up platform-generated standard webhooks.\n\n\nTo synchronously receive data to generate a receipt, your POS app needs to make a transaction status request to the synchronous endpoint https:\/\/terminal-api-test.adyen.com\/sync.\n\n\nOptionally show display notifications in your POS app.\nDuring a transaction or tender, the payment terminal generates display notifications. You can show these in your POS app to keep your staff up-to-date on the progress of the tender. For example, whether the customer has selected Dynamic Currency Conversion, or finished entering their PIN.\n\n\n\nBoth the event notification with the Terminal API payment response and the transaction status response provide:\n\nThe result of the payment.\nAdyen's PSP reference that uniquely identifies the transaction.\nYour unique transaction reference.\nData that you can use to generate a receipt. You can generate a printed receipt, show it on the terminal display, or email it to the customer.\n\nGuarantee payment response delivery\nBy default, we stop trying to send a payment response to your event notifications endpoint after three attempts. To make sure you do not miss a Terminal API response, you can enable the guarantee payment response delivery feature. It keeps sending the Terminal API response until your server acknowledges the webhook with a successful HTTP response status code, for example 200.\nTo enable the feature, contact the Support Team.\n\nBecause the Terminal API response is sent asynchronously, the POS app might receive it in the middle of a different transaction.\n\nStep 4: Handle network issues\nTo make your integration more resilient in case of connection issues, your integration should automatically make a transaction status request when it does not receive a payment response from Adyen.\nPayment requests time out after 150 seconds. If you do not receive a payment response (or a response indicating a time-out) after 150 seconds, your integration should automatically make a transaction status request.\nDisplaying the result of the transaction status request in your POS app reduces the risk that your store staff will unnecessarily attempt to cancel or refund the transaction, or make a duplicate transaction.\n\nYou can optionally request the status of a transaction before 150 seconds. For example, you may also want to let store staff manually request the status of a payment at any time from your POS app.\n\n\nNow that you are familiar with how to build your integration, you can learn about the basics of our Terminal API.","type":"page","locale":"en","boost":16,"hierarchy":{"lvl0":"Home","lvl1":"In-person payments","lvl2":"Design your integration","lvl3":"Choose an integration architecture","lvl4":"Building a cloud integration"},"hierarchy_url":{"lvl0":"https:\/\/docs.adyen.com\/","lvl1":"https:\/\/docs.adyen.com\/point-of-sale","lvl2":"https:\/\/docs.adyen.com\/point-of-sale\/design-your-integration","lvl3":"https:\/\/docs.adyen.com\/point-of-sale\/design-your-integration\/choose-your-architecture","lvl4":"\/point-of-sale\/design-your-integration\/choose-your-architecture\/cloud"},"levels":5,"category":"In-person payments","category_color":"green","tags":["Building","cloud","integration"]},"articleFiles":{"synchronous_flow.png":"<img alt=\"\" src=\"https:\/\/docs.adyen.com\/user\/pages\/docs\/03.point-of-sale\/04.design-your-integration\/06.choose-your-architecture\/02.cloud\/synchronous_flow.png\" \/>","async_cloud_trans_status.svg":"<img alt=\"\" src=\"https:\/\/docs.adyen.com\/user\/pages\/docs\/03.point-of-sale\/04.design-your-integration\/06.choose-your-architecture\/02.cloud\/async_cloud_trans_status.svg?decoding=auto&amp;fetchpriority=auto\" \/>","postman-logo-vertical-orange-2021.svg":"<img style=\"width: 25px;\" alt=\"\" src=\"https:\/\/docs.adyen.com\/user\/pages\/docs\/03.point-of-sale\/04.design-your-integration\/06.choose-your-architecture\/02.cloud\/postman-logo-vertical-orange-2021.svg?decoding=auto&amp;fetchpriority=auto\" \/>"}}
