Skip to main content

Documentation Index

Fetch the complete documentation index at: https://developer.quickei.io/llms.txt

Use this file to discover all available pages before exploring further.

Build custom integrations with any system by receiving real-time webhook notifications for payment events.

Overview

Whenever a payment event occurs (paid, expired, cancelled, refunded), Quickei sends an HTTP POST request to your configured callback_url with a JSON payload. The request includes an HMAC-SHA256 signature for verification.

Webhook Flow

Events

EventTrigger
pos.order.paidCustomer completed payment
pos.order.expiredOrder expired before payment
pos.order.cancelledOrder cancelled by merchant
pos.order.refundedPayment refunded to customer

Payload Format

{
  "event": "pos.order.paid",
  "timestamp": "2026-03-15T14:02:30+00:00",
  "data": {
    "order_id": "POS-20260315-A1B2C3",
    "amount": 25.00,
    "currency": "EUR",
    "status": "PAID",
    "reference": "INV-2026-001",
    "terminal_id": "terminal-01",
    "trx_id": "TRX-98765",
    "paid_at": "2026-03-15T14:02:30+00:00"
  }
}

Headers

HeaderDescription
Content-Typeapplication/json
X-Quickei-EventEvent name (e.g. pos.order.paid)
X-Quickei-SignatureHMAC-SHA256 signature of the request body

Signature Verification

Every webhook includes an X-Quickei-Signature header. Always verify the signature before processing the event.
$payload = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_QUICKEI_SIGNATURE'] ?? '';

$expected = 'sha256=' . hash_hmac(
    'sha256',
    $payload,
    $client_secret  // Your API client secret
);

if (!hash_equals($expected, $signature)) {
    http_response_code(403);
    exit('Invalid signature');
}

// Signature valid — process the event
$event = json_decode($payload, true);

switch ($event['event']) {
    case 'pos.order.paid':
        // Update order, send confirmation email, etc.
        break;
    case 'pos.order.refunded':
        // Process refund in your system
        break;
}

http_response_code(200);

Retry Policy

If your endpoint does not return a 200 status code, Quickei retries with exponential backoff:
AttemptDelayTotal Wait
1st retry10 seconds10s
2nd retry60 seconds1m 10s
3rd retry300 seconds6m 10s
After 3 failed attempts, the webhook is marked as failed. Check the API Logs in your Merchant Dashboard for delivery status.

Best Practices

Always verify signatures

Never process a webhook without verifying the X-Quickei-Signature header. This prevents spoofed events.

Return 200 quickly

Acknowledge the webhook immediately with a 200 response. Do heavy processing (email, inventory, etc.) asynchronously.

Handle duplicates

Webhooks may be delivered more than once. Use the order_id as an idempotency key to prevent double-processing.

Use HTTPS only

Webhook URLs must use HTTPS. HTTP endpoints and private/localhost IPs are rejected.
Callback URLs pointing to localhost, 127.0.0.1, or private IP ranges (10.x, 172.16-31.x, 192.168.x) are blocked for security.