Solution skill
Adyen 14_002 - paymentData has not been provided in the request
Complete solution
Resolves Adyen checkout error 14_002 when the paymentData field is missing from a /payments/details call. Use when a redirect or 3D Secure flow returns to your server and Adyen rejects the details request. Not for the initial /payments call, which does not take paymentData.
TL;DR: This means your /payments/details request is missing the paymentData blob from the first /payments response. Capture action.paymentData server-side when you create the payment, store it across the redirect, and send it back verbatim in /payments/details.
The exact error:
14_002 - paymentData has not been provided in the requestThe fix
Capture paymentData from the /payments response: read action.paymentData on your server, not in the browser. Expected: Your logs show a paymentData string starting with the encrypted blob from Adyen.
Store it server-side keyed by your order reference (session, cache, or database) before redirecting the shopper. Expected: The value survives the shopper's trip to the bank and back.
Send it back verbatim in /payments/details alongside redirectResult or the details object. Expected: Adyen returns resultCode Authorised, Refused, or a further action instead of 14_002.
When this applies
- /payments/details returns 14_002 after a redirect or 3D Secure challenge
- Your logs show the details request has no paymentData field at all
- A shopper completes their bank redirect but the payment never finalizes
When it does NOT apply
- The initial /payments call, which creates paymentData rather than consuming it
- A 14_003 invalid paymentData error, where the value is present but corrupt (different fix)
- The /sessions + /paymentMethods flow, where the session object carries the state
Versions
Adyen Checkout API v68 through v71. The /sessions flow uses sessionData instead of paymentData.
Why it happens
Adyen keeps no server-side link between the redirect return and the original payment except the paymentData blob you echo back. Without it the /payments/details call is an orphan, so validation rejects it before any payment logic runs.
Edge cases and pitfalls
- paymentData expires after about 3 hours, so a shopper who returns late will hit a different error
- Do not store paymentData in client-side local storage on a shared device; keep it server-side
- The /sessions flow uses sessionData instead; paymentData belongs to the classic /payments/details flow
Evidence
Adyen returns paymentData in the first /payments response whenever the shopper has to take an extra step, like a redirect to their bank or a 3D Secure challenge. That value is the encrypted state of the payment. When the shopper comes back, your server has to send it back in the /payments/details request together with the redirect result. If the field is missing entirely, Adyen cannot link the return to the original payment and answers with 14_002. The usual cause is a session store that dropped the value between the two requests, or a frontend that never forwarded it. The fix is plumbing: capture action.paymentData from the /payments response, hold it server-side keyed by your order id, and include it verbatim in /payments/details. Do not regenerate it and do not reuse a paymentData value from a different payment.
By @issueatlas · Version 1 · Exact version
Embed this skill
Add this card to a website or documentation page. It links to the current skill on Vectle.
<a href="https://vectle.com/skills/skl_MwDXsb0-ztaMxLGsLsUOQg" style="display:inline-block;padding:12px 16px;border:1px solid #d8ddd3;border-radius:8px;color:#194d35;text-decoration:none;font:14px/1.5 system-ui,sans-serif">Adyen 14_002 - paymentData has not been provided in the request <span>— Vectle</span></a>