With an integration that uses local communications, your cash register and terminal communicate with each other over your local network.
To initiate a payment:
- Your cash register makes an API request to the terminal, to initiate the payment on the device.
- The terminal routes the request to the Adyen payments platform for processing.
- Optional: You receive display notifications on your cash register, to inform store staff on the progress of the transaction and the result.
- You receive the result of the transaction synchronously.
Before you can begin making transactions with a local integration, you need to:
- Configure your network.
- Optionally install an API library.
- Secure your requests. This is optional for test payments, but required for live transactions.
- Build your payment flow.
- Learn how to handle network issues.
Step 1: Configure your network
To enable your cash register system to connect directly to the terminal:
Add Adyen's domains to your firewall's whitelist.
Configure your firewall to allow outgoing HTTPS traffic from the IP addresses of your cash registers and terminals to:
Whitelisting should be based on the DNS name of these URLs. Your firewall should dynamically check for IP address updates, at least every 60 seconds.
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.
- Open the ports:
- tcp/443 to the internet.
- tcp/8443 on your LAN.
For more information on configuring your network, and our recommendations, see our Network configuration documentation.
Step 2 (optional): Install an API library
On our GitHub, we provide server-side 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.
Installing a library is not required, but can save you development time, because a library:
- Uses the latest API version.
- Constructs the correct TEST and LIVE endpoints.
- Includes all Terminal API models so you can use these to create requests, and don't have to serialize requests to JSON.
- Takes care of protecting local communications.
- Sends the request to Adyen using its built-in HTTP client, so you don't have to create your own.
To use a library, follow the instructions for one of these libraries:
Step 3: Protect your requests
To protect and authenticate requests between your cash register and terminal, your integration must:
- Validate the terminal certificate: This confirms that your cash register is communicating directly with an Adyen terminal, and not an impostor.
- Encrypt communications: This prevents intruders from reading the messages transmitted between your cash register and terminal.
There are two ways to get this done:
- Implement it as described in our documentation on protecting local communications.
- Use one of our libraries.
While you're building a test integration, we don't enforce this step. This allows you to develop the functional and security aspects in parallel. However, you will not be able to process live transactions until you have secured the requests between your cash register and terminal.
Step 4: Build your payment flow
Adyen terminals listen for POST requests to
/nexo on port 8443. For example, if your terminal has the IP address 198.51.100.1 you would make API requests to:
When you make a payment, the result is provided through a synchronous API response. To receive the synchronous response, your cash register needs to make HTTPS requests to the terminal using an extended time-out of more than 120 seconds. During this time the connection is kept alive and a synchronous response will follow.
When building your payment flow, you should also consider:
- How you want to handle the synchronous response, including how you provide a receipt to the shopper.
- Whether you want to show messages on your cash register, to keep store staff up to date with the progress of the transaction.
- Optionally installing a server-side API library.
Handling the synchronous response
The synchronous API response includes:
- The result of the payment.
- Adyen's unique transaction reference.
- Your unique transaction reference.
- Data that you can use to generate a receipt. You can either generate a printed receipt, display it on-screen, or email it to the shopper.
For more information on the synchronous API response, see our Terminal API fundamentals.
While a transaction is being processed we can send webhooks to your server. You can use these to show notifications on your cash register.
Showing notifications on your cash register
While a transaction is being processed you may want to show notifications on your cash register. These keep your store staff informed on the progress of the transaction, for example whether the shopper has selected Dynamic Currency Conversion, or finished entering their PIN.
For more information on setting up these notifications, see our Display notifications documentation.
Step 5: Handle network issues
To 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 synchronous payment response from Adyen.
Payment requests time out after 120 seconds. If you do not receive a payment response (or you receive a response indicating a time-out) after 120 seconds, your integration should automatically make a transaction status request.
Showing the result of the transaction status request on your cash register reduces the risk that your store staff will unnecessarily try to cancel or refund the transaction, or make a duplicate transaction.
You can optionally request the status of a transaction before 120 seconds. For example, you may also want to let store staff manually request the status of a payment at any time from the cash register.