Skip to main content

Card Forwarding (Webhook Gateway)

If your organization is PCI-DSS compliant and runs its own processor integration, Maven doesn’t have to charge the card at all. With the webhook gateway, Maven collects the card over the phone call, then POSTs the full card data to your HTTPS endpoint. Your synchronous response decides whether the session succeeds — you charge (or vault) the card with any processor you like.
Your receiving endpoint takes full cardholder data (PAN, expiry, CVV) into your PCI scope. Only use this integration if your organization is PCI-DSS compliant for handling CHD. Never store the CVV.

How It Works

  1. You create a session with "gateway": "webhook".
  2. The caller enters their card on the phone as usual.
  3. Maven POSTs the card data to your configured endpoint — signed, HTTPS-only, exactly once.
  4. Your endpoint charges/vaults the card with your processor and responds success: true or success: false.
  5. Maven finishes the call accordingly and fires the normal (card-free) status webhook.

Setup

1

Go to Payments

In the Maven Dashboard, open your app and click the Payments tab.
2

Open Card Forwarding

Click the Card Forwarding card to expand it.
3

Save your endpoint

Enter your HTTPS endpoint URL per environment (Test / Live). HTTP URLs are rejected. Test-mode API keys (mvn_test_) forward to your test endpoint; live keys to your live endpoint.
4

Store the signing secret

On first save you receive a signing secret (whsec_…) — it is shown only once. Use it to verify the Maven-Signature header on every forwarded payload.

Creating Sessions

The Forwarded Request

When the caller finishes entering their card, Maven POSTs to your endpoint:

Verifying the Signature

Card-forwarding requests are signed with your card-forwarding secret using the same scheme as status webhooks:
Compare expected to the v1 value with a constant-time comparison, and reject requests whose t timestamp is older than your tolerance (e.g. 5 minutes).
The card-forwarding secret (whsec_…, shown once when you save the endpoint) is separate from your project’s status-webhook secret.

Your Response

Respond within 30 seconds. Maven makes exactly one attempt per session — it never retries, so you can’t be double-charged by retry storms. Still, treat session_id as your idempotency key. Approve (HTTP 200):
Decline (HTTP 200):
Any non-2xx status, invalid JSON, or timeout fails the session with webhook_gateway_error and the caller hears the failure prompt.

Processor Response Fields

Your returned IDs are echoed on the session (GET /v1/sessions/{id}processor) and in the status webhook:

Security Guarantees

  • HTTPS enforced at save time and again at send time; HTTP endpoints are rejected.
  • Redirects are never followed — card data can only reach the exact host you configured.
  • Exactly one delivery attempt per session — no retry double-charges.
  • Every payload is signed so you can prove the request came from Maven.
  • Maven never stores or logs the card data it forwards — only your returned IDs are persisted.