Changelog
Changes are announced here. Within v1 they never require you to change working code —
see Versioning & deprecation.
November 2026
Section titled “November 2026”New
- Fulfil an order, a guide that takes an order from session creation to a verified webhook, in Node.js, PHP and Python.
- Refund object.
POST /gateway/sessions/{id}/refund/now returns the refund: are_…id, astatusofPENDING,SUCCEEDEDorFAILED, and aprocessor_message. It replaces the earlier response fields (refund_id,refunded_amount,automated_refund,epg_error). Idempotency-Keyon refunds, so a timed-out refund can be retried without refunding twice. See Retrying safely.- Refund events
refund.succeededandrefund.failed, for refunds issued through any channel, and arefundslist on every session. session.attempt_failed, sent for every declined payment attempt.localeon sessions chooses the payment page’s language:fr,en, orauto(the default) to follow the buyer’s browser. The card-entry page now opens in the same language as the payment page. See Language.- The API reference now documents every webhook event and every error response.
The OpenAPI specification can be downloaded at
/openapi/merchant-api.yaml. - Markdown version of every guide, at the page’s address with
.mdin place of the trailing slash (for example/guides/webhooks.md), so a single page can be handed to an AI assistant./llms.txtnow links to these. - Send a test event in your dashboard now covers every event, including
session.attempt_failedand the refund events.
Changed
- The payment page can no longer be shown in an iframe. See Websites and mobile apps.
- A session created without
localefollows the buyer’s browser; the payment page used to open in French. - A webhook’s body
idis now the same value as itsX-Paymee-Webhook-Idheader. - Webhook retries now span about 3 days (up to 10 deliveries) instead of about a day.
- Webhooks are sent within seconds after the change they describe, independently of the buyer’s checkout; events can arrive out of order.
- Requests refused by a business rule now always answer
422(some refund refusals answered400). - Validation errors carry specific codes such as
required,blankandmax_lengthinstead ofinvalidfor every case. - Optional text fields sent as
""count as not given, andmetadataaccepts numbers and booleans (stored as text). webhook_urlis no longer looked up in DNS when you create a session; the address is checked when each event is delivered.- An unexpected server error now answers an
internal-errorproblem document. - Every amount — in responses and in webhooks — now has exactly the currency’s decimals
(
"10.500"). Some response fields (a fetched session’samount, an attempt’sfee_amountandnet_amount, and the webhookpaymentamounts) used to show five ("10.50000"); a missingnet_amountisnull. - Every timestamp now ends in
Z; some webhook timestamps used+00:00. - The same data has the same name in API responses and webhooks: the buyer is a nested
buyerobject (replacing thebuyer_first_name,buyer_last_name,buyer_emailandbuyer_phonefields of API responses); the time a session ended iscompleted_at(replacingpaid_atin webhooks); an attempt’s number isattempt_number; and an attempt’sfailure_codeis the acquirer’s decline code everywhere (it was alwaysdeclinedin API responses), with its reason infailure_message. checkout.session.expiredno longer repeats the session id aspayment_session_id: usedata.id.

