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 thewebhook 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.
How It Works
- You create a session with
"gateway": "webhook". - The caller enters their card on the phone as usual.
- Maven POSTs the card data to your configured endpoint — signed, HTTPS-only, exactly once.
- Your endpoint charges/vaults the card with your processor and responds
success: trueorsuccess: false. - 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: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, treatsession_id as your idempotency key.
Approve (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.
