--- title: "One-time numeric code payments" description: "Accept one-time numeric code payments with BLIK." url: "https://docs.adyen.com/point-of-sale/alternative-payment-methods/otc-digit-based-payments" source_url: "https://docs.adyen.com/point-of-sale/alternative-payment-methods/otc-digit-based-payments.md" canonical: "https://docs.adyen.com/point-of-sale/alternative-payment-methods/otc-digit-based-payments" last_modified: "2025-12-02T17:35:00+01:00" language: "en" --- # One-time numeric code payments Accept one-time numeric code payments with BLIK. [View source](/point-of-sale/alternative-payment-methods/otc-digit-based-payments.md) Shoppers in Poland can make secure payments with a one-time numeric code generated from their BLIK banking app. A BLIK payment can be initiated by your store staff from the POS app or by the shopper on the terminal. ## Requirements Before you begin, take into account the following requirements, limitations, and preparations. | Requirement | Description | | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Integration type** | A [Terminal API](/point-of-sale/basic-tapi-integration/) integration with payment terminals or a [standalone solution](/point-of-sale/standalone). Standalone terminals only support the [shopper-initiated flow](#shopper-initiated-flow). | | **Limitations** | BLIK one-time numeric code payments are only supported in Poland. | | **Setup steps** | Before you begin, [add the BLIK payment method to your Adyen account](/point-of-sale/what-we-support/payment-methods#add-payment-methods-to-your-account). | ## One-time numeric code payment flows With a [Terminal API integration](/point-of-sale/design-your-integration/choose-your-architecture), there are several flows you can use for a BLIK one-time numeric code payment. * **[Merchant-initiated](#merchant-initiated-flow)** flow: The shopper informs the store staff that they want to make a BLIK payment. From the POS app, the store staff initiates a payment. The payment request must specify the **blik\_pos** payment brand. The shopper then enters their 6-digit BLIK code on the terminal. This flow requires an update to your integration, but it is faster and easier for the shopper. * **[Shopper-initiated](#shopper-initiated-flow)** flow: You send a payment request to the terminal. On the terminal, the shopper selects the **Scan** button (**Inne** in Polish) and then **BLIK**, and enters a 6-digit BLIK code. This flow requires no changes to the integration. You just need to add the BLIK payment method in your Customer Area. This flow, however, is less convenient for the shopper compared to the merchant-initiated flow. ## Merchant-initiated flow To initiate a BLIK payment from the POS app: 1. [Make a payment request](/point-of-sale/basic-tapi-integration/make-a-payment), specifying: * The standard [`SaleToPOIRequest.MessageHeader` ](/point-of-sale/design-your-integration/terminal-api#request-message-header)object, with `MessageClass` set to **Service** and `MessageCategory` set to **Payment**. | Parameter | Required | Description | | ----------------- | ------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | | `ProtocolVersion` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | **3.0** | | `MessageClass` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | **Service** | | `MessageCategory` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | **Payment** | | `MessageType` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | **Request** | | `ServiceID` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Your unique ID for this request, consisting of 1-10 alphanumeric characters. Must be unique within the last 48 hours for the terminal (`POIID`) being used. | | `SaleID` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | Your unique ID for the POS system component to send this request from. | | `POIID` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The unique ID of the terminal to send this request to. Format: *\[device model]-\[serial number]*. | * The [PaymentRequest](https://docs.adyen.com/api-explorer/terminal-api/latest/post/payment) object with: | Parameter | Required | Description | | ------------------------------- | ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `SaleData.SaleTransactionID` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | An object with:- `TransactionID`: your reference to identify a payment. We recommend using a unique value per payment. In your Customer Area and Adyen reports, this will show as the **merchant reference** for the transaction. - `TimeStamp`: date and time of the request in [UTC format](https://en.wikipedia.org/wiki/ISO_8601#Coordinated_Universal_Time_\(UTC\)). | | `PaymentTransaction.AmountsReq` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | An object with:- `Currency`: the transaction [currency](/development-resources/currency-codes). - `RequestedAmount`: The final transaction amount. | * The [TransactionConditions](https://docs.adyen.com/api-explorer/terminal-api/latest/post/payment#request-PaymentTransaction-TransactionConditions) object with: | Parameter | Required | Description | | --------------------- | ------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | | `paymentBrand` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | An object with:- `Currency`: the transaction [currency](/development-resources/currency-codes). - `RequestedAmount`: The final transaction amount. | | `AllowedPaymentBrand` | ![-white\_check\_mark-](/user/data/smileys/emoji/white_check_mark.png "-white_check_mark-") | The payment brands accepted for this transaction: **blik\_pos** | **Payment request with the BLIK payment brand specified** ```json { "SaleToPOIRequest":{ "MessageHeader":{ "ProtocolVersion":"3.0", "MessageClass":"Service", "MessageCategory":"Payment", "MessageType":"Request", "ServiceID":"0918171608", "SaleID":"POSSystemID12345", "POIID":"V400m-324688179" }, "PaymentRequest":{ "SaleData":{ "SaleTransactionID":{ "TransactionID":"8954", "TimeStamp":"2025-09-18T15:16:08+00:00" } }, "PaymentTransaction":{ "AmountsReq":{ "Currency":"PLN", "RequestedAmount":10.99 }, "TransactionConditions":{ "AllowedPaymentBrand":[ "blik_pos" ] } } } } } ``` This shows an entry field for the BLIK code on the terminal screen. 2. The shopper gets a 6-digit BLIK code from their BLIK banking app and enters the code on the terminal.\ The payment is sent to the Adyen payments platform for processing. 3. The shopper receives a request in their BLIK banking app to confirm the payment. 4. You receive the result of the payment, as you would [receive the result of a card payment](/point-of-sale/basic-tapi-integration/make-a-payment#payment-response). Note that on the shopper receipt, BLIK's reference for the payment is included in the `Transaction ref` field. You can view the details of a payment in your [Customer Area](https://ca-test.adyen.com/), under **Transactions** > **Payments**. ## Shopper-initiated flow 1. In the shopper-initiated flow, you [make a payment request as you](/point-of-sale/basic-tapi-integration/make-a-payment#make-a-payment) would for a card payment: **Payment request** ```json { "SaleToPOIRequest":{ "MessageHeader":{ "ProtocolVersion":"3.0", "MessageClass":"Service", "MessageCategory":"Payment", "MessageType":"Request", "ServiceID":"0918171608", "SaleID":"POSSystemID12345", "POIID":"V400m-324688179" }, "PaymentRequest":{ "SaleData":{ "SaleTransactionID":{ "TransactionID":"8954", "TimeStamp":"2025-09-18T15:16:08+00:00" } }, "PaymentTransaction":{ "AmountsReq":{ "Currency":"PLN", "RequestedAmount":10.99 } } } } } ``` 2. On the terminal, the shopper selects the **Scan** button and then **BLIK Code** from the card options. This shows an entry field for the BLIK code on the terminal screen. 3. The shopper gets a 6-digit BLIK code from their BLIK banking app and enters the code on the terminal 4. The shopper receives a request in their BLIK banking app to confirm the payment. 5. You receive the result of the payment, as you would [receive the result of a card payment](/point-of-sale/basic-tapi-integration/make-a-payment#payment-response). Note that on the shopper receipt, BLIK's reference for the payment is included in the `Transaction ref` field. ## Refunds Payments with a one-time numeric code support [referenced refunds](/point-of-sale/basic-tapi-integration/refund-payment/referenced), so you have to make a `ReversalRequest` to refund this type of payment. Both full and partial referenced refunds are allowed. ## Test To test a BLIK payment: * Use BLIK code 777213. ## See also * [Make a payment](/point-of-sale/basic-tapi-integration/make-a-payment) * [Supported Payment methods](/point-of-sale/what-we-support/payment-methods)