---
title: "Authentication-only integration"
description: "Learn how you can integrate with Adyen as a standalone 3D Secure provider."
url: "https://docs.adyen.com/online-payments/classic-integrations/classic-api-integration/3d-secure-authentication/3d-secure-1/3d-secure-1-authentication-only"
source_url: "https://docs.adyen.com/online-payments/classic-integrations/classic-api-integration/3d-secure-authentication/3d-secure-1/3d-secure-1-authentication-only.md"
canonical: "https://docs.adyen.com/online-payments/classic-integrations/classic-api-integration/3d-secure-authentication/3d-secure-1/3d-secure-1-authentication-only"
last_modified: "2026-06-01T15:33:14+02:00"
language: "en"
---

# Authentication-only integration

Learn how you can integrate with Adyen as a standalone 3D Secure provider.

[View source](/online-payments/classic-integrations/classic-api-integration/3d-secure-authentication/3d-secure-1/3d-secure-1-authentication-only.md)

**Adyen is no longer developing the Classic API integration**

This page is for the Classic API (`/authorise`) integration, which we no longer accept new integrations with.

We strongly recommend migrating to the newer [3D Secure authentication-only on Checkout API](/online-payments/3d-secure/standalone-authentication) integration. To use this newer integration, you must also [migrate to the Checkout API](/online-payments/upgrade-your-integration/migrate-to-checkout-api).

Implement a fallback implementation in case the issuer does not support [3D Secure 2 authentication-only integration](/online-payments/classic-integrations/classic-api-integration/3d-secure-authentication/native-3ds2/authentication-only-integration) yet. In the response, you get the authentication data that you need to authorise the payment with another PSP or acquirer.

If after the authentication you decide to process the payment with us, you can also [continue with the payment authorisation](#authorise-the-payment-with-adyen) with Adyen.

## Before you begin

Before you begin to integrate, make sure you have followed the [Get started with Adyen guide](/get-started-with-adyen) to:

* Get an overview of the steps needed to accept live payments.
* Create your test account.

After you have created your test account:

1. [Get your API Key](/development-resources/api-credentials#generate-api-key). Save a copy as you'll need it for API calls you make to the Adyen payments platform.
2. Read and understand the [full 3D Secure 1 Classic API integration guide](/online-payments/classic-integrations/classic-api-integration/3d-secure-authentication). 

## Step 1: Submit a payment authentication request

Submit an authentication request with a  [/authorise](https://docs.adyen.com/api-explorer/Payment/latest/post/authorise) call containing the required 3D Secure 1 parameters and the `authenticationData.authenticationOnly` parameter:

* `authenticationData.authenticationOnly`: Set this to **true**.

**/authorise request**

```bash
curl https://pal-test.adyen.com/pal/servlet/Payment/v46/authorise \
-H 'x-api-key: ADYEN_API_KEY' \
-H 'content-type: application/json' \
-d '{
  "amount":{
    "currency":"EUR",
    "value":2100
  },
  "merchantAccount":"YOUR_MERCHANT_ACCOUNT",
  "reference":"YOUR_REFERENCE_NUMBER",
  "authenticationData" {
    "authenticationOnly": true,
    "attemptAuthentication": "always"
  },
  "browserInfo":{
    "userAgent":"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/70.0.3538.110 Safari\/537.36",
    "acceptHeader":"text\/html,application\/xhtml+xml,application\/xml;q=0.9,image\/webp,image\/apng,*\/*;q=0.8",
    "language":"en",
    "colorDepth":24,
    "screenHeight":723,
    "screenWidth":1536,
    "timeZoneOffset":0,
    "javaEnabled":false
  },
  "card": {
    "number": "4212345678901237",
    "expiryMonth": "03",
    "expiryYear": "2030",
    "cvc": "737",
    "holderName": "Simon Hopper"
  }
}'
```

You'll receive a response containing:

* `resultCode`: **RedirectShopper**. This means that you have to perform the [3D Secure authentication flow](#perform-3d-secure-1-flow).

For a complete list of `resultCode` values and the actions that you need to do, see [Result codes](/online-payments/payment-result-codes).

**/authorise response**

```json
{
    "pspReference": "8825536842162448",
    "resultCode": "RedirectShopper",
    "issuerUrl": "https://test.adyen.com/hpp/3d/validate.shtml",
    "md": "djIhR2R6NkNkdVFROVdFc1YrN1B3cmZ3dz09IfNZPuc4S9doxv...=",
    "paRequest": "eNpVUttuwjAM/RXGB5A0baFUJlIHSEMal3F5nrLU9gH...="
}
```

## Step 2: Perform the 3D Secure 1 authentication flow

1. [Redirect the shopper to the card issuer](/online-payments/classic-integrations/classic-api-integration/3d-secure-authentication/3d-secure-1#step-2-redirect-to-the-card-issuer) to perform authentication. After a successful authentication, the card issuer [returns the shopper to your site](/online-payments/classic-integrations/classic-api-integration/3d-secure-authentication/3d-secure-1#step-3-return-to-the-merchant-site) and sends an HTTP POST to your `TermUrl` containing the following:

   * `MD`: Payment session identifier.
   * `PaRes`: Payment authorisation response.

2. Get the `MD` and `PaRes` values and proceed to submit the authentication result.

If after performing the authentication you decide to continue the payment authorisation with Adyen, skip the next step proceed to [Authorise the payment with Adyen](#authorise-the-payment-with-adyen) instead.

## Step 3: Submit the result and get the authentication data

1. Submit the authentication result in an [authorise3d](https://docs.adyen.com/api-explorer/Payment/latest/post/authorise3d) request:

* `md`: Payment session identifier, `MD`, returned by the card issuer in the previous step.

* `paResponse`: Payment authorisation response, `PaRes`, returned by the card issuer in the previous step.

* `authenticationData.authenticationOnly`: Set this to **true**.

  **/authorise3d request**

  #### curl

  ```bash
  curl https://pal-test.adyen.com/pal/servlet/Payment/v46/authorise3d \
  -H 'x-api-key: ADYEN_API_KEY' \
  -H 'content-type: application/json' \
  -d '{
      "md": "djIhR2R6NkNkdVFROVdFc1YrN1B3cmZ3dz09IfNZPuc4S9doxvKxoki3cg..=",
      "paResponse": "eNrNV1mTqsgSfvdXdJx5ZOawC56gjSgWFZUdQXhjkx0UkMVff2md6dM..=",
      "authenticationData": {
          "authenticationOnly": true
      },
      "merchantAccount": "YOUR_MERCHANT_ACCOUNT"
  }'
  ```

  #### Java

  ```java
  // Adyen Java API Library v26.3.0
  import com.adyen.Client;
  import com.adyen.enums.Environment;
  import com.adyen.model.payment.*;
  import java.time.OffsetDateTime;
  import java.util.*;
  import com.adyen.service.*;

  Client client = new Client("ADYEN_API_KEY", Environment.TEST);

  // Create the request object(s)
  PaymentRequest3d paymentRequest3d = new PaymentRequest3d()
    .paResponse("eNrNV1mTqsgSfvdXdJx5ZOawC56gjSgWFZUdQXhjkx0UkMVff2md6dM..=")
    .merchantAccount("YOUR_MERCHANT_ACCOUNT")
    .md("djIhR2R6NkNkdVFROVdFc1YrN1B3cmZ3dz09IfNZPuc4S9doxvKxoki3cg..=");

  // Send the request
  paymentApi service = new paymentApi(client);
  PaymentResult response = service.authorise3d(paymentRequest3d, null);
  ```

  #### PHP

  ```php
  // Adyen PHP API Library v18.2.1
  use Adyen\Client;
  use Adyen\Environment;
  use Adyen\Model\Payments\PaymentRequest3d;
  use Adyen\Service\Payments\PaymentsApi;

  $client = new Client();
  $client->setXApiKey("ADYEN_API_KEY");
  $client->setEnvironment(Environment::TEST);


  // Create the request object(s)
  $paymentRequest3d = new PaymentRequest3d();
  $paymentRequest3d
    ->setPaResponse("eNrNV1mTqsgSfvdXdJx5ZOawC56gjSgWFZUdQXhjkx0UkMVff2md6dM..=")
    ->setMerchantAccount("YOUR_MERCHANT_ACCOUNT")
    ->setMd("djIhR2R6NkNkdVFROVdFc1YrN1B3cmZ3dz09IfNZPuc4S9doxvKxoki3cg..=");

  // Send the request
  $service = new PaymentsApi($client);
  $response = $service->authorise3d($paymentRequest3d);
  ```

  #### C\#

  ```cs
  // Adyen .net API Library v17.0.0
  using Adyen;
  using Environment = Adyen.Model.Environment;
  using Adyen.Model;
  using Adyen.Model.Payment;
  using Adyen.Service;

  var config = new Config()
  {
      XApiKey = "ADYEN_API_KEY",
      Environment = Environment.Test
  };
  var client = new Client(config);

  // Create the request object(s)
  PaymentRequest3d paymentRequest3d = new PaymentRequest3d
  {
    PaResponse = "eNrNV1mTqsgSfvdXdJx5ZOawC56gjSgWFZUdQXhjkx0UkMVff2md6dM..=",
    MerchantAccount = "YOUR_MERCHANT_ACCOUNT",
    Md = "djIhR2R6NkNkdVFROVdFc1YrN1B3cmZ3dz09IfNZPuc4S9doxvKxoki3cg..="
  };

  // Send the request
  var service = new PaymentService(client);
  var response = service.Authorise3d(paymentRequest3d);
  ```

  #### NodeJS (JavaScript)

  ```js
  // Adyen Node API Library v17.3.0
  // Require the parts of the module you want to use
  const { Client, PaymentAPI } = require('@adyen/api-library');
  // Initialize the client object
  const client = new Client({apiKey: "ADYEN_API_KEY", environment: "TEST"});

  // Create the request object(s)
  const paymentRequest3d = {
    md: "djIhR2R6NkNkdVFROVdFc1YrN1B3cmZ3dz09IfNZPuc4S9doxvKxoki3cg..=",
    paResponse: "eNrNV1mTqsgSfvdXdJx5ZOawC56gjSgWFZUdQXhjkx0UkMVff2md6dM..=",
    authenticationData: {
      authenticationOnly: true
    },
    merchantAccount: "YOUR_MERCHANT_ACCOUNT"
  }

  // Send the request
  const paymentAPI = new PaymentAPI(client);
  const response = paymentAPI.authorise3d(paymentRequest3d);
  ```

  #### Go

  ```go
  // Adyen Go API Library v10.4.0
  import (
    "context"
    "github.com/adyen/adyen-go-api-library/v9/src/common"
    "github.com/adyen/adyen-go-api-library/v9/src/adyen"
    "github.com/adyen/adyen-go-api-library/v9/src/payments"
  )
  client := adyen.NewClient(&common.Config{
    ApiKey:      "ADYEN_API_KEY",
    Environment: common.TestEnv,
  })

  // Create the request object(s)
  paymentRequest3d := payments.PaymentRequest3d{
    PaResponse: "eNrNV1mTqsgSfvdXdJx5ZOawC56gjSgWFZUdQXhjkx0UkMVff2md6dM..=",
    MerchantAccount: "YOUR_MERCHANT_ACCOUNT",
    Md: "djIhR2R6NkNkdVFROVdFc1YrN1B3cmZ3dz09IfNZPuc4S9doxvKxoki3cg..=",
  }

  // Send the request
  service := client.Payments()
  req := service.PaymentsApi.Authorise3dInput().PaymentRequest3d(paymentRequest3d)
  res, httpRes, err := service.PaymentsApi.Authorise3d(context.Background(), req)
  ```

  #### Python

  ```py
  # Adyen Python API Library v12.5.1
  import Adyen

  adyen = Adyen.Adyen()
  adyen.client.xapikey = "ADYEN_API_KEY"
  adyen.client.platform = "test" # The environment to use library in.

  # Create the request object(s)
  json_request = {
    "md": "djIhR2R6NkNkdVFROVdFc1YrN1B3cmZ3dz09IfNZPuc4S9doxvKxoki3cg..=",
    "paResponse": "eNrNV1mTqsgSfvdXdJx5ZOawC56gjSgWFZUdQXhjkx0UkMVff2md6dM..=",
    "authenticationData": {
      "authenticationOnly": True
    },
    "merchantAccount": "YOUR_MERCHANT_ACCOUNT"
  }

  # Send the request
  result = adyen.payment.payments_api.authorise3d(request=json_request)
  ```

  #### Ruby

  ```rb
  # Adyen Ruby API Library v9.5.1
  require "adyen-ruby-api-library"

  adyen = Adyen::Client.new
  adyen.api_key = 'ADYEN_API_KEY'
  adyen.env = :test # Set to "live" for live environment

  # Create the request object(s)
  request_body = {
    :md => 'djIhR2R6NkNkdVFROVdFc1YrN1B3cmZ3dz09IfNZPuc4S9doxvKxoki3cg..=',
    :paResponse => 'eNrNV1mTqsgSfvdXdJx5ZOawC56gjSgWFZUdQXhjkx0UkMVff2md6dM..=',
    :authenticationData => {
      :authenticationOnly => true
    },
    :merchantAccount => 'YOUR_MERCHANT_ACCOUNT'
  }

  # Send the request
  result = adyen.payment.payments_api.authorise3d(request_body)
  ```

  #### NodeJS (TypeScript)

  ```ts
  // Adyen Node API Library v17.3.0
  // Require the parts of the module you want to use
  import { Client, PaymentAPI, Types } from "@adyen/api-library";
  // Initialize the client object
  const client = new Client({apiKey: "ADYEN_API_KEY", environment: "TEST"});

  // Create the request object(s)
  const paymentRequest3d: Types.payment.PaymentRequest3d = {
    paResponse: "eNrNV1mTqsgSfvdXdJx5ZOawC56gjSgWFZUdQXhjkx0UkMVff2md6dM..=",
    merchantAccount: "YOUR_MERCHANT_ACCOUNT",
    md: "djIhR2R6NkNkdVFROVdFc1YrN1B3cmZ3dz09IfNZPuc4S9doxvKxoki3cg..="
  };

  // Send the request
  const paymentAPI = new PaymentAPI(client);
  const response = paymentAPI.authorise3d(paymentRequest3d);
  ```

You'll receive a response containing:

* `resultCode`: If the authentication process has finished, you receive **AuthenticationFinished**.

* `additionalData.threeDAuthenticatedResponse`: Indicates the results of the authentication. The value **Y** means that authentication was successful. If you get another value, see the [list of possible values](/online-payments/classic-integrations/classic-api-integration/3d-secure-authentication/raw-3d-secure-responses#3ds-challenged) to learn what it means.

  **/authorise3d response**

  ```json
  {
      "additionalData": {
          "cavv": "AQIDBAUGBwgJCgsMDQ4PEBESExQ=",
          "xid": "ODgyNTUzNjg0MjE2MjQ0OAAAAAA=",
          "threeDAuthenticatedResponse": "Y",
          "cavvAlgorithm": "1",
          "threeDOfferedResponse": "Y",
          "eci": "02",
          "authorisationMid": "1000",
          "acquirerCode": "TestPmmAcquirerAccount"
      },
      "pspReference": "8825536842162448",
      "resultCode": "AuthenticationFinished"
  }
  ```

2. If you received **Y** in `additionalData.threeDAuthenticatedResponse`, you can continue to [the next step to authorise the payment](#authorise-the-payment-with-adyen).

See our [API reference](https://docs.adyen.com/api-explorer/#/Payment/latest/authorise__resParam_additionalData) to learn more about the response parameters and how the values map to 3D Secure specifications.

## Optional: Authorise the payment with Adyen

If after completing the authentication flow you decide to proceed with authorising the payment with Adyen, you can still switch and continue with a payment authorisation.

Make a POST  [authorise3d](https://docs.adyen.com/api-explorer/Payment/latest/post/authorise3d) request from your server and include the following parameters: 

* `authenticationData.authenticationOnly`: Set this to **false**.

**/authorise3d request - Continue authorising with Adyen**

```json
{
    "md": "djIhR2R6NkNkdVFROVdFc1YrN1B3cmZ3dz09IfNZPuc4S9doxvKxoki3cg..=",
    "paResponse": "eNrNV1mTqsgSfvdXdJx5ZOawC56gjSgWFZUdQXhjkx0UkMVff2md6dM..=",
    "authenticationData": {
        "authenticationOnly": false
    },
    "merchantAccount": "YOUR_MERCHANT_ACCOUNT"
}
```

You'll receive **Authorised** as the `resultCode` if the payment was successful.

**/authorise3d response - Successful authorisation**

```json
{
    "pspReference": "8825495331860022",
    "resultCode": "Authorised"
}
```
