# Electronic Commerce Indicator on Card Payments

Access the Electronic Commerce Indicator that card networks return in the authorization response.

Stripe exposes the Electronic Commerce Indicator (ECI) that card networks return in the authorization response on the [Charge](https://docs.stripe.com/api/charges/object.md) object. This field tells you the transaction’s network-confirmed authentication level and helps you assess whether liability for a fraudulent dispute might shift from you to the issuing bank.

This field applies to all card payments processed on the Visa and Mastercard networks, including Apple Pay and Google Pay wallet transactions as well as 3D Secure-authenticated payments.

## Why ECI matters

When a cardholder authenticates a payment, whether through biometric verification on Apple Pay or Google Pay or through 3D Secure, the card network assigns an ECI value indicating the level of authentication. This value helps you assess whether liability shift might be possible, but doesn’t determine the outcome by itself.

The card network can downgrade the ECI in the authorization response from an authenticated to an unauthenticated value. The `electronic_commerce_indicator` field gives you direct access to the network’s final ECI, so you can:

- Assess whether a given transaction might be eligible for liability shift.
- Submit the card network response ECI as evidence when contesting fraud disputes.
- Programmatically analyze response ECI values across your volume.

## ECI values

The ECI is a raw string value that the card network returns. Its meaning is network-specific.

| Visa ECI value | Meaning |
| --- | --- |
| `05` | Fully authenticated (secure e-commerce) |
| `06` | Authentication attempted |
| `07` | Not authenticated |

| Mastercard ECI value | Meaning |
| --- | --- |
| `00` | Not supported—authentication failed or couldn’t be attempted |
| `01` | Authentication attempted |
| `02` | Fully authenticated |
| `04` | Frictionless transaction through the Mastercard Identity Check Data Only service |
| `06` | Merchant-based liability |
| `07` | Partial shipment or recurring transaction |

These tables list the ECI values most relevant to authentication and liability shift, but they aren’t exhaustive. Card networks might return other valid ECI values for specific transaction types. Interpret each value in the context of the network that returned it.

The same ECI value can have different meanings across card networks. For example, Visa returns `02` for a recurring transaction, while Mastercard uses `02` to indicate a fully authenticated transaction. Some ECI values aren’t related to liability shift. Don’t use an ECI meaning from one network to interpret a transaction processed on another network.

> A populated response ECI is the card network’s final ECI. If the response ECI indicates that the transaction is unauthenticated (for example, Visa `07` or Mastercard `00`, `04`, or `06`), liability shift isn’t available for that transaction. An authenticated ECI is necessary but not sufficient for liability shift. Card network rules and transaction conditions determine the final liability shift outcome.

The ECI value is `null` when the card network doesn’t return an ECI in the authorization response. Non-Visa and non-Mastercard networks (such as American Express and Discover) don’t return ECI. Visa and Mastercard also might not return an ECI value in some cases, such as when the transaction was unauthenticated in the first place.

## Access ECI in the API

The ECI is available on the [Charge](https://docs.stripe.com/api/charges/object.md) object at `payment_method_details.card.electronic_commerce_indicator`.

### Read ECI after confirming a PaymentIntent

Expand `latest_charge` to read the ECI on the resulting charge when you confirm a [PaymentIntent](https://docs.stripe.com/api/payment_intents.md).

```bash
curl https://api.stripe.com/v1/payment_intents/{{PAYMENT_INTENT_ID}}/confirm \
  -u <<YOUR_SECRET_KEY>>: \
  -d payment_method="{{PAYMENT_METHOD_ID}}" \
  --data-urlencode return_url="https://example.com" \
  -d "expand[]"=latest_charge
```

The response contains the ECI on the expanded charge:

```json
{
  "id": "pi_xxx",
  "object": "payment_intent",
  "status": "succeeded",
  "latest_charge": {
    "id": "ch_xxx",
    "object": "charge",
    "payment_method_details": {
      "card": {
        "brand": "visa",
        "electronic_commerce_indicator": "05"
      },
      "type": "card"
    }
  }
}
```

### Retrieve ECI from an existing Charge

```bash
curl https://api.stripe.com/v1/charges/{{CHARGE_ID}} \
  -u <<YOUR_SECRET_KEY>>:
```

The response contains the ECI:

```json
{
  "id": "ch_xxx",
  "object": "charge",
  "payment_method_details": {
    "card": {
      "brand": "mastercard",
      "electronic_commerce_indicator": "02"
    },
    "type": "card"
  }
}
```

This field is also present in webhook event payloads that include the Charge object, such as `charge.succeeded` and `payment_intent.succeeded`.

## Relationship to other parameters

Stripe also exposes the ECI from the 3D Secure authentication outcome.

| Parameter | What it represents |
| --- | --- |
| `payment_method_details.card.three_d_secure.electronic_commerce_indicator` | **Existing**: The ECI from the 3D Secure authentication outcome, sent in the authorization request. This is the provisional value before the card network can modify it. |
| `payment_method_details.card.electronic_commerce_indicator` | **New**: The final ECI that the card network returned in the authorization response. Use this value when assessing the transaction’s authentication level. |

When both fields are present on a charge, use the top-level `payment_method_details.card.electronic_commerce_indicator`. The 3D Secure field represents what was requested; the new field represents the final ECI that the network returned.

In most cases these values match. When they differ, the card network changed the authentication level, and you must use the response ECI when assessing the transaction. ECI alone doesn’t determine liability shift.

The following example shows a downgraded Visa transaction, where 3D Secure authentication succeeded and sent ECI `05` in the request, but the card network returned `07` in the response. The authentication was downgraded, and liability shift doesn’t apply for this transaction.

```json
{
  "id": "ch_xxx",
  "object": "charge",
  "payment_method_details": {
    "card": {
      "brand": "visa",
      "electronic_commerce_indicator": "07",
      "three_d_secure": {
        "electronic_commerce_indicator": "05",
        "result": "authenticated"
      }
    },
    "type": "card"
  }
}
```

## View ECI in the Stripe Dashboard

The ECI value also appears on the [Payment details](https://dashboard.stripe.com/payments) page in the Dashboard, under the **Payment method** section. The field is labeled **Electronic commerce indicator**.

- For Visa and Mastercard transactions, the field displays the ECI value (for example, `05` or `02`), or a dash (`—`) if the network didn’t return a value.
- For other networks (such as American Express and Discover), the field is hidden, because those networks don’t return ECI in the authorization response.

## Query ECI in Sigma

The response ECI is also available in [Sigma](https://docs.stripe.com/data/how-sigma-works.md). Query the `card_electronic_commerce_indicator` column on the `payment_method_details` table to analyze ECI values across your charges. For example, you can report on the share of your Visa and Mastercard card payments with authenticated or unauthenticated response ECI values.

## Recommended actions

Because the response ECI reflects the network’s final ECI, you can use it to strengthen dispute evidence and to understand authentication patterns across your payments.

### Use ECI as dispute evidence

When you counter a fraudulent dispute on a transaction where the response ECI indicates authentication (for example, Visa `05` or Mastercard `02`), Stripe automatically adds the response ECI to your evidence details. The network considers this value together with its rules and the transaction conditions when determining liability shift. Also include additional details to increase your chance of winning the dispute.

### Analyze your transaction data

Use the ECI field to identify authentication patterns in your fraudulent and disputed volume. Query the field in [Sigma](https://docs.stripe.com/data/how-sigma-works.md) to compare response ECI values across transactions, and use these insights to inform payment method mix, routing, and fraud prevention decisions.

## Limitations

- **Network coverage**: Only Visa and Mastercard return ECI in the authorization response. The field is `null` for American Express, Discover, and other networks.
- **Historical data**: API data is populated from June 10, 2026, without a backfill for earlier non-preview data. Stripe Sigma and Stripe Data Pipeline data is populated from July 22, 2026, without a backfill for earlier data.
- **Not a definitive liability shift indicator**: ECI is one factor in liability shift determination. Other conditions, such as a valid cryptogram and merchant category eligibility, must also be satisfied. Stripe doesn’t guarantee liability shift outcomes.
