Hoe het werkt

Hoe PCI Proxy werkt

U stuurt ons kaartgegevens. Wij tokeniseren, slaan ze op in een PCI DSS-vault en retourneren een token. Uw systemen ontvangen nooit het kaartnummer.

Gegevensstroom

De flow in 5 stappen

Van het moment dat de klant kaartgegevens invoert tot het token in uw backoffice: dit gebeurt stap voor stap.

Fase 1

Kaartgegevens binnen

Website checkout, API-call of callcenterformulier

Fase 2

PCI Proxy onderschept

Wij ontvangen kaartgegevens uit de HTTP-payload voordat ze uw servers bereiken

Fase 3

Tokenisatie

Wij versleutelen het kaartnummer en genereren een uniek token

Fase 4

Beveiligde vault

Het kaartnummer blijft versleuteld in onze PCI DSS Niveau 1-vault, alleen in de EU

Fase 5

Token naar u

U ontvangt het token en gebruikt het voor betalingen, abonnementen of terugbetalingen

Tokenisatie

Wat er gebeurt bij tokenisatie

Wij vervangen het kaartnummer door een token. In uw systemen ziet u nooit het platte kaartnummer. Dit zijn de drie interne stappen.

01

Stap

Wij detecteren kaartgegevens

Wij analyseren binnenkomende requests en identificeren kaartnummers in JSON, formulieren of multipart payloads. Geen codewijzigingen aan uw kant: koppel uw flow en u bent klaar.

02

Stap

Wij maken het token

Elk token begint met tok_pci_eu_ en bevat de laatste vier cijfers, scheme en vervaldatum. Zo kan uw UI "Visa eindigend op 1234" tonen zonder ooit het kaartnummer te bewaren.

03

Stap

Zelfde token, zelfde kaart

Als dezelfde kaart opnieuw binnenkomt, retourneren wij hetzelfde token. Handig voor abonnementen en opgeslagen kaarten. De mapping blijft alleen in de vault en wordt niet via API blootgesteld.

pci-proxy · live voorbeeld ACTIVE

→ POST /v1/tokenize

{

"card_number": "4111 1111 1111 1234",

"expiry": "12/26"

}

AES-256 · EU vault

← 200 OK · 47ms

{

"token": "tok_pci_eu_a1b2c3d4e5f61234",

"last_four": "1234",

"brand": "visa",

"card_in_your_systems": false

}

Kaartnummer nooit op uw servers · EU-vault · Gelogd
Kaart ophalen

Wanneer het kaartnummer nodig is

Om een betaling te autoriseren heeft de PSP het echte kaartnummer nodig. U stuurt het token: wij halen de kaart uit de vault en sturen deze veilig door. U ziet het nooit.

1

Wanneer dit gebeurt

Wanneer u een opgeslagen kaart wilt belasten, stuurt u het token naar ons forward-endpoint. Wij halen het kaartnummer op in de vault en geven het door aan de PSP via een versleutelde verbinding. Het verschijnt niet in uw logs.

2

Wie dit mag doen

Alleen houders van een API-sleutel met forward or detokenize rechten. U kunt beperken op IP, omgeving en requestvolume.

3

Volledig geaudit

Elke ophaling wordt gelogd: wie het aanvroeg, wanneer en naar welke PSP. Logs worden minimaal 12 maanden bewaard en zijn beschikbaar via dashboard of API.

Beschermingslagen

Niveau 1 Ondertekende API-sleutel

Elke request wordt geauthenticeerd

Niveau 2 IP-whitelist

Alleen vanaf uw geautoriseerde servers

Niveau 3 Versleutelde verbinding met PSP

TLS met geverifieerde certificaten

Niveau 4 Auditlogs

Bewaard gedurende minimaal 12 maanden

API

Twee endpoints, duidelijke flow

Authenticeer met uw API-sleutel. Eén endpoint maakt het token, het andere gebruikt het om te betalen. JSON in, JSON out.

POST /v1/tokenize Scope: tokenize

Request body

{
  "card_number": "4111111111111111",
  "expiry":      "12/26",
  "cvv":         "123"
}

Response 200 OK

{
  "token":      "tok_pci_eu_a1b2c3d4e5f6",
  "last_four": "1111",
  "brand":     "visa",
  "expires_at": "2026-12-31"
}
POST /v1/forward Scope: forward

Request body

{
  "token":      "tok_pci_eu_a1b2c3d4e5f6",
  "target_url": "https://psp.eu/charge",
  "amount":     9900,
  "currency":   "EUR"
}

Response (van PSP, geproxied)

{
  "status":         "authorized",
  "transaction_id": "txn_9f8e7d6c",
  "amount":         9900,
  "currency":       "EUR"
}
Ondertekende requests
Gemiddelde latency onder 50 ms
REST + Webhooks
Real-time events

Webhooks en meldingen

Wanneer iets gebeurt (token aangemaakt, betaling verstuurd, fout), sturen wij een real-time event naar uw endpoint. Elk bericht is ondertekend zodat u het server-side kunt verifiëren.

Als aflevering mislukt, proberen wij het tot 5 keer opnieuw met oplopende intervallen. U kunt ook handmatig opnieuw afspelen vanuit het dashboard binnen 72 uur.

Ondersteunde event types

token.created Nieuw token gegenereerd
token.used Token verstuurd naar PSP
token.expired Token bereikte zijn TTL
token.deleted Token verwijderd op verzoek
forward.success PSP retourneerde 2xx
forward.failure PSP retourneerde fout

Webhook payload-voorbeeld

POST your-server.com/webhooks/pci LIVE
{
  "event":     "token.created",
  "timestamp": "2026-04-03T10:15:30Z",
  "data": {
    "token":       "tok_pci_eu_a1b2c3d4e5f6",
    "last_four":   "1111",
    "brand":       "visa",
    "merchant_id": "mrc_xyz789"
  },
  "signature": "sha256=4a8b9c..."  // HMAC-SHA256
}

Handtekeningverificatie

Elke webhook bevat de X-PCI-Signature header. Bereken HMAC-SHA256 van de body met uw secret en vergelijk met de handtekening. Als ze niet overeenkomen, wijs het verzoek af.

Anti-replay Verifieerbare handtekening 5 automatische retries
Integratie

SDK's en integratiemethoden

SDK's voor Node, Python en PHP, of hosted fields in iFrames. Kies wat bij uw stack past.

JS

JavaScript SDK

npm
import PCIProxy from '@pci-proxy-eu/js';

const pci = new PCIProxy({
  merchantId: 'mrc_xyz789'
});

const { token } = await pci.tokenize({
  cardNumber: '4111...'
});
Node.js 18+ · Browser · TypeScript inbegrepen
PY

Python SDK

PyPI
from pci_proxy_eu import Client

client = Client(
  merchant_id="mrc_xyz789",
  api_key="sk_live_..."
)

result = client.tokenize(
  card_number="4111..."
)
Python 3.9+ · AsyncClient beschikbaar
PHP

PHP SDK

Composer
use PCIProxyEU\Client;

$client = new Client(
  merchantId: 'mrc_xyz789',
  apiKey: 'sk_live_...'
);

$result = $client->tokenize([
  'card_number' => '4111...'
]);
PHP 8.1+ · Java en .NET beschikbaar
Hosted fields

Beveiligde iFrames voor checkout

Om SAQ A te behouden: kaartvelden worden gerenderd in onze iFrames. Kaartgegevens gaan nooit via uw DOM.

hosted-fields.html
<div id="card-number"></div>
<div id="card-expiry"></div>
<div id="card-cvv"></div>

<script>
  PCIProxy.hostedFields({
    merchantId: 'mrc_xyz789',
    fields: {
      cardNumber: '#card-number',
      expiry:     '#card-expiry',
      cvv:        '#card-cvv'
    },
    onTokenize: (result) => {
      // token only, never the card number
      console.log(result.token);
    }
  });
</script>
checkout.your-shop.com

Betalingsgegevens

4111 1111 1111 •••• iFrame
12/27 iFrame
••• iFrame

Kaartgegevens nooit op uw server

SAQ A

Minder PCI-belasting

CSS

Aanpasbare styling

Mobile

Responsive

Klaar om te integreren?

Lees wat een PCI Proxy is, verdiep u in tokenisatie of bekijk hoe ontwikkelaars het platform gebruiken.