Providers and formats
Each provider has its own adapter with explicit, versioned semantics. Nothing is detected just because a string mentions a provider's name.
Stripe adapter 0.2.0
| Format id | Input |
|---|---|
stripe.api_error | Stripe API error response ({ error: { type, code, decline_code, advice_code } }) |
stripe.payment_intent | PaymentIntent object snapshot |
stripe.event.snapshot | API v1 snapshot event (webhook payload) for PaymentIntent, Charge, Refund and Dispute objects |
Adyen adapter 0.2.0
| Format id | Input |
|---|---|
adyen.webhook.standard | Standard payment webhook (notificationItems / NotificationRequestItem) |
adyen.payment_response | Payment API response with resultCode and pspReference |
adyen.api_error | API error response (status, errorCode, errorType, message) |
payabl. adapter 0.1.0
| Format id | Input |
|---|---|
payabl.gateway.response | Gateway API synchronous response (URL-encoded status, transactionid, errormessage) |
payabl.notification | Notification / callback (URL-encoded transactionid, type, errorcode, security) |
payabl.session.init | Hosted Payment Page init or Web SDK session response |
Checkout.com adapter 0.1.0
| Format id | Input |
|---|---|
checkout.api_error | API error response ({ request_id, error_type, error_codes[] }) |
checkout.payment_response | Payments API response or payment details (pay_ id, status, approved, response_code) |
checkout.action_accepted | Capture, refund or void accepted response ({ action_id, reference, _links }) |
checkout.webhook | Workflows webhook for gateway payment events (created_on, or timestamp + source envelope) |
Braintree adapter 0.1.0
| Format id | Input |
|---|---|
braintree.graphql.response | GraphQL API response (data with transactions and statusHistory, errors[].extensions with errorClass and legacyCode) |
braintree.transaction | Transaction snapshot: SDK object (snake_case or camelCase), SDK result with a transaction, or GraphQL Transaction/Refund |
braintree.sdk.validation_errors | SDK result with validation errors (attribute, code, message) |
braintree.webhook.notification | Webhook notification parsed by a Braintree SDK (kind, timestamp, subject) |
PayPal adapter 0.1.0
| Format id | Input |
|---|---|
paypal.api_error | REST error response ({ name, message, debug_id, details[{ issue, description, field }] }) |
paypal.order | Orders v2 order resource with purchase_units[].payments (captures, authorizations, refunds) |
paypal.payment_resource | Payments v2 capture, authorization or refund resource |
paypal.webhook | Webhook event (id, event_type, create_time, resource) for Orders v2 and Payments v2 |
paypal.webhook.verify_request | verify-webhook-signature request body; the embedded webhook_event is analyzed |
Mollie adapter 0.1.0
| Format id | Input |
|---|---|
mollie.payment | Payments API v2 payment object (resource: payment), e.g. GET /v2/payments/{id} |
mollie.refund | Refund object (resource: refund) |
mollie.chargeback | Chargeback object (resource: chargeback) |
mollie.capture | Capture object (resource: capture) |
mollie.error | API v2 error response (status, title, detail, field, _links.documentation) |
mollie.event | Next-gen webhook event with the full payload (_embedded.entity), experimental |
Square adapter 0.1.0
| Format id | Input |
|---|---|
square.error_response | Error response ({ errors: [{ category, code, detail, field }] }), optionally with the FAILED payment or refund |
square.payment | Payment object, bare or as { payment: {...} } |
square.refund | PaymentRefund object, bare or as { refund: {...} } |
square.webhook | payment.created, payment.updated, refund.created and refund.updated events |
Flutterwave adapter 0.1.0
| Format id | Input |
|---|---|
flutterwave.v3.response | v3 REST response (status, message, data) with a transaction, transfer, refund or chargeback object, an authorization prompt or an error message |
flutterwave.v3.object | Bare v3 transaction, transfer, refund or chargeback object |
flutterwave.v3.webhook | v3 webhook (event, data, event.type): charge.completed, preauth-card, transfer.completed, chargeback events |
flutterwave.v3.refund_webhook | v3 refund webhook (AmountRefunded, FlwRef, TransactionId, meta string) |
flutterwave.v3.server_error | v3 server error (error_id, message, code app_error) |
flutterwave.v4.error | v4 error response (status failed, error.type, error.code) |
flutterwave.v4.response | v4 response with a charge, transfer, refund or chargeback object |
flutterwave.v4.webhook | v4 webhook (webhook_id or id, timestamp, type, data) |
Paystack adapter 0.1.0
| Format id | Input |
|---|---|
paystack.api_response | Response envelope (status, message, data) with a transaction (initialize, verify, fetch, charge_authorization, Charge API states), refund, dispute or transfer |
paystack.api_error | Error response (status false, message, type, code, meta.nextStep) |
paystack.webhook | Webhook body (event, data) for charge, dispute, refund, transfer and bank.transfer.rejected events |
Razorpay adapter 0.1.0
| Format id | Input |
|---|---|
razorpay.api_error | Payments API v1 error response ({ error: { code, description, field, source, step, reason, metadata } }), also wrapped as { statusCode, error } by the Node.js SDK |
razorpay.payment | Payment entity with status and the error_code, error_source, error_step and error_reason fields |
razorpay.order | Order entity (created, attempted, paid) |
razorpay.refund | Refund entity (pending, processed, failed) |
razorpay.dispute | Dispute entity (phase, status, reason_code) |
razorpay.settlement | Settlement entity (created, processed, failed) |
razorpay.payout | RazorpayX payout entity with status and status_details |
razorpay.collection | Collection ({ entity: collection, items }) of the entities above |
razorpay.webhook | Webhook envelope (entity: event, event, contains, payload, created_at) for payment, order, refund, dispute, settlement and payout events |
PayU India adapter 0.1.0
| Format id | Input |
|---|---|
payu_india.payment_response | Payment response posted to surl / furl / curl and the payment webhook (mihpayid, txnid, status, unmappedstatus, error, error_Message, field7-field9) |
payu_india.verify_payment | Verify Payment API JSON (status, msg, transaction_details keyed by txnid) |
payu_india.command_response | Command API JSON of refund, capture and cancel requests (status, msg, mihpayid, request_id, error_code) |
BlueSnap adapter 0.1.0
| Format id | Input |
|---|---|
bluesnap.card_transaction | Payment API (JSON) card transaction response (cardTransactionType, transactionId, processingInfo.processingStatus) |
bluesnap.refund | Payment API (JSON) refund response (refundTransactionId, refundStatus) |
bluesnap.error | Payment API (JSON) error body (message[] with errorName, code, description) |
bluesnap.card_transaction_xml | Payment API (XML, namespace http://ws.plimus.com) card transaction response (<card-transaction> with card-transaction-type, transaction-id, processing-info) |
bluesnap.error_xml | Payment API (XML, namespace http://ws.plimus.com) error body (<messages> with message elements holding error-name, code, description) |
bluesnap.webhook | Form-encoded webhook (IPN) named by transactionType |
bluesnap.throttling | HTTP 429 or 503 with a documented plain-text throttling message |
EBANX adapter 0.1.0
| Format id | Input |
|---|---|
ebanx.payin_response | Pay-in Direct API response (/ws/direct, /ws/query, /ws/capture, /ws/cancel, /ws/refund) with the payment object |
ebanx.payin_error | Pay-in error envelope (status ERROR, status_code, status_message) |
ebanx.payment_notification | Payment notification form post (operation, notification_type, hash_codes) |
ebanx.payout_response | Payout API response (type with a payout object, or an HP-* error) |
ebanx.payout_notification | Payout notification form post (operation payout_status_*, hash_codes) |
dLocal adapter 0.1.0
| Format id | Input |
|---|---|
dlocal.payins.payment | Payins payment object (response or payment notification) |
dlocal.payins.refund | Payins refund object (response or refund notification) |
dlocal.payins.chargeback | Payins chargeback notification or chargeback object |
dlocal.api_error | HTTP error envelope (code, message, param) of the Payins API and Payouts v3 |
dlocal.payouts_v3.payout | Payouts v3 payout object (response or payout notification) |
Rapyd adapter 0.1.0
| Format id | Input |
|---|---|
rapyd.api_response | Merchant API REST response (status object with error_code, status, message, response_code, operation_id; payment, refund, payout or dispute in data) |
rapyd.webhook | Payment, refund, dispute and payout webhook (id wh_, type, data, trigger_operation_id), also inside the HTTP client wrapper or as a delivery record |
Airwallex adapter 0.1.0
| Format id | Input |
|---|---|
airwallex.error | Payments Client API error body ({ code, message, source, trace_id, details, provider_original_response_code }) |
airwallex.payment_intent | PaymentIntent snapshot with the embedded latest_payment_attempt |
airwallex.payment_attempt | PaymentAttempt snapshot |
airwallex.refund | Refund snapshot |
airwallex.payment_dispute | PaymentDispute snapshot |
airwallex.webhook | Payments webhook ({ id, name, data.object, created_at, version }) for PaymentIntent, PaymentAttempt, Refund and PaymentDispute events |
Paysafe adapter 0.1.0
| Format id | Input |
|---|---|
paysafe.resource | Payments API v1 resource response (payment handle, payment, settlement, refund, void, credit, verification), including HTTP 402 declines with an error object |
paysafe.error | Payments API v1 error body ({ error: { code, message, details, fieldErrors, additionalDetails } }) or an error response with an X-Application-Status-Code header |
paysafe.webhook | Payments API webhook envelope (eventName, payload, attemptNumber, resourceId, eventDate) |
Nuvei adapter 0.1.0
| Format id | Input |
|---|---|
nuvei.rest_response | REST API 1.0 JSON response (status, errCode, transactionStatus and the gateway and APM error fields) |
nuvei.payment_dmn | Payment DMN (query string or form body with ppp_status and Status) |
nuvei.withdrawal_dmn | Withdrawal DMN (wdRequestId, wdRequestStatus, wdOrderStatus) |
nuvei.chargeback_dmn | Control Panel event DMN with EventType Chargeback |
Authorize.net adapter 0.2.0
| Format id | Input |
|---|---|
authorize_net.transaction_response | Authorize.net API createTransactionResponse, JSON or XML (transactionResponse with responseCode and reason codes, plus messages) |
authorize_net.api_messages | Authorize.net API response with only messages (resultCode, I/E codes), JSON or XML (for example ErrorResponse) |
authorize_net.webhook | Webhook notification (notificationId, eventType net.authorize.*, payload) |
Cybersource adapter 0.1.0
| Format id | Input |
|---|---|
cybersource.payment_response | REST Payments API v2 HTTP 201 response (authorization, sale, capture, reversal, refund, credit, void) |
cybersource.error_response | REST HTTP 400 or 502 error body (status, reason, message, details[]) |
cybersource.webhook | Webhook notification envelope, version 3 (eventType, productId, payload) |
cybersource.transaction_details | Transaction Details response (rootId, applicationInformation) |
cybersource.pay_by_bank_payload | Decrypted Pay by Bank notification payload (dotted keys) |
Worldpay adapter 0.2.0
| Format id | Input |
|---|---|
worldpay.event | Access Events v1 webhook ({ eventId, eventTimestamp, eventDetails }) for payment, payout and chargeback events |
worldpay.payment_response | Payments API (2024-06-01) or Card Payments v7 response (outcome, paymentId, commandId, refusalCode) |
worldpay.error | Error response ({ errorName, message, validationErrors[] }) |
worldpay.payment_query | Payment Queries v1 payment (lastEvent and events[] history) |
worldpay.card_payments_events_query | Deprecated Card Payments events query (Title Case lastEvent) |
worldpay.wpg.reply | WPG paymentService reply with error, orderStatus (payment or error) or ok, pasted as XML or as the body of an HTTP response. WPG documents begin with <!DOCTYPE paymentService ...>; PandaPayLens does not accept DOCTYPE declarations, so paste the document without that line. |
worldpay.wpg.notification | WPG order notification (paymentService notify orderStatusEvent with payment and lastEvent). WPG documents begin with <!DOCTYPE paymentService ...>; PandaPayLens does not accept DOCTYPE declarations, so paste the document without that line. |
worldpay.cnpapi.online_response | cnpAPI cnpOnlineResponse (namespace http://www.vantivcnp.com/schema) with an authorization, sale, capture, credit, void or authorization reversal response |
Trustly adapter 0.1.0
| Format id | Input |
|---|---|
trustly.eu.notification | EU JSON-RPC notification (credit, debit, pending, cancel, account, kyc, payoutconfirmation, payoutfailed, payoutdowngraded, verifyAccount, assessAccount, advice) |
trustly.eu.result | EU JSON-RPC method result (Deposit, Refund, AccountPayout, ApproveWithdrawal, GetWithdrawals) |
trustly.eu.error | EU JSON-RPC error envelope (JSONRPCError) |
trustly.amer.event | North America event notification (eventId, eventType, objectId), form-encoded or JSON |
trustly.amer.transaction | North America REST Transaction object (transactionId, status, paymentProviderTransaction) |
trustly.amer.error | North America REST error body (errors[] with code) |
DECTA adapter 0.1.0
| Format id | Input |
|---|---|
decta.order | Decta Gate API v0.6 Order object (API response or order.* / oct.* webhook body) |
decta.host2host | Host2Host, wallet and manual 3-D Secure step responses (processing_status, threed_check_url, status tds_*) |
decta.validation_error | API validation error object ({ <field>: [{ message, code }] }) |
decta.text_error | HTTP error response with a documented plain-text error body |
Inpay adapter 0.1.0
| Format id | Input |
|---|---|
inpay.payout | Payout payment request (status response, search item or webhook: inpay_unique_reference, end_to_end_id, state, reasons) |
inpay.order | Pay-in Order (GetOrder or order webhook: uuid, status, payments[], refund) |
inpay.error | Error body ({ errors: [...] }, { error: { code, title, details } } or { message }) |
inpay.iso20022 | ISO 20022 payment status report (XML Document with CstmrPmtStsRpt or FIToFIPmtStsRpt): group status and status reasons |
Finrax adapter 0.1.0
| Format id | Input |
|---|---|
finrax.payment | Payment object with deposits[] and nested refunds (GET /v1/payments/{id}) |
finrax.payment.create_response | Create or submit payment response (paymentInfo and paymentUrl) |
finrax.callback.deposit_received | Deposit received callback (paymentId, depositId, status, amounts) |
finrax.withdrawal | Withdrawal created response (withdrawId, clientWithdrawId, status) |
finrax.withdrawal.pending_approval | Withdrawal pending approval response (withdrawalId, clientLabel) |
finrax.callback.withdrawal | Withdrawal broadcast callback (COMPLETED, FAILED or BLOCKED) |
finrax.callback.withdrawal_approval | Withdrawal approval callback (APPROVED, PENDING, REJECTED or SKIPPED) |
finrax.error | Error body (timestamp, httpStatus, httpError, message, path) |
AstroPay adapter 0.1.0
| Format id | Input |
|---|---|
astropay.checkout.create_response | Checkout create payment response (payment_external_id, status) |
astropay.checkout.callback | Checkout callback (payment_external_id, payment_status, payment_info) |
astropay.checkout.payment | Payment object with a Checkout-only status |
astropay.wof.payment | Wallet on File payment object (authorize, capture, reversal, refund) |
astropay.payment_object | Checkout or Wallet on File payment object whose family is not visible |
astropay.cashout_v1 | Cashouts V1 response or callback |
astropay.direct_payment | Direct Payment response or callback |
astropay.direct_withdrawal | Direct Withdrawal response or callback |
astropay.qr.callback | QR Payments deposit callback |
astropay.merchant_gateway.error | OneTouch / merchant-api error envelope (error, internal_term, reasons) |
astropay.partner.error | Checkout and Wallet on File error body (error, message) |
astropay.cashout_v1.error | Cashouts V1 error (description text and HTTP status only) |
eZeeWallet adapter 0.1.0
| Format id | Input |
|---|---|
ezeewallet.transfer | POST /transfers and /transfers_new responses (transfer wrapper) and GET /transfers list items |
ezeewallet.refund | POST /refunds responses (refund wrapper) |
ezeewallet.transaction | GET /transaction lookup (ezw_reference_id, status, type) |
ezeewallet.single_payout | POST /single_payouts and /single_payouts_new responses |
ezeewallet.batch_payout | POST /batch_payouts_new responses (and legacy /batch_payouts when selected manually) |
ezeewallet.error | Error envelope { "error": { "code", "message" } } |
ezeewallet.notification | Transfer and payout notifications (unique_id, status, signature, decline_reason) |
Skrill adapter 0.1.0
| Format id | Input |
|---|---|
skrill.status_url | status_url post (mb_transaction_id, mb_amount, mb_currency, status, failed_reason_code), also payout posts with the same fields |
skrill.refund_status | Refund status report (mb_transaction_id, status, mb_amount, mb_currency) |
skrill.recurring_status | Recurring billing post (rec_payment_id, rec_payment_type, status) |
skrill.ubp.error | Unlinked Merchant Bank Payout JSON error response |
skrill.api.error | XML <response><error><error_msg> of refund.pl, pay.pl and ondemand_request.pl, decoded with the API error strings |
skrill.api.refund | XML refund.pl execution response (mb_amount, mb_currency, mb_transaction_id, status, transaction_id) |
skrill.api.transaction | XML <response><transaction> execution response of pay.pl (send money, Quick Checkout payouts) and ondemand_request.pl (1-Tap) |
skrill.mqi.http_error | MQI HTTP error (401 to 405) with a plain-text body, when Skrill is selected manually |
MiFinity adapter 0.1.0
| Format id | Input |
|---|---|
mifinity.error | Error envelope ({ errors: [{ type, errorCode, message, field }] }) |
mifinity.deposit_callback | eWallet deposit callback (traceId, validationKey, transactionReference, money) |
mifinity.deposit_status | Payment Status API response (status, detailedStatus, paymentResponse) |
mifinity.payout_status | Payout callback or Transaction Status lookup (transactionStatus 1 to 8) |
mifinity.payout_response | Synchronous payout response (PAB, PAC, PMC, Account to Account, PayAnyCoin) |
NMI adapter 0.1.0
| Format id | Input |
|---|---|
nmi.classic.response | Classic Payment API (transact.php) query-string response (response, responsetext, transactionid, response_code) |
nmi.webhook | Merchant webhook JSON (event_id, event_type, event_body) |
Paymentwall adapter 0.1.0
| Format id | Input |
|---|---|
paymentwall.pingback | Pingback query string (uid, type, ref, sign_version, sig) |
paymentwall.brick.error | Brick error JSON { type: "Error", error, code } |
paymentwall.brick.sdk_error | PHP SDK error envelope { success: 0, error: { message, code } } |
paymentwall.brick.charge | Brick charge object |
paymentwall.brick.subscription | Brick subscription object |
paymentwall.brick.3ds | Brick 3-D Secure step { success: 0, secure: { redirect | formHTML } } |
paymentwall.mobiamo.error | Mobiamo error (W codes) |
paymentwall.mobiamo.response | Mobiamo payment response (ref, flow, completed) |
paymentwall.error.unidentified | Error code without a product-specific structure (selected manually); all documented meanings are listed |
Ecommpay adapter 0.1.0
| Format id | Input |
|---|---|
ecommpay.callback | Gate payment callback (project_id, payment, operation, signature) |
ecommpay.payment_status | Gate payment status response (payment, operations[], errors[]) |
ecommpay.request_error | Gate request-level error ({ status: error, code, message }) |
ecommpay.request_accepted | Gate asynchronous acceptance ({ status: success, request_id, project_id, payment_id }) |
ecommpay.chargeback_callback | Chargeback summary and detailed callbacks (unsigned) |
emerchantpay adapter 0.1.0
| Format id | Input |
|---|---|
emerchantpay.notification | Genesis processing notification (form-encoded unique_id, transaction_type, status, terminal_token, signature), incl. dispute events |
emerchantpay.wpf.notification | Genesis WPF notification (form-encoded wpf_unique_id, wpf_status) |
emerchantpay.payment_response.xml | Genesis XML response with root payment_response (Processing API, reconcile, Smart Routing), pasted as XML or as the body of an HTTP response |
emerchantpay.payment_response.object | JSON object with the documented Genesis payment_response fields |
CCBill adapter 0.1.0
| Format id | Input |
|---|---|
ccbill.webhook | Webhook body (URL-encoded or JSON); event type from the query string when available |
ccbill.background_post | Background Post (Approval / Denial Post URL) |
ccbill.rest.charge | RESTful Transaction API charge response |
ccbill.rest.error | RESTful API and 3DS error envelope |
Segpay adapter 0.1.0
| Format id | Input |
|---|---|
segpay.processing.transaction | Processing transaction postback (default keys: trantype, action, stage, approved) |
segpay.processing.member | Processing member management postback (Probe, Enable, Disable, Cancel, Reactivation) |
segpay.processing.paypal_dispute | Processing PayPal Dispute postback |
segpay.gateway.notification | Gateway Event Notification (EventCode, SubEventTypeID, ResponseCode) |
Trust Payments adapter 0.1.0
| Format id | Input |
|---|---|
trust_payments.webservices.envelope | Webservices API JSON response envelope (response[] or responses[]), including TRANSACTIONQUERY records |
trust_payments.jwt.payload | Decoded response JWT payload ({ iat, payload: { response[] }, aud }) |
trust_payments.response.object | One Webservices response object (errorcode, requesttypedescription, transactionreference) |
trust_payments.url_notification | URL notification (form-encoded, notificationreference, responsesitesecurity) |
trust_payments.payment_pages.redirect | Payment Pages redirect fields (errorcode, settlestatus, transactionreference) |
PXP Financial adapter 0.1.0
| Format id | Input |
|---|---|
pxp.transaction_response | Transactions API v1 response or lookup item (state, stateData, systemTransactionId) |
pxp.api_error | API error envelope ({ correlationId, details, errorCode, errorReason }) |
pxp.webhook | Merchant webhook (eventCategory, eventDate, eventData, eventOwner) for transaction and authentication events |
Verotel adapter 0.1.0
| Format id | Input |
|---|---|
verotel.flexpay.postback | FlexPay postback key=value data (saleID, shopID, type, event, signature) |
verotel.rum.postback | VerotelRUM postback (trn, trn_id, usercode) |
verotel.api.error | Control Center API error envelope { error: { documentation, status, title } } |
verotel.api.transaction | Control Center API transaction object |
verotel.api.sale | Control Center API sale object |
verotel.api.action | Control Center API action response |
verotel.flexpay.status | FlexPay status page (plain text name: value lines, response FOUND, NOTFOUND or ERROR) |
NETbilling adapter 0.1.0
| Format id | Input |
|---|---|
netbilling.direct3.response | Direct Mode 3.2 response (URL-encoded status_code, trans_id, auth_msg) |
netbilling.direct3.exception | Direct Mode 3.2 exception (6xx/7xx HTTP status, empty body) |
netbilling.paymentform.response | Payment Form 2.2 return / postback with default Ecom_Ezic_Response_* names (experimental) |
netbilling.memberupdate.member | Member Update 1.1 GET response (experimental) |
Stripe semantics
code,decline_codeandadvice_codeare decoded separately. Retry guidance uses the most specific signal: advice code, then decline code, then error code, then error type.- An
api_errordoes not say whether the request took effect. PandaPayLens recommends verifying the object's state before trying again with the same idempotency key. - Events are linked by PaymentIntent and charge ids. Duplicate deliveries are recognized by event id.
- A PaymentIntent snapshot's
createdtime is when the PaymentIntent was created, not when its status was observed, so snapshots have no event time on the timeline. - Not supported yet: v2 thin events (
v2.core.event). They carry no embedded object, so they are recognized and explained, but not analyzed.
References: Stripe error codes, decline codes, webhooks.
Adyen semantics
- Standard webhooks are read from
notificationItems[].NotificationRequestItem. Each item becomes its own event. - Modifications (capture, refund, cancellation) are linked to the payment through
originalReference.merchantReferenceis never used to merge payments, because it can be reused across attempts; it is only used to flag possible duplicate charges. - Duplicate deliveries are recognized by
eventCode+pspReference, not by timestamp. CAPTUREorREFUNDwithsuccess=truemeans Adyen processed the request. It does not mean funds settled or reached the shopper.- On successful authorisations Adyen's
reasonfield holds the auth code, card summary and expiry; PandaPayLens drops it. - Not supported yet: other webhook families (Balance Platform, Management, etc.). They are recognized and explained, but not analyzed.
References: webhook types, handling webhook events, refusal reasons.
Adding a provider
A new adapter needs input schemas, synthetic fixtures, documentation, tests and supported-version metadata. See CONTRIBUTING.md in the repository.