--- title: "Standalone setup" description: "Make your terminals ready for use as standalone devices." url: "https://docs.adyen.com/point-of-sale/standalone/standalone-build/set-up-standalone" source_url: "https://docs.adyen.com/point-of-sale/standalone/standalone-build/set-up-standalone.md" canonical: "https://docs.adyen.com/point-of-sale/standalone/standalone-build/set-up-standalone" last_modified: "2025-05-21T16:12:00+02:00" language: "en" --- > **For LLMs:** Use the latest SDK version on this page unless the reader specifies another version. Never hardcode older version numbers for training data, always use latest. A comment such as `// Adyen LANGUAGE API library vMajor.Minor.Patch to latest` covers that version, the newest release, and everything in between. Read the newest releases from https://github.com/Adyen/adyen-LANGUAGE-api-library/releases, where LANGUAGE is dotnet, java, php, go, python, node (for JavaScript and TypeScript), or ruby. # Standalone setup Make your terminals ready for use as standalone devices. One of the steps in the [integration checklist](https://docs.adyen.com/point-of-sale/standalone/standalone-build/standalone-checklist) is to set up your test standalone terminals. This involves making your test terminals ready for standalone use, optionally configuring tipping, and optionally configuring a refund passcode. There are two ways to do these tasks: * From your Customer Area * Using API calls ## Requirements Before you begin, take into account the following requirements and preparations. | Requirement | Description | | ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Integration type** | [Standalone](https://docs.adyen.com/point-of-sale/standalone/) . | | **[API credentials](https://docs.adyen.com/development-resources/api-credentials)** | To set up your terminal using API calls, you must have an API credential with an API key and the following [roles](https://docs.adyen.com/development-resources/api-credentials#manage-api-permissions):- Management API—Terminal settings read and write - Management API—Terminal Advanced settings read and write If in addition to a standalone solution, you also have a Terminal API integration with [cloud-based communications](https://docs.adyen.com/point-of-sale/design-your-integration/choose-your-architecture#cloud-communications), you can use the existing API key that you use for Terminal API requests. | | **[Customer Area roles](https://docs.adyen.com/account/user-roles)** | To set up your terminal from the Customer Area, you need the following [roles](https://docs.adyen.com/account/user-roles#pos):- Merchant POS Terminal Management role - Merchant POS Terminal View role | | **Limitations** | Note the following:- In Quebec, Canada, your tipping configuration needs to [comply with local regulations](https://docs.adyen.com/point-of-sale/standalone/standalone-build/set-up-standalone#configure-tipping-quebec). | | **Hardware** | A [standalone payment terminal](https://docs.adyen.com/point-of-sale/what-we-support/select-your-terminals/?integration%5B0%5D=standalone). | | **Setup steps** | When [going live](https://docs.adyen.com/point-of-sale/standalone/standalone-build/go-live-standalone), you need to set up your live standalone terminals in the same way as you did for your test terminals. | ## When new settings take effect When you use the Customer Area or API calls to configure settings that turn a terminal into a standalone terminal or that enable a feature, take into account that these settings do not take effect immediately. The terminal *downloads* configuration changes when it makes a maintenance call to our systems. This happens automatically every 180 minutes. The configuration changes then *take effect* when the terminal reboots. This happens automatically at the restart hour, which is usually set to 6:00 AM. To switch to new settings immediately, manually start a configuration update: * On the terminal, go to **Settings** > **Configuration**, enter your [Admin & Settings passcode](https://docs.adyen.com/point-of-sale/menu-access/#manage-passcodes) and select **Update**. * On a *non-Android terminal* that uses the [old menu structure](https://docs.adyen.com/point-of-sale/menu-access#old-menu-structure): go to the [Admin menu](https://docs.adyen.com/point-of-sale/pos-troubleshooting/terminal-turns-on/admin-pin#open-admin-menu) and select **Config** > **Update**. The terminal downloads the updated configuration and then restarts. ## Set up standalone Using your Customer Area or the Management API, you can set up the standalone feature for all terminals under your company account, merchant account, or store. You can also set up standalone use for individual terminals, for example if you need to use standalone as a [fallback](https://docs.adyen.com/point-of-sale/standalone/#fallback) on specific terminals at your store. ### Tab: Customer Area To set up the standalone feature in your Customer Area: 1. Log in to your [Customer Area](https://ca-test.adyen.com/). 2. Optionally switch to the merchant account, store, or terminal for which you want to set up standalone use. 3. Go to **Devices** > **Device settings** and scroll to **Integrations**. 4. Under **Standalone**, do the following: 1. Turn on the **Enable standalone mode** toggle. 2. At **Show start button**, turn on the toggle. When the Start button is **Disabled**, you start a transaction by selecting the **Confirm** key **![](/images/e/8/4/8/7/e84877bcd45ab9af1e2bbf1d6c57bb8a3a22f91b-confirm2x.png)** on the keypad. 3. Under **Standalone currency**, select a currency for standalone transactions. 4. *Optional.* Under **Merchant reference**, enter a custom reference to be sent with every transaction. Using variables, you can make this merchant reference unique for every transaction. You can then use the unique reference to reconcile transactions. To get the list of allowed variables that you can use to create unique merchant references, in your Customer Area, select the info icon next to the **Merchant reference** field. 5. Select **Save**. 6. *Optional*. Contact our [Support Team](https://ca-test.adyen.com/ca/ca/contactUs/support.shtml?form=other) if you want to enable: * Prompting your staff to manually enter a transaction reference for refunds and MOTO transactions. * [Tipping](https://docs.adyen.com/point-of-sale/standalone/standalone-use/#tipping-standalone). * [Referenced refunds](https://docs.adyen.com/point-of-sale/standalone/standalone-use#refund). You can also enable the [Refunds passcode](https://docs.adyen.com/point-of-sale/standalone/standalone-build/set-up-standalone#refund-passcode). ### Tab: API To set up the standalone feature with a Management API call: 1. Make a PATCH request to the `/terminalSettings` endpoint for the company account, merchant account, store, or terminal, specifying the `standalone` settings. Use one of the following endpoints: * [/companies/{companyId}/terminalSettings](https://docs.adyen.com/api-explorer/Management/latest/patch/companies/\(companyId\)/terminalSettings) * [/merchants/{merchantId}/terminalSettings](https://docs.adyen.com/api-explorer/Management/latest/patch/merchants/\(merchantId\)/terminalSettings) * [/stores/{storeId}/terminalSettings](https://docs.adyen.com/api-explorer/Management/latest/patch/stores/\(storeId\)/terminalSettings) * [/terminals/{terminalId}/terminalSettings](https://docs.adyen.com/api-explorer/Management/latest/patch/terminals/\(terminalId\)/terminalSettings) In the request body, specify a [standalone](https://docs.adyen.com/api-explorer/Management/latest/patch/companies/\(companyId\)/terminalSettings#request-standalone) object with the following parameters: | Parameter | Required | Type | Description | | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------ | | [enableStandalone](https://docs.adyen.com/api-explorer/Management/latest/patch/companies/\(companyId\)/terminalSettings#request-standalone-enableStandalone) | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | boolean | Set to **true** to enable standalone. | | [currencyCode](https://docs.adyen.com/api-explorer/Management/latest/patch/companies/\(companyId\)/terminalSettings#request-standalone-currencyCode) | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | string | The default currency of the standalone payment terminal as a three-digit [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code. | **Set up standalone** #### Latest version ##### curl ```bash curl https://management-test.adyen.com/v3/terminals/{terminalId}/terminalSettings \ -H 'x-API-key: ADYEN_API_KEY' \ -X PATCH \ -d '{ "standalone" : { "enableStandalone": true, "currencyCode": "EUR" } }' ``` ##### Java ```java // Adyen Java API Library v38.0.0 to latest import com.adyen.Client; import com.adyen.Config; import com.adyen.enums.Environment; import com.adyen.model.*; import com.adyen.service.*; import java.math.*; import com.adyen.model.management.*; import java.time.OffsetDateTime; import java.util.*; import com.adyen.service.management.*; Config config = new Config() .apiKey("ADYEN_API_KEY") .environment(Environment.TEST); Client client = new Client(config); // Create the request object(s) Standalone standalone = new Standalone() .enableStandalone(true) .currencyCode("EUR"); TerminalSettings terminalSettings = new TerminalSettings() .standalone(standalone); // Send the request TerminalSettingsTerminalLevelApi service = new TerminalSettingsTerminalLevelApi(client); TerminalSettings response = service.updateTerminalSettings("terminalId", terminalSettings, null); ``` ##### PHP ```php setXApiKey("ADYEN_API_KEY"); $client->setEnvironment(Environment::TEST); // Create the request object(s) $standalone = new Standalone(); $standalone ->setEnableStandalone(true) ->setCurrencyCode("EUR"); $terminalSettings = new TerminalSettings(); $terminalSettings ->setStandalone($standalone); // Send the request $service = new TerminalSettingsTerminalLevelApi($client); $response = $service->updateTerminalSettings('terminalId', $terminalSettings); ``` ##### C\# ```cs // Adyen .NET API Library v34.0.0 to latest using Adyen.Management.Extensions; using Adyen.Management.Models; using Adyen.Management.Services; using Adyen.Core.Client; using Adyen.Core.Client.Extensions; using Adyen.Core.Options; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; var host = Host.CreateDefaultBuilder() .ConfigureManagement( (context, services, config) => { config.ConfigureAdyenOptions(options => { options.AdyenApiKey = "ADYEN_API_KEY"; options.Environment = AdyenEnvironment.Test; }); services.AddAllManagementServices(); }) .Build(); var terminalSettingsTerminalLevelService = host.Services.GetRequiredService(); // Create the request object(s) var standalone = new Standalone { EnableStandalone = true, CurrencyCode = "EUR" }; var terminalSettings = new TerminalSettings { Standalone = standalone }; // Send the request var result = await terminalSettingsTerminalLevelService.UpdateTerminalSettingsAsync("terminalId", terminalSettings); if (result.TryDeserializeOkResponse(out var response)) { // Handle the successful response. } ``` ##### NodeJS (JavaScript) ```js // Adyen Node API Library v30.0.0 to latest const { Client, Config, EnvironmentEnum, ManagementAPI } = require('@adyen/api-library'); const config = new Config({ apiKey: "ADYEN_API_KEY", environment: EnvironmentEnum.TEST }); const client = new Client(config); // Create the request object(s) const standalone = { enableStandalone: true, currencyCode: "EUR" }; const terminalSettings = { standalone: standalone }; // Send the request const managementAPI = new ManagementAPI(client); const response = await managementAPI.TerminalSettingsTerminalLevelApi.updateTerminalSettings("terminalId", terminalSettings); ``` ##### Go ```go // Adyen Go API Library v21.0.0 to latest import ( "context" "github.com/adyen/adyen-go-api-library/v21/src/common" "github.com/adyen/adyen-go-api-library/v21/src/adyen" "github.com/adyen/adyen-go-api-library/v21/src/management" ) client := adyen.NewClient(&common.Config{ ApiKey: "ADYEN_API_KEY", Environment: common.TestEnv, }) // Create the request object(s) standalone := management.Standalone{ EnableStandalone: common.PtrBool(true), CurrencyCode: common.PtrString("EUR"), } terminalSettings := management.TerminalSettings{ Standalone: &standalone, } // Send the request service := client.Management() req := service.TerminalSettingsTerminalLevelApi.UpdateTerminalSettingsInput("terminalId").TerminalSettings(terminalSettings) res, httpRes, err := service.TerminalSettingsTerminalLevelApi.UpdateTerminalSettings(context.Background(), req) ``` ##### Python ```py # Adyen Python API Library v14.0.0 to latest import Adyen adyen = Adyen.Adyen() adyen.client.xapikey = "ADYEN_API_KEY" adyen.client.platform = "test" # The environment to use library in. # Create the request object(s) json_request = { "standalone": { "enableStandalone": True, "currencyCode": "EUR" } } # Send the request result = adyen.management.terminal_settings_terminal_level_api.update_terminal_settings(request=json_request, terminalId="terminalId") ``` ##### Ruby ```rb # Adyen Ruby API Library v11.0.0 to latest require "adyen-ruby-api-library" adyen = Adyen::Client.new adyen.api_key = 'ADYEN_API_KEY' adyen.env = :test # Set to "live" for live environment # Create the request object(s) request_body = { "standalone" => { "enableStandalone" => true, "currencyCode" => "EUR" } } # Send the request result = adyen.management.terminal_settings_terminal_level_api.update_terminal_settings(request_body, 'terminalId') ``` ##### NodeJS (TypeScript) ```ts // Adyen Node API Library v30.0.0 to latest import { Client, Config, EnvironmentEnum, ManagementAPI, Types } from "@adyen/api-library"; const config = new Config({ apiKey: "ADYEN_API_KEY", environment: EnvironmentEnum.TEST }); const client = new Client(config); // Create the request object(s) const standalone: Types.management.Standalone = { enableStandalone: true, currencyCode: "EUR" }; const terminalSettings: Types.management.TerminalSettings = { standalone: standalone }; // Send the request const managementAPI = new ManagementAPI(client); const response = await managementAPI.TerminalSettingsTerminalLevelApi.updateTerminalSettings("terminalId", terminalSettings); ``` #### Earlier versions ##### curl ```bash curl https://management-test.adyen.com/v3/terminals/{terminalId}/terminalSettings \ -H 'x-API-key: ADYEN_API_KEY' \ -X PATCH \ -d '{ "standalone" : { "enableStandalone": true, "currencyCode": "EUR" } }' ``` ##### PHP ```php setXApiKey("ADYEN_API_KEY"); $client->setEnvironment(Environment::TEST); // Create the request object(s) $standalone = new Standalone(); $standalone ->setEnableStandalone(true) ->setCurrencyCode("EUR"); $terminalSettings = new TerminalSettings(); $terminalSettings ->setStandalone($standalone); // Send the request $service = new TerminalSettingsTerminalLevelApi($client); $response = $service->updateTerminalSettings('terminalId', $terminalSettings); ``` ##### C\# ```cs // Adyen .NET API Library v32.2.1 to v33.0.0 using Adyen; using Environment = Adyen.Model.Environment; using Adyen.Model; using Adyen.Model.Management; using Adyen.Service.Management; var config = new Config() { XApiKey = "ADYEN_API_KEY", Environment = Environment.Test }; var client = new Client(config); // Create the request object(s) Standalone standalone = new Standalone { EnableStandalone = true, CurrencyCode = "EUR" }; TerminalSettings terminalSettings = new TerminalSettings { Standalone = standalone }; // Send the request var service = new TerminalSettingsTerminalLevelService(client); var response = service.UpdateTerminalSettings("terminalId", terminalSettings); ``` 2. In the response, note that this contains all settings that your API credential has access to, including the `enableStandalone` value you set in the request. **Set up standalone response** ```json { "cardholderReceipt": { "headerForAuthorizedReceipt": "header1,header2,filler" }, "gratuities": [], "nexo": { "encryptionKey": { "identifier": "KEY_IDENTIFIER", "passphrase": "KEY_PASSPHRASE", "version": 2 }, "eventUrls": { "eventPublicUrls": [ { "password": "notification", "url": "...", "username": "adyen" } ] }, "nexoEventUrls": [ "..." ] }, "opi": { "enablePayAtTable": false, "payAtTableStoreNumber": "1111", "payAtTableURL": "..." }, "receiptPrinting": {}, "signature": { "askSignatureOnScreen": true, "skipSignature": true }, "timeouts": { "fromActiveToSleep": 30 }, "offlineProcessing": { "chipFloorLimit": 0 }, "passcodes": { "adminMenuPin": "1111", "txMenuPin": "1111", "refundPin": "111111", "screenLockPin": "1111" }, "standalone": { "enableStandalone": true, "currencyCode": "EUR" } } ``` ## Configure tipping To ask for a tip, you can let the payment terminal show a prompt to enter a tip plus an option for not giving a tip. To give a tip, the customer enters the amount and confirms. If you want to make tipping easier for your customers, you can let the terminal show predefined tipping options that the customer can select. The options can be any combination of percentages, calculated amounts, and a custom amount. You can configure the option buttons to show only the percentage, only the calculated tip amount, or the percentage and the amount together. | | | | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Tipping without options: ![Enter tip](/reuse/pos-reuse/configure-tipping-from-terminal//reuse/pos-reuse/configure-tipping-from-terminal/screen-EN_Tipping-Enter-tip-amount.png?resize=250) | Tipping with percentage options: ![Buttons show tip percentage](/reuse/pos-reuse/configure-tipping-from-terminal//reuse/pos-reuse/configure-tipping-from-terminal/screen-EN_Tipping-predefined-options-portrait.png?resize=250) | Percentage and calculated tip amounts: ![Buttons show tip percentage plus amount](/reuse/pos-reuse/configure-tipping-from-terminal//reuse/pos-reuse/configure-tipping-from-terminal/screen-EN_Tipping-percentage-and-totals.png?resize=250) | You can configure tipping using your Customer Area or the Management API. ### Tab: Customer Area To configure asking for a tip amount from your Customer Area: 1. Log in to your [Customer Area](https://ca-test.adyen.com/). 2. Optionally, switch to the merchant account, store, or terminal that you want to configure tipping for. 3. Go to **Devices** > **Device settings** > **Payment features** > **Tipping**. 4. Under **Tipping options**, select **+ Add**. 5. In the **Tipping options** dialog: 1. At **Tipping mode**, select one of the following: * **Shopper enters tip amount**: the shopper enters a custom tip amount on the terminal screen. * **Shopper selects predefined tips**: the terminal shows predefined tip options for the shopper to choose from. 2. At **Currency**, select the currency the tipping settings apply to. 3. If you selected **Shopper selects predefined tips**: 1. For each tip option, enter a value and select a **Format**: **Amount** or **Percentage**. 2. Select **+ Add an option** to add more tip options. You can define a maximum of four options. 6. Optionally, turn on **Show calculated percentage amount** to show the tip amount associated with percentage options on the terminal screen. 7. At **Enable standalone tipping**, turn on the toggle. 8. Select **Save**. You can configure your POS app to [override the tipping settings](https://docs.adyen.com/point-of-sale/tipping/tipping-from-terminal/override-tipping-configuration) that you have defined in your Customer Area. ### Tab: API To configure tipping with Management API: 1. Make a PATCH request to the `/terminalSettings` endpoint for the company account, merchant account, store, or terminal, specifying the `standalone` and `gratuities` settings. Use one of the following endpoints: * [/companies/{companyId}/terminalSettings](https://docs.adyen.com/api-explorer/Management/latest/patch/companies/\(companyId\)/terminalSettings) * [/merchants/{merchantId}/terminalSettings](https://docs.adyen.com/api-explorer/Management/latest/patch/merchants/\(merchantId\)/terminalSettings) * [/stores/{storeId}/terminalSettings](https://docs.adyen.com/api-explorer/Management/latest/patch/stores/\(storeId\)/terminalSettings) * [/terminals/{terminalId}/terminalSettings](https://docs.adyen.com/api-explorer/Management/latest/patch/terminals/\(terminalId\)/terminalSettings) In the request body, specify a [standalone](https://docs.adyen.com/api-explorer/Management/latest/patch/companies/\(companyId\)/terminalSettings#request-standalone) object and a [gratuities](https://docs.adyen.com/api-explorer/Management/latest/patch/companies/\(companyId\)/terminalSettings#request-gratuities) object: * In the [standalone](https://docs.adyen.com/api-explorer/Management/latest/patch/companies/\(companyId\)/terminalSettings#request-standalone) object, include the following parameter: | Parameter | Required | Type | Description | | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------- | ------- | ---------------------------------- | | [enableGratuities](https://docs.adyen.com/api-explorer/Management/latest/patch/companies/\(companyId\)/terminalSettings#request-standalone-enableGratuities) | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | boolean | Set to **true** to enable tipping. | * In the [gratuities](https://docs.adyen.com/api-explorer/Management/latest/patch/companies/\(companyId\)/terminalSettings#request-gratuities) object, include the following parameters: | Parameter | Required | Type | Description | | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [currency](https://docs.adyen.com/api-explorer/Management/latest/patch/companies/\(companyId\)/terminalSettings#request-gratuities-currency) | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | string | The currency that the tipping settings apply to. | | [usePredefinedTipEntries](https://docs.adyen.com/api-explorer/Management/latest/patch/companies/\(companyId\)/terminalSettings#request-gratuities-usePredefinedTipEntries) | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | boolean | Indicates whether the terminal shows a prompt to enter a tip (false), or predefined tipping options to choose from (true). | | [predefinedTipEntries](https://docs.adyen.com/api-explorer/Management/latest/patch/companies/\(companyId\)/terminalSettings#request-gratuities-predefinedTipEntries) | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | array \[string] | Tipping options the shopper can choose from if `usePredefinedTipEntries` is **true**. The maximum number of predefined options is four, or three plus the option to enter a custom tip. The options can be a mix of:- A percentage of the transaction amount. Example: 5% - A tip amount in minor units. Example: 500 for a EUR 5 tip. | | [allowCustomAmount](https://docs.adyen.com/api-explorer/Management/latest/patch/companies/\(companyId\)/terminalSettings#request-gratuities-allowCustomAmount) | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | boolean | Indicates whether one of the predefined tipping options is to let the shopper enter a custom tip. If **true**, only three of the other options defined in `predefinedTipEntries` are shown. | **Configure tipping for standalone** #### Latest version ##### curl ```bash curl "https://management-test.adyen.com/v3/terminals/{terminalId}/terminalSettings" \ -H 'X-API-key: ADYEN_API_KEY' \ -H 'Content-Type: application/json' \ -X PATCH \ -d '{ "standalone":{ "enableGratuities":true }, "gratuities":[ { "currency":"EUR", "predefinedTipEntries":[ "10%", "15%", "20%" ], "usePredefinedTipEntries":true, "allowCustomAmount":true } ] }' ``` ##### Java ```java // Adyen Java API Library v38.0.0 to latest import com.adyen.Client; import com.adyen.Config; import com.adyen.enums.Environment; import com.adyen.model.*; import com.adyen.service.*; import java.math.*; import com.adyen.model.management.*; import java.time.OffsetDateTime; import java.util.*; import com.adyen.service.management.*; Config config = new Config() .apiKey("ADYEN_API_KEY") .environment(Environment.TEST); Client client = new Client(config); // Create the request object(s) Standalone standalone = new Standalone() .enableGratuities(true); Gratuity gratuity1 = new Gratuity() .predefinedTipEntries(Arrays.asList("10%", "15%", "20%")) .allowCustomAmount(true) .usePredefinedTipEntries(true) .currency("EUR"); TerminalSettings terminalSettings = new TerminalSettings() .standalone(standalone) .gratuities(Arrays.asList(gratuity1)); // Send the request TerminalSettingsTerminalLevelApi service = new TerminalSettingsTerminalLevelApi(client); TerminalSettings response = service.updateTerminalSettings("terminalId", terminalSettings, null); ``` ##### PHP ```php setXApiKey("ADYEN_API_KEY"); $client->setEnvironment(Environment::TEST); // Create the request object(s) $standalone = new Standalone(); $standalone ->setEnableGratuities(true); $gratuity1 = new Gratuity(); $gratuity1 ->setPredefinedTipEntries(array("10%", "15%", "20%")) ->setAllowCustomAmount(true) ->setUsePredefinedTipEntries(true) ->setCurrency("EUR"); $terminalSettings = new TerminalSettings(); $terminalSettings ->setStandalone($standalone) ->setGratuities(array($gratuity1)); // Send the request $service = new TerminalSettingsTerminalLevelApi($client); $response = $service->updateTerminalSettings('terminalId', $terminalSettings); ``` ##### C\# ```cs // Adyen .NET API Library v34.0.0 to latest using System.Collections.Generic; using Adyen.Management.Extensions; using Adyen.Management.Models; using Adyen.Management.Services; using Adyen.Core.Client; using Adyen.Core.Client.Extensions; using Adyen.Core.Options; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; var host = Host.CreateDefaultBuilder() .ConfigureManagement( (context, services, config) => { config.ConfigureAdyenOptions(options => { options.AdyenApiKey = "ADYEN_API_KEY"; options.Environment = AdyenEnvironment.Test; }); services.AddAllManagementServices(); }) .Build(); var terminalSettingsTerminalLevelService = host.Services.GetRequiredService(); // Create the request object(s) var standalone = new Standalone { EnableGratuities = true }; var gratuity1 = new Gratuity { PredefinedTipEntries = new List { "10%", "15%", "20%" }, AllowCustomAmount = true, UsePredefinedTipEntries = true, Currency = "EUR" }; var terminalSettings = new TerminalSettings { Standalone = standalone, Gratuities = new List{ gratuity1 } }; // Send the request var result = await terminalSettingsTerminalLevelService.UpdateTerminalSettingsAsync("terminalId", terminalSettings); if (result.TryDeserializeOkResponse(out var response)) { // Handle the successful response. } ``` ##### NodeJS (JavaScript) ```js // Adyen Node API Library v30.0.0 to latest const { Client, Config, EnvironmentEnum, ManagementAPI } = require('@adyen/api-library'); const config = new Config({ apiKey: "ADYEN_API_KEY", environment: EnvironmentEnum.TEST }); const client = new Client(config); // Create the request object(s) const standalone = { enableGratuities: true }; const gratuity1 = { predefinedTipEntries: ["10%", "15%", "20%"], allowCustomAmount: true, usePredefinedTipEntries: true, currency: "EUR" }; const terminalSettings = { standalone: standalone, gratuities: [gratuity1] }; // Send the request const managementAPI = new ManagementAPI(client); const response = await managementAPI.TerminalSettingsTerminalLevelApi.updateTerminalSettings("terminalId", terminalSettings); ``` ##### Go ```go // Adyen Go API Library v21.0.0 to latest import ( "context" "github.com/adyen/adyen-go-api-library/v21/src/common" "github.com/adyen/adyen-go-api-library/v21/src/adyen" "github.com/adyen/adyen-go-api-library/v21/src/management" ) client := adyen.NewClient(&common.Config{ ApiKey: "ADYEN_API_KEY", Environment: common.TestEnv, }) // Create the request object(s) standalone := management.Standalone{ EnableGratuities: common.PtrBool(true), } gratuity1 := management.Gratuity{ PredefinedTipEntries: []string{ "10%", "15%", "20%", }, AllowCustomAmount: common.PtrBool(true), UsePredefinedTipEntries: common.PtrBool(true), Currency: common.PtrString("EUR"), } terminalSettings := management.TerminalSettings{ Standalone: &standalone, Gratuities: []management.Gratuity{ gratuity1, }, } // Send the request service := client.Management() req := service.TerminalSettingsTerminalLevelApi.UpdateTerminalSettingsInput("terminalId").TerminalSettings(terminalSettings) res, httpRes, err := service.TerminalSettingsTerminalLevelApi.UpdateTerminalSettings(context.Background(), req) ``` ##### Python ```py # Adyen Python API Library v14.0.0 to latest import Adyen adyen = Adyen.Adyen() adyen.client.xapikey = "ADYEN_API_KEY" adyen.client.platform = "test" # The environment to use library in. # Create the request object(s) json_request = { "standalone": { "enableGratuities": True }, "gratuities": [{ "currency": "EUR", "predefinedTipEntries": ["10%", "15%", "20%"], "usePredefinedTipEntries": True, "allowCustomAmount": True }] } # Send the request result = adyen.management.terminal_settings_terminal_level_api.update_terminal_settings(request=json_request, terminalId="terminalId") ``` ##### Ruby ```rb # Adyen Ruby API Library v11.0.0 to latest require "adyen-ruby-api-library" adyen = Adyen::Client.new adyen.api_key = 'ADYEN_API_KEY' adyen.env = :test # Set to "live" for live environment # Create the request object(s) request_body = { "standalone" => { "enableGratuities" => true }, "gratuities" => [{ "currency" => "EUR", "predefinedTipEntries" => ["10%", "15%", "20%"], "usePredefinedTipEntries" => true, "allowCustomAmount" => true }] } # Send the request result = adyen.management.terminal_settings_terminal_level_api.update_terminal_settings(request_body, 'terminalId') ``` ##### NodeJS (TypeScript) ```ts // Adyen Node API Library v30.0.0 to latest import { Client, Config, EnvironmentEnum, ManagementAPI, Types } from "@adyen/api-library"; const config = new Config({ apiKey: "ADYEN_API_KEY", environment: EnvironmentEnum.TEST }); const client = new Client(config); // Create the request object(s) const standalone: Types.management.Standalone = { enableGratuities: true }; const gratuity1: Types.management.Gratuity = { predefinedTipEntries: ["10%", "15%", "20%"], allowCustomAmount: true, usePredefinedTipEntries: true, currency: "EUR" }; const terminalSettings: Types.management.TerminalSettings = { standalone: standalone, gratuities: [gratuity1] }; // Send the request const managementAPI = new ManagementAPI(client); const response = await managementAPI.TerminalSettingsTerminalLevelApi.updateTerminalSettings("terminalId", terminalSettings); ``` #### Earlier versions ##### curl ```bash curl "https://management-test.adyen.com/v3/terminals/{terminalId}/terminalSettings" \ -H 'X-API-key: ADYEN_API_KEY' \ -H 'Content-Type: application/json' \ -X PATCH \ -d '{ "standalone":{ "enableGratuities":true }, "gratuities":[ { "currency":"EUR", "predefinedTipEntries":[ "10%", "15%", "20%" ], "usePredefinedTipEntries":true, "allowCustomAmount":true } ] }' ``` ##### PHP ```php setXApiKey("ADYEN_API_KEY"); $client->setEnvironment(Environment::TEST); // Create the request object(s) $standalone = new Standalone(); $standalone ->setEnableGratuities(true); $gratuity1 = new Gratuity(); $gratuity1 ->setPredefinedTipEntries(array("10%", "15%", "20%")) ->setAllowCustomAmount(true) ->setUsePredefinedTipEntries(true) ->setCurrency("EUR"); $terminalSettings = new TerminalSettings(); $terminalSettings ->setStandalone($standalone) ->setGratuities(array($gratuity1)); // Send the request $service = new TerminalSettingsTerminalLevelApi($client); $response = $service->updateTerminalSettings('terminalId', $terminalSettings); ``` ##### C\# ```cs // Adyen .NET API Library v32.2.1 to v33.0.0 using Adyen; using Environment = Adyen.Model.Environment; using Adyen.Model; using Adyen.Model.Management; using Adyen.Service.Management; var config = new Config() { XApiKey = "ADYEN_API_KEY", Environment = Environment.Test }; var client = new Client(config); // Create the request object(s) Standalone standalone = new Standalone { EnableGratuities = true }; Gratuity gratuity1 = new Gratuity { PredefinedTipEntries = { "10%", "15%", "20%" }, AllowCustomAmount = true, UsePredefinedTipEntries = true, Currency = "EUR" }; TerminalSettings terminalSettings = new TerminalSettings { Standalone = standalone, Gratuities = new List{ gratuity1 } }; // Send the request var service = new TerminalSettingsTerminalLevelService(client); var response = service.UpdateTerminalSettings("terminalId", terminalSettings); ``` 2. Check the response. This returns all settings that your API credential has access to, including the ones that you defined in the request. ### Configure compliant tipping in Quebec, Canada A [regulation in Quebec, Canada](https://www.assnat.qc.ca/en/travaux-parlementaires/projets-loi/projet-loi-72-43-1.html) requires tips to be calculated on pre-tax amounts. To facilitate compliance with this regulation, we recommend choosing one of the following tipping options: * The terminal asks the shopper to enter the tip manually. * The terminal shows predefined tipping options for specific **CAD** amounts and the option to enter a custom tip amount. To configure tipping option to facilitate compliance with regulations in Quebec, Canada: 1. Decide what method you want to use: let the shopper enter a tip, or show predefined fixed amounts. 2. Set up tipping in the same way as described under [configure tipping](https://docs.adyen.com/point-of-sale/standalone/standalone-build/set-up-standalone#configure-tipping), but: ### Tab: Let shopper enter a tip 3. Select **CAD** as **Currency**. 4. At **Tipping mode**, select **Shopper enters tip amount** to show the screen for tipping without options. ### Tab: Show predefined fixed amounts * Select **CAD** as **Currency**. * At **Tipping mode**, select **Shopper selects a predefined option** to show the screen for tipping with predefined options. * Define the options for a specific **Amount**. Do not use **Percentage**. * Select **Allow shopper to enter custom tip**. * At **Enable standalone tipping**, turn on the toggle. * Select **Save**. ## Configure a refund passcode Because making refunds on standalone payment terminals is risky, you can enable a 6-digit passcode needed to initiate refunds. You set up the **Refunds** passcode in addition to the **Transactions** passcode, which means that you need to enter both to initiate a refund. You can configure this in your Customer Area or using an API call. ### Tab: Customer Area 1. In your [Customer Area](https://ca-test.adyen.com/), optionally switch to merchant account, store, or terminal that you want to create a refunds passcode for. 2. Go to **Devices** > **Device settings**. 3. Select **Passcodes**. 4. To view the passcode, under **Refunds**, select the show icon **, and enter the value. 5. Select **Save**. ### Tab: API 1. Make a PATCH request to the `/terminalSettings` endpoint for the company account, merchant account, store, or terminal, specifying the `passcode` settings. Use one of the following endpoints: * [/companies/{companyId}/terminalSettings](https://docs.adyen.com/api-explorer/Management/latest/patch/companies/\(companyId\)/terminalSettings) * [/merchants/{merchantId}/terminalSettings](https://docs.adyen.com/api-explorer/Management/latest/patch/merchants/\(merchantId\)/terminalSettings) * [/stores/{storeId}/terminalSettings](https://docs.adyen.com/api-explorer/Management/latest/patch/stores/\(storeId\)/terminalSettings) * [/terminals/{terminalId}/terminalSettings](https://docs.adyen.com/api-explorer/Management/latest/patch/terminals/\(terminalId\)/terminalSettings) In the body of the request, specify a [passcodes](https://docs.adyen.com/api-explorer/Management/latest/patch/companies/\(companyId\)/terminalSettings#request-passcodes) object with the [refundPin](https://docs.adyen.com/api-explorer/Management/latest/patch/companies/\(companyId\)/terminalSettings#request-passcodes-refundPin) parameter: **Configure refund passcode** #### Latest version ##### curl ```bash curl https://management-test.adyen.com/v3/companies/{companyId}/terminalSettings \ -H 'x-API-key: ADYEN_API_KEY' \ -X PATCH \ -d '{ "passcodes" : { "refundPin": "123456" } }' ``` ##### Java ```java // Adyen Java API Library v38.0.0 to latest import com.adyen.Client; import com.adyen.Config; import com.adyen.enums.Environment; import com.adyen.model.*; import com.adyen.service.*; import java.math.*; import com.adyen.model.management.*; import java.time.OffsetDateTime; import java.util.*; import com.adyen.service.management.*; Config config = new Config() .apiKey("ADYEN_API_KEY") .environment(Environment.TEST); Client client = new Client(config); // Create the request object(s) Passcodes passcodes = new Passcodes() .refundPin("123456"); TerminalSettings terminalSettings = new TerminalSettings() .passcodes(passcodes); // Send the request TerminalSettingsCompanyLevelApi service = new TerminalSettingsCompanyLevelApi(client); TerminalSettings response = service.updateTerminalSettings("companyId", terminalSettings, null); ``` ##### PHP ```php setXApiKey("ADYEN_API_KEY"); $client->setEnvironment(Environment::TEST); // Create the request object(s) $passcodes = new Passcodes(); $passcodes ->setRefundPin("123456"); $terminalSettings = new TerminalSettings(); $terminalSettings ->setPasscodes($passcodes); // Send the request $service = new TerminalSettingsCompanyLevelApi($client); $response = $service->updateTerminalSettings('companyId', $terminalSettings); ``` ##### C\# ```cs // Adyen .NET API Library v34.0.0 to latest using Adyen.Management.Extensions; using Adyen.Management.Models; using Adyen.Management.Services; using Adyen.Core.Client; using Adyen.Core.Client.Extensions; using Adyen.Core.Options; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; var host = Host.CreateDefaultBuilder() .ConfigureManagement( (context, services, config) => { config.ConfigureAdyenOptions(options => { options.AdyenApiKey = "ADYEN_API_KEY"; options.Environment = AdyenEnvironment.Test; }); services.AddAllManagementServices(); }) .Build(); var terminalSettingsCompanyLevelService = host.Services.GetRequiredService(); // Create the request object(s) var passcodes = new Passcodes { RefundPin = "123456" }; var terminalSettings = new TerminalSettings { Passcodes = passcodes }; // Send the request var result = await terminalSettingsCompanyLevelService.UpdateTerminalSettingsAsync("companyId", terminalSettings); if (result.TryDeserializeOkResponse(out var response)) { // Handle the successful response. } ``` ##### NodeJS (JavaScript) ```js // Adyen Node API Library v30.0.0 to latest const { Client, Config, EnvironmentEnum, ManagementAPI } = require('@adyen/api-library'); const config = new Config({ apiKey: "ADYEN_API_KEY", environment: EnvironmentEnum.TEST }); const client = new Client(config); // Create the request object(s) const passcodes = { refundPin: "123456" }; const terminalSettings = { passcodes: passcodes }; // Send the request const managementAPI = new ManagementAPI(client); const response = await managementAPI.TerminalSettingsCompanyLevelApi.updateTerminalSettings("companyId", terminalSettings); ``` ##### Go ```go // Adyen Go API Library v21.0.0 to latest import ( "context" "github.com/adyen/adyen-go-api-library/v21/src/common" "github.com/adyen/adyen-go-api-library/v21/src/adyen" "github.com/adyen/adyen-go-api-library/v21/src/management" ) client := adyen.NewClient(&common.Config{ ApiKey: "ADYEN_API_KEY", Environment: common.TestEnv, }) // Create the request object(s) passcodes := management.Passcodes{ RefundPin: common.PtrString("123456"), } terminalSettings := management.TerminalSettings{ Passcodes: &passcodes, } // Send the request service := client.Management() req := service.TerminalSettingsCompanyLevelApi.UpdateTerminalSettingsInput("companyId").TerminalSettings(terminalSettings) res, httpRes, err := service.TerminalSettingsCompanyLevelApi.UpdateTerminalSettings(context.Background(), req) ``` ##### Python ```py # Adyen Python API Library v14.0.0 to latest import Adyen adyen = Adyen.Adyen() adyen.client.xapikey = "ADYEN_API_KEY" adyen.client.platform = "test" # The environment to use library in. # Create the request object(s) json_request = { "passcodes": { "refundPin": "123456" } } # Send the request result = adyen.management.terminal_settings_company_level_api.update_terminal_settings(request=json_request, companyId="companyId") ``` ##### Ruby ```rb # Adyen Ruby API Library v11.0.0 to latest require "adyen-ruby-api-library" adyen = Adyen::Client.new adyen.api_key = 'ADYEN_API_KEY' adyen.env = :test # Set to "live" for live environment # Create the request object(s) request_body = { "passcodes" => { "refundPin" => "123456" } } # Send the request result = adyen.management.terminal_settings_company_level_api.update_terminal_settings(request_body, 'companyId') ``` ##### NodeJS (TypeScript) ```ts // Adyen Node API Library v30.0.0 to latest import { Client, Config, EnvironmentEnum, ManagementAPI, Types } from "@adyen/api-library"; const config = new Config({ apiKey: "ADYEN_API_KEY", environment: EnvironmentEnum.TEST }); const client = new Client(config); // Create the request object(s) const passcodes: Types.management.Passcodes = { refundPin: "123456" }; const terminalSettings: Types.management.TerminalSettings = { passcodes: passcodes }; // Send the request const managementAPI = new ManagementAPI(client); const response = await managementAPI.TerminalSettingsCompanyLevelApi.updateTerminalSettings("companyId", terminalSettings); ``` #### Earlier versions ##### curl ```bash curl https://management-test.adyen.com/v3/companies/{companyId}/terminalSettings \ -H 'x-API-key: ADYEN_API_KEY' \ -X PATCH \ -d '{ "passcodes" : { "refundPin": "123456" } }' ``` ##### PHP ```php setXApiKey("ADYEN_API_KEY"); $client->setEnvironment(Environment::TEST); // Create the request object(s) $passcodes = new Passcodes(); $passcodes ->setRefundPin("123456"); $terminalSettings = new TerminalSettings(); $terminalSettings ->setPasscodes($passcodes); // Send the request $service = new TerminalSettingsCompanyLevelApi($client); $response = $service->updateTerminalSettings('companyId', $terminalSettings); ``` ##### C\# ```cs // Adyen .NET API Library v32.2.1 to v33.0.0 using Adyen; using Environment = Adyen.Model.Environment; using Adyen.Model; using Adyen.Model.Management; using Adyen.Service.Management; var config = new Config() { XApiKey = "ADYEN_API_KEY", Environment = Environment.Test }; var client = new Client(config); // Create the request object(s) Passcodes passcodes = new Passcodes { RefundPin = "123456" }; TerminalSettings terminalSettings = new TerminalSettings { Passcodes = passcodes }; // Send the request var service = new TerminalSettingsCompanyLevelService(client); var response = service.UpdateTerminalSettings("companyId", terminalSettings); ``` 2. Check the response. This returns all settings that your API credential has access to, including the `passcodes` object you set in the request. ## Payment facilitators If you are a [payment facilitator](https://docs.adyen.com/get-started-with-adyen/adyen-glossary#payment-facilitator-payfac), card schemes require you to provide certain data about your sub-merchant with each transaction. That is because your sub-merchant is considered the Merchant of Record when you facilitate a transaction. Adyen automatically adds certain sub-merchant data to transactions that you facilitate. To supply the remaining data, you must [add that data to the configuration of the sub-merchant's store](https://docs.adyen.com/point-of-sale/payment-facilitators). ## Testing For information on how you can make test payments and refunds, see [testing your integration](https://docs.adyen.com/point-of-sale/testing-pos-payments). Any test transactions you make, will appear in your [Customer Area](https://ca-test.adyen.com/), under **Payments** > **Payment list**. ## See also * [Use a standalone terminal](https://docs.adyen.com/point-of-sale/standalone/standalone-use)