--- 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" --- # Standalone setup Make your terminals ready for use as standalone devices. [View source](/point-of-sale/standalone/standalone-build/set-up-standalone.md) One of the steps in the [integration checklist](/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 a refund passcode and tipping feature. 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](/point-of-sale/standalone/) . | | **[API credentials](/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](/development-resources/api-credentials#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](/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](/account/user-roles)** | To set up your terminal from the Customer Area, you need the following [roles](/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](#configure-tipping-quebec). | | **Hardware** | A [standalone payment terminal](/point-of-sale/what-we-support/select-your-terminals/?integration%5B0%5D=standalone). | | **Setup steps** | When [going live](/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. | ## Set up standalone You can make your terminals ready for standalone use in your Customer Area or using an API call. ### 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. Go to **In-person payments** > **Terminal settings** > **Integrations**. 3. Under **Standalone**, do the following: 1. Select **Enabled**. 2. Under **Standalone currency**, select a currency for standalone transactions. 3. Under **Show start button**, select **Enabled**. When the Start button is **Disabled**, you start a transaction by selecting the **Confirm** key **![](/images/a/7/c/a/0/a7ca05ddf357b9a7e6c3959d2d868d4a73848ab6-confirm2x.png)** on the keypad. 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. 4. Select **Save**.\ The terminal downloads the new configuration when it makes a maintenance call to our systems. This happens automatically every 180 minutes. The changes then take effect when the terminal restarts. This happens automatically at the restart hour, which is usually set to 6:00 AM. To switch to the new settings immediately, update the configuration on your terminal manually: * Go to **Settings** > **Configuration**, enter your [Admin & Settings passcode](/point-of-sale/menu-access/#manage-passcodes) and select **Update**. * For *non-Android terminals* that use the [old menu structure](/point-of-sale/menu-access#old-menu-structure): go to the [Admin menu](/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. 5. *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](/point-of-sale/standalone/standalone-use/#tipping-standalone). * [Referenced refunds](/point-of-sale/standalone/standalone-use#refund). You can also enable the [Refunds passcode](#refund-passcode). ### Tab: API You can use Management API to set up the standalone feature for all terminals under your company account, merchant account, or a store. You can also set up standalone for individual terminals, for example if you need to use standalone as a [fallback](/point-of-sale/standalone/#fallback) on select terminals at your store. To set up the standalone feature with an 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** #### 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 v40.0.0 import com.adyen.Client; import com.adyen.enums.Environment; import com.adyen.model.management.*; import java.time.OffsetDateTime; import java.util.*; import com.adyen.service.management.*; Client client = new Client("ADYEN_API_KEY", Environment.TEST); // 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 v32.2.1 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); ``` #### NodeJS (JavaScript) ```js // Adyen Node API Library v30.0.0 const { Client, 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 terminalSettings = { standalone: { enableStandalone: true, currencyCode: "EUR" } } // Send the request const managementAPI = new ManagementAPI(client); const response = managementAPI.TerminalSettingsTerminalLevelApi.updateTerminalSettings("terminalId", terminalSettings); ``` #### Go ```go // Adyen Go API Library v21.1.0 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 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 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 import { Client, 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 = managementAPI.TerminalSettingsTerminalLevelApi.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 It is possible to ask for a tip without tipping options. The payment terminal then shows 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. To make tipping easier for your customers, you can define tipping options that your customer can select on the terminal. The options can be any combination of percentages, calculated amounts, and a custom amount. You can configure the terminal to show only the percentage, the percentage and the calculated total amount together and only the fixed tip amount. | | | | | ----------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Tipping without options: ![](/images/f/1/5/7/7/f1577eef16227d16757763dbb22fbaaba0c8a3e6-screen-entipping-enter-tip-amount.png "Tipping prompt") | Tipping with percentage options: ![](/images/c/2/6/e/b/c26ebd9fac46aa2761e05ce06deb6ff4240b294b-screen-entipping-predefined-options-portrait.png "Tipping options") | Percentage and calculated tip amounts: ![](/images/5/7/e/8/7/57e87d103ad8f491db83d39be546782dace453df-screen-entipping-percentage-and-totals.png "Both predefined tipping options") | You can configure tipping either from your Customer Area or by using 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 **In-person payments** > **Terminal settings**. 4. Go to **Payment features** > **Tipping**. 5. At **Enable tipping**, select **Enabled**. 6. Select the **Currency** that the settings should apply to. 7. Decide if you want to let shopper enter a tip or show one of the predefined options. 8. If you want to let shopper enter a tip, at **Type of tipping**, select **Shopper enters tip amount** to show the screen for tipping without options. 9. If you want to show one of the predefined options: 1. At **Type of tipping**, select **Shopper selects a predefined option** to show the screen with predefined tipping options. 2. Define the options: * You can define different options for different currencies, except at store or terminal level where only one currency applies. * Per currency, you can define a maximum of four options. We automatically add an option for not giving a tip. * An option can be for a specific **amount**, for a **percentage** of the purchase, or for a **custom** tip (this leads the customer to a screen where they can enter a tip amount). * Optionally, enable **Show calculated percentage amount** to show the amount associated with the **percentage** tipping options. 10. If applicable, select **Add another currency**, select a currency, and configure tipping for that currency. 11. At **Enable standalone tipping** select **Enabled** if it fits your use case. 12. Select **Save**. You can configure your POS app to [override the tipping settings](/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** #### 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 v40.0.0 import com.adyen.Client; import com.adyen.enums.Environment; import com.adyen.model.management.*; import java.time.OffsetDateTime; import java.util.*; import com.adyen.service.management.*; Client client = new Client("ADYEN_API_KEY", Environment.TEST); // 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 v32.2.1 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); ``` #### NodeJS (JavaScript) ```js // Adyen Node API Library v30.0.0 const { Client, 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 terminalSettings = { standalone: { enableGratuities: true }, gratuities: [ { currency: "EUR", predefinedTipEntries: [ "10%", "15%", "20%" ], usePredefinedTipEntries: true, allowCustomAmount: true } ] } // Send the request const managementAPI = new ManagementAPI(client); const response = managementAPI.TerminalSettingsTerminalLevelApi.updateTerminalSettings("terminalId", terminalSettings); ``` #### Go ```go // Adyen Go API Library v21.1.0 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 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 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 import { Client, 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 = managementAPI.TerminalSettingsTerminalLevelApi.updateTerminalSettings("terminalId", terminalSettings); ``` 2. The response 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](#configure-tipping), but: ### Tab: Let shopper enter a tipp 3. Select **CAD** as **Currency**. 4. At **Type of tipping**, select **Shopper enters tip amount** to show the screen for tipping without options. ### Tab: Show predefined fixed amounts * Select **CAD** as **Currency**. * At **Type of tipping**, 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 custom amount**. * At **Enable standalone tipping** select **Enabled**. * Select **Save**. ## Configure 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/), go to **In-person payments** > **Terminal settings** or select a specific terminal by serial number. You can find the serial number in the Device info on the terminal.\ Refer to the [manual for your terminal model](/point-of-sale/pos-troubleshooting/getting-started-with-your-terminal). 2. Select **Passcodes**. 3. To view the passcode, under **Terminal passcodes**, select **Decrypted**. 4. Under **Refunds**, select the view icon **to show the passcode, and pencil icon **to enable editing. 5. Under **Refunds**, enter and retype the new value. 6. Select **Save**.\ The terminal downloads the new configuration when it makes a maintenance call to our systems. This happens automatically every 180 minutes. The changes then take effect when the terminal restarts. This happens automatically at the restart hour, which is usually set to 6:00 AM. To switch to the new settings immediately, update the configuration on your terminal manually: * Go to **Settings** > **Configuration**, enter your [Admin & Settings passcode](/point-of-sale/menu-access/#manage-passcodes) and select **Update**. * For *non-Android terminals* that use the [old menu structure](/point-of-sale/menu-access#old-menu-structure): go to the [Admin menu](/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. ### Tab: API You can use Management API to configure the refund passcode for all terminals under your company account, merchant account, or a store, or for individual terminals. To configure the refund passcode: 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** #### 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 v40.0.0 import com.adyen.Client; import com.adyen.enums.Environment; import com.adyen.model.management.*; import java.time.OffsetDateTime; import java.util.*; import com.adyen.service.management.*; Client client = new Client("ADYEN_API_KEY", Environment.TEST); // 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 v32.2.1 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); ``` #### NodeJS (JavaScript) ```js // Adyen Node API Library v30.0.0 const { Client, 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 terminalSettings = { passcodes: { refundPin: "123456" } } // Send the request const managementAPI = new ManagementAPI(client); const response = managementAPI.TerminalSettingsCompanyLevelApi.updateTerminalSettings("companyId", terminalSettings); ``` #### Go ```go // Adyen Go API Library v21.1.0 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 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 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 import { Client, 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 = managementAPI.TerminalSettingsCompanyLevelApi.updateTerminalSettings("companyId", terminalSettings); ``` 2. The response 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](/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](/point-of-sale/payment-facilitators). ## Testing For information on how you can make test payments and refunds, see [testing your integration](/point-of-sale/testing-pos-payments). Any test transactions you make, will appear in your [Customer Area](https://ca-test.adyen.com/), under **Transactions** > **Payments**. ## See also * [Use a standalone terminal](/point-of-sale/standalone/standalone-use)