The Payments module is currently in closed beta. Request access to enable it.

What you get

  • A Customer abstraction scoped to your tenant.
  • Saved payment methods (cards, SEPA, ACH) attached to customers.
  • PaymentIntent flow for funding escrow transactions.
  • Signed payment lifecycle webhooks delivered through the same Geldstuck endpoint you already use for the rest of the platform.

Create a customer

curl https://api.geldstuck.com/v1/payments/customers \
  -H "x-api-key: $GELDSTUCK_PUBLIC_KEY" \
  -H "x-api-secret: $GELDSTUCK_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "userId": "usr_01HX3ZAB...",
    "email": "ada@example.com"
  }'

Create a payment intent

Funds an escrow transaction by charging the buyer’s saved payment method.
curl https://api.geldstuck.com/v1/payments/intents \
  -H "x-api-key: $GELDSTUCK_PUBLIC_KEY" \
  -H "x-api-secret: $GELDSTUCK_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "transactionId": "tx_01HX3ZM...",
    "customerId": "cus_01HX3ZR...",
    "paymentMethodId": "pm_01HX3ZS...",
    "amount": 1850000,
    "currency": "EUR"
  }'
Response:
{
  "id": "pi_01HX3ZT...",
  "status": "requires_confirmation",
  "clientSecret": "pi_01HX3ZT_secret_..."
}
Pass clientSecret to your client-side payment confirmation flow. If additional customer action is required, complete it there. On success, the transaction.status.changedfunded webhook fires automatically.

Managing payment methods

GET  /v1/payments/customers/:customerId/payment-methods
POST /v1/payments/customers/:customerId/payment-methods
DELETE /v1/payments/payment-methods/:paymentMethodId
See the API reference for payload details.

Webhooks

Payment events stream through the same Geldstuck webhook endpoint:
  • payment_intent.succeeded
  • payment_intent.failed
  • payment_method.attached
  • payment_method.detached
All are signed with your whsec_ - verify them with the same helper you use for every other event.