> ## Documentation Index
> Fetch the complete documentation index at: https://docs.gr4vy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# TokenEx

> Connect to TokenEx to create PSP-agnostic tokens from card details collected via Secure Fields.

export const connector = {
  displayName: "Tokenex",
  method: "card",
  features: "create_token delete_token verify_credentials zero_auth",
  supportedCountries: "US",
  supportedCurrencies: "USD"
};

export const ConnectorCapabilities = ({data}) => {
  const CAPABILITIES = [{
    keys: ["three_d_secure_hosted"],
    label: "3-D Secure (hosted)",
    description: "Gr4vy-hosted 3DS authentication flow.",
    cardOnly: true
  }, {
    keys: ["three_d_secure_pass_through"],
    label: "3-D Secure (pass-through)",
    description: "Pass through 3DS data authenticated by a third party.",
    cardOnly: true
  }, {
    keys: ["partial_authorization"],
    label: "Partial authorization",
    description: "Support partial approval responses."
  }, {
    keys: ["zero_auth"],
    label: "Zero auth",
    description: "Verify a card without charging it."
  }, {
    keys: ["void"],
    label: "Void",
    description: "Cancel an authorized transaction before capture."
  }, {
    keys: ["direct_capture"],
    label: "Direct capture",
    description: "Capture a payment immediately at authorization.",
    hideWhenUnsupported: true
  }, {
    keys: ["delayed_capture"],
    label: "Delayed capture",
    description: "Authorize a payment and capture it at a later time."
  }, {
    keys: ["partial_capture"],
    label: "Partial capture",
    description: "Capture a portion of the authorized amount."
  }, {
    keys: ["over_capture"],
    label: "Over capture",
    description: "Capture more than the originally authorized amount."
  }, {
    keys: ["refunds"],
    label: "Refunds",
    description: "Refund a captured payment."
  }, {
    keys: ["partial_refunds"],
    label: "Partial refunds",
    description: "Refund a portion of the captured amount."
  }, {
    keys: ["settlement_reporting"],
    label: "Settlement reporting",
    description: "Automatic settlement and reconciliation reporting."
  }, {
    keys: ["create_session"],
    label: "Create session",
    description: "Create a connector session for client-side flows."
  }, {
    keys: ["network_tokens_default", "network_tokens_toggle"],
    label: "Network tokens",
    description: "Network-level tokenization for improved approval rates.",
    cardOnly: true
  }, {
    keys: ["digital_wallets"],
    label: "Digital wallets",
    description: "Apple Pay, Google Pay, and other wallet integrations."
  }, {
    keys: ["payment_method_tokenization", "payment_method_tokenization_toggle"],
    label: "Payment method tokenization",
    description: "Store payment methods outside of transactions."
  }, {
    keys: ["transaction_sync"],
    label: "Transaction sync",
    description: "Synchronize transaction state from the connector."
  }, {
    keys: ["create_token"],
    label: "Tokenization",
    description: "Create a token from card details collected via Secure Fields.",
    hideWhenUnsupported: true
  }, {
    keys: ["delete_token"],
    label: "Delete token",
    description: "Delete a stored token.",
    hideWhenUnsupported: true
  }, {
    keys: ["verify_credentials"],
    label: "Verify credentials",
    description: "Validate the configured credentials against the connector.",
    hideWhenUnsupported: true
  }];
  const raw = data && data.features;
  const enabled = typeof raw === "string" ? new Set(raw.split(/\s+/).filter(Boolean)) : Array.isArray(raw) ? new Set(raw) : new Set(Object.keys(raw || ({})).filter(key => raw[key]));
  const isOn = entry => entry.keys.some(key => enabled.has(key));
  const isNonCard = data && data.method && data.method !== "card";
  const renderGroup = (title, entries, supported) => {
    if (entries.length === 0) return null;
    const mark = supported ? "✓" : "✕";
    const markColor = supported ? "#16a34a" : "#9ca3af";
    return <div style={{
      marginTop: "1rem"
    }}>
        <div style={{
      fontSize: "0.75rem",
      fontWeight: 600,
      letterSpacing: "0.05em",
      textTransform: "uppercase",
      opacity: 0.6,
      marginBottom: "0.25rem"
    }}>
          {title}
        </div>
        {}
        <div role="list">
          {entries.map(entry => <div role="listitem" key={entry.label} style={{
      display: "flex",
      gap: "0.5rem",
      alignItems: "baseline",
      padding: "0.3rem 0",
      opacity: supported ? 1 : 0.7
    }}>
              <span aria-hidden="true" style={{
      color: markColor,
      fontWeight: 700,
      flexShrink: 0
    }}>
                {mark}
              </span>
              <span>
                <strong>{entry.label}</strong>
                {entry.description ? <span style={{
      opacity: 0.85
    }}> — {entry.description}</span> : null}
              </span>
            </div>)}
        </div>
      </div>;
  };
  const visible = isNonCard ? CAPABILITIES.filter(entry => !entry.cardOnly) : CAPABILITIES;
  const supported = visible.filter(isOn);
  const unsupported = visible.filter(entry => !isOn(entry) && !entry.hideWhenUnsupported);
  return <div>
      {renderGroup("Supported", supported, true)}
      {renderGroup("Not supported", unsupported, false)}
    </div>;
};

TokenEx is a utility connector that creates a TokenEx token from card details collected via Gr4vy [Secure Fields](/guides/payments/secure-fields/quick-start). It provides a secure way to produce a PSP-agnostic token without raw card data reaching your servers.

This connector does not process payments. It is a tool to enable tokenization with TokenEx independently of a payment transaction.

## How it works

Card details are collected via Gr4vy Secure Fields and passed directly to TokenEx for tokenization. The connector returns the resulting token without charging the card.

The TokenEx connector:

* **Reduces PCI scope** - Card details are collected via Gr4vy Secure Fields, so raw card data never reaches your servers.
* **Simplifies TokenEx integration** - Produce a TokenEx token that can be used in server-side calls to any compatible payment processor.
* **Enables flexible workflows** - Tokenize cards independently of the payment step, supporting deferred or external payment flows.

## Setup

A TokenEx account can be requested by contacting the TokenEx sales team via their
[website](https://www.tokenex.com/request-demo).

## Credentials

When setting up TokenEx in the dashboard, configure the following credentials, which are obtained via the TokenEx dashboard.

* **TokenEx ID** - The unique identifier for your TokenEx account.
* **API Key** - The API key used to authenticate with the TokenEx API.

## Usage

1. Add the TokenEx connector in the Gr4vy dashboard and enter your TokenEx ID and API key.
2. Use Gr4vy [Secure Fields](/guides/payments/secure-fields/quick-start) to collect card details from the buyer. To store the card in Gr4vy at the same time, see [Secure Fields with stored cards](/guides/payments/secure-fields/stored-cards).
3. Submit the card details to Gr4vy. The connector sends them to TokenEx and returns a token. To create or delete a PSP token for an already-stored payment method, use the [provision PSP token](/reference/payment-service-tokens/provision-payment-service-token) and [delete PSP token](/reference/payment-service-tokens/delete-payment-service-token) APIs.
4. Use the token in your own server-side calls to a compatible payment processor.

## Capabilities

<ConnectorCapabilities data={connector} />
