Blik

Accept Blik — Poland's mobile-first payment standard — with VINR.

View as MarkdownInstall skills

Blik is Poland's leading instant payment method, built into over 20 Polish banking apps and used by tens of millions of customers. At checkout the customer opens their banking app, generates a 6-digit one-time code, and enters it on your payment page — no redirect required. Payments are final and irrevocable the moment the bank confirms.

AvailabilityAsk

DetailValue
CountriesPoland
CurrencyPLN only
Flow6-digit code (or in-app push)
FinalityFinal on confirmation
RefundsSupported via standard refund API

Payment flowAsk

Blik supports two confirmation modes that VINR handles automatically based on the customer's bank:

6-digit code flow (classic)

Create the payment

Create a payment with methods: ['blik'] and a PLN amount. The VINR-hosted checkout displays a code entry field.

Customer generates the code

The customer opens their banking app, navigates to the Blik section, and copies the 6-digit code displayed there. The code is valid for two minutes.

Customer enters the code at checkout

The customer pastes or types the code into your checkout page and confirms.

Bank approves and the payment completes

The bank validates the code and pushes a confirmation to VINR. The payment moves to completed. The customer stays on your page — no redirect.

In-app push flow (Blik One Click / newer banks)

Some banks skip the code entirely and send a push notification to the customer's phone. The customer approves directly in the banking app while remaining on your checkout page.

Creating a Blik paymentAsk

import { Vinr } from '@vinr/sdk';

const vinr = new Vinr({ secretKey: process.env.VINR_SECRET_KEY });

const payment = await vinr.payments.create({
  amount: 12900,             // 129.00 PLN in minor units (groszy)
  currency: 'PLN',
  description: 'Order #2231',
  methods: ['blik'],
  returnUrl: 'https://yoursite.com/payment/complete',
  metadata: { orderId: '2231' },
});

// Redirect the customer to payment.checkoutUrl

Fulfill from the webhook:

// POST /webhooks/vinr
const event = vinr.webhooks.verify(rawBody, req.headers['x-vinr-signature']);

if (event.type === 'payment.completed') {
  const payment = event.data;
  // payment.method → "blik"
  await fulfillOrder(payment.metadata.orderId);
}

Because the customer stays on your page during a code-flow payment, the returnUrl is only reached if the session times out. Always drive fulfillment from the payment.completed webhook.

Code expiry & retriesAsk

Blik codes expire after two minutes. If the customer enters an expired code, the payment moves to failed with code: blik_code_expired. You can create a new payment and let the customer generate a fresh code — or re-present the same checkoutUrl if your integration allows.

Settlement & timingAsk

Blik payments authorize and capture in seconds. The captured amount lands in your balance immediately and follows your normal settlement schedule.

RefundsAsk

Refunds are returned to the customer's originating bank account, typically within one to three business days.

const refund = await vinr.refunds.create({
  payment: 'pay_...',
  amount: 12900,  // full refund; omit amount for full
  reason: 'requested_by_customer',
});

Because Blik payments are final, there are no chargebacks. A refund is the only way to return funds after the payment completes.

TestingAsk

In the VINR sandbox, Blik flows open a VINR test page where you choose Approve or Fail — no real banking app is required. Use any 6-digit value as the test code.

LimitationsAsk

  • PLN only. Blik cannot process amounts in any other currency.
  • Poland only. The method only appears for customers with a Blik-enabled Polish banking app; presenting it outside Poland returns method_not_available.
  • No manual capture. Blik captures in full at the moment the bank confirms.
  • Code valid for 2 minutes. Customers who take too long must generate a new code.

See alsoAsk

Was this page helpful?
Edit on GitHub

Last updated on

On this page