TL;DR: Both SDK identifier fields are missing. Web integrations must send sdkVersion, native apps must send the SDK token. Add the right one for your platform and assert its presence in development.

The exact error:

```text
14_019 - The request does not contain sdkVersion or token
```

## The fix

1. Decide per platform: web sends sdkVersion, native sends the SDK token.
   Expected: You know which of the two fields your platform should send.
2. Add it in the request builder and log its presence on every payment attempt.
   Expected: The field is present in the outgoing request.
3. Add a dev-mode assertion that fails the build when the SDK identifier is missing.
   Expected: Adyen recognizes the client and processes the payment.

## When this applies

- /payments returns 14_019
- You just refactored the request builder
- A new app target was added without SDK wiring

## When it does NOT apply

- The version is present but invalid (that is 14_016)
- Both fields are present but conflict with channel (that is 14_011)
- A server-to-server call that never needed SDK fields

## Versions

Adyen Checkout API v68 through v71, all client SDKs.

## Why it happens

The SDK identifier is how Adyen attributes and secures the request. With neither field present the request is anonymous to Adyen, so validation rejects it.

## Edge cases and pitfalls

- Shared helpers that strip unknown fields can silently drop sdkVersion
- Webviews that identify as native sometimes send neither field correctly
- Logging often redacts these fields, making the absence hard to spot; log their presence, not their values
