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

# Overview

> Enrich transaction narratives with personal finance categories, merchant details, and location using the Plaid Connector

export const VendorApiVersionTag = ({versions, label = "Supports"}) => {
  useEffect(() => {
    if (!versions || versions.length === 0) {
      return undefined;
    }
    const findAndSegmentStart = (reference, target) => {
      let i = 0;
      while (i < reference.length && i < target.length && reference[i] === target[i]) {
        i += 1;
      }
      let start = i;
      while (start > 0 && (/[0-9.vR]/).test(target[start - 1])) {
        start -= 1;
      }
      return start;
    };
    const formatText = () => {
      const suffix = " operations";
      if (versions.length === 1) {
        return `${label} ${versions[0]}${suffix}`;
      }
      const [first, ...rest] = versions;
      const last = rest[rest.length - 1];
      const andStart = findAndSegmentStart(first, last);
      const lead = first.slice(0, andStart);
      if (versions.length === 2) {
        return `${label} ${first} and ${last.slice(andStart)}${suffix}`;
      }
      const stems = versions.map(version => version.slice(andStart));
      return `${label} ${lead}${stems.slice(0, -1).join(", ")}, and ${stems[stems.length - 1]}${suffix}`;
    };
    const text = formatText();
    const mountCallout = () => {
      const title = document.querySelector("#page-title");
      const header = title?.closest("header") ?? document.querySelector("#header");
      if (!title || !header || !header.contains(title)) {
        return null;
      }
      let titleBlock = title;
      while (titleBlock.parentElement && titleBlock.parentElement !== header) {
        titleBlock = titleBlock.parentElement;
      }
      let callout = header.querySelector("[data-vendor-api-version-callout='true']");
      if (!callout) {
        callout = document.createElement("div");
        callout.dataset.vendorApiVersionCallout = "true";
        callout.className = "vendor-api-version-callout";
        titleBlock.insertAdjacentElement("afterend", callout);
      }
      callout.replaceChildren();
      const textEl = document.createElement("span");
      textEl.className = "vendor-api-version-text";
      textEl.textContent = text;
      callout.appendChild(textEl);
      return callout;
    };
    let callout = mountCallout();
    if (callout) {
      return () => {
        callout?.remove();
      };
    }
    const observer = new MutationObserver(() => {
      callout = mountCallout();
      if (callout) {
        observer.disconnect();
      }
    });
    observer.observe(document.body, {
      childList: true,
      subtree: true
    });
    return () => {
      observer.disconnect();
      callout?.remove();
    };
  }, [versions, label]);
  return null;
};

export const vendorApiVersions = ["Plaid Enrich API"];

<VendorApiVersionTag versions={vendorApiVersions} />

The Plaid Connector integrates Grand Central with [Plaid Enrich](https://plaid.com/products/enrich/). It transforms raw transaction descriptions into personal finance categories, merchant details, location signals, and payment-channel metadata. The connector delivers results to downstream consumers through Sync Hub.

Plaid enrichment is synchronous at the vendor layer. After Grand Central accepts a batch, the connector calls Plaid `POST /transactions/enrich` and publishes the enriched payload to Sync Hub in near real time. Channels still receive only an HTTP acknowledgement from Grand Central. Enriched data arrives exclusively through Sync Hub events.

## How it works

The following diagram shows how Grand Central accepts an enrichment batch, how the Plaid Connector calls Plaid Enrich, and how Sync Hub delivers the result:

```mermaid theme={"system"}
%%{init: {
  'theme': 'base',
  'themeVariables': {
    'primaryColor': '#ffffff',
    'primaryBorderColor': '#295eff',
    'primaryTextColor': '#091c35',
    'lineColor': '#091c35',
    'secondaryColor': '#f3f6f9',
    'tertiaryColor': '#ebf0f5',
    'fontFamily': 'Libre Franklin, sans-serif'
  }
}}%%
sequenceDiagram
  autonumber
  participant Channel as Channel or Engagement Banking Platform (EBP) service
  participant GC as Grand Central unified API
  participant Connector as Plaid Connector
  participant Plaid as Plaid Enrich
  participant SH as Sync Hub

  Channel->>GC: POST /internal/transactions/enrichment
  GC-->>Channel: 202 empty body
  GC->>Connector: Route enrichment batch
  Connector->>Plaid: POST /transactions/enrich
  Plaid-->>Connector: Enriched transactions
  Connector->>SH: transactionsEnriched
  SH-->>Channel: Event delivery to subscribers
```

## Key capabilities

<CardGroup cols={2}>
  <Card title="Single-call enrichment" icon="bolt">
    Map Grand Central unified transaction batches to the Plaid Enrich request shape and receive enriched transactions and enrichment metadata in one vendor response.
  </Card>

  <Card title="Personal finance categories" icon="tags">
    Surface Plaid personal finance category (PFC) data on each enriched transaction, including primary and detailed category values and confidence.
  </Card>

  <Card title="Merchant mapping" icon="store">
    Map Plaid merchant and counterparty fields into Grand Central `merchantInformation` for consistent downstream consumption.
  </Card>

  <Card title="Location and payment channel" icon="location-dot">
    Attach city, region, country, and coordinates when Plaid provides location enrichment, and preserve payment channel signals (for example, online or in store).
  </Card>

  <Card title="Unified asynchronous delivery to channels" icon="tower-broadcast">
    Although Plaid responds synchronously to the connector, channels follow the same accept-then-deliver pattern. Grand Central acknowledges the REST request, then publishes `transactionsEnriched` to Sync Hub with canonical category, merchant, and location fields.
  </Card>
</CardGroup>

## Supported operations

The Plaid Connector supports the following operations from the Grand Central transaction enrichment unified API.

| Operation                           | Endpoint                                          |
| :---------------------------------- | :------------------------------------------------ |
| Accept transaction enrichment batch | `POST {baseURL}/internal/transactions/enrichment` |

Grand Central returns `202` with an empty body.

A request can contain a maximum of 50 accounts and 100 transactions in total. For schema limits and other restrictions, see [Reference](/connectors/financial-data-aggregation/plaid-transaction-enrichment/reference).

### Enrichment events (Sync Hub)

When Plaid Enrich completes, the connector publishes unified enrichment events to Sync Hub. Downstream consumers subscribe to Sync Hub to receive updates. You do not need to poll Plaid directly.

The following table lists the event that the connector publishes:

| Event                  | When emitted                                                                 |
| :--------------------- | :--------------------------------------------------------------------------- |
| `transactionsEnriched` | Plaid Enrich succeeds, including partial per-item outcomes where applicable. |

Published events use the standard Grand Central envelope. The `data` payload includes per-transaction category, merchant, and location fields. Grand Central preserves Plaid native personal finance category taxonomy and does not remap categories to other vendor taxonomies.

For how Sync Hub distributes events to multiple consumers, see [Sync Hub overview](/platform/sync-hub/overview).

## When to choose Plaid

The following table compares when Plaid is a fit and when another vendor is a better match:

| Choose Plaid when                                                                                                      | Consider another vendor when                                                              |
| :--------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------- |
| You need synchronous vendor enrichment with personal finance categories, counterparties, and location in one response. | You require SaltEdge learn or unlearn flows for category feedback.                        |
| Your use cases focus on US personal and retail banking, spending insights, or linked external account transactions.    | You need webhook-driven multi-step categorization with optional merchant resolution APIs. |
| You want a single vendor call behind the unified accept-then-deliver Sync Hub pattern.                                 | You already standardize on SaltEdge Data Enrichment for EU or UK enrichment programs.     |

## Core use cases supported

<CardGroup cols={2}>
  <Card title="US personal and retail banking" icon="building-columns">
    Enrich core and linked-account transaction feeds for US retail and personal banking experiences.
  </Card>

  <Card title="Spending insights and personal financial management (PFM)" icon="chart-pie">
    Group transactions by category and merchant, improve search using enriched narratives, and feed category-level aggregates into budget and goal features.
  </Card>

  <Card title="Linked external account transactions" icon="link">
    Enrich transactions retrieved from external accounts so customers see consistent category and merchant context alongside internal accounts.
  </Card>
</CardGroup>

For endpoint and property details, see [Reference](/connectors/financial-data-aggregation/plaid-transaction-enrichment/reference). For deployment steps, see [Get started](/connectors/financial-data-aggregation/plaid-transaction-enrichment/get-started).
