---
title: "Fetch recurring transaction streams"
method: POST
path: "/transactions/recurring/get"
tags: ["plaid"]
---

# Fetch recurring transaction streams

`POST /transactions/recurring/get`

The `/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user's checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments.

This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager.

This endpoint can only be called on an Item that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/transactions/get` or `/transactions/sync`).

When using Recurring Transactions, for best results, make sure to use the [`days_requested`](https://plaid.com/docs/api/link/#link-token-create-request-transactions-days-requested) parameter to request at least 180 days of history when initializing Items with Transactions. Once all historical transactions have been fetched, call `/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook.

After the initial call, you can call the `/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available.

## Request body

- TransactionsRecurringGetRequest — TransactionsRecurringGetRequest defines the request schema for `/transactions/recurring/get`
  - `client_id` string — Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body.
  - `access_token` string, required — The access token associated with the Item for which data is being requested.
  - `secret` string — Your Plaid API `secret`. The `secret` is required and may be provided either in the `PLAID-SECRET` header or as part of a request body.
  - `options` TransactionsRecurringGetRequestOptions — An optional object to be used with the request. If specified, `options` must not be `null`.
    - `include_personal_finance_category` boolean — Personal finance categories are now returned by default.
    - `personal_finance_category_version` 'v1' | 'v2' — Indicates which version of the personal finance category taxonomy is being used. [View PFCv2 and PFCv1 taxonomies](https://plaid.com/documents/pfc-taxonomy-all.csv). If you enabled Transactions or Enrich before December 3, 2025 you will receive the `v1` taxonomy by default and may request `v2` by explicitly setting this field to `v2` in the request. If you enabled Transactions or Enrich on or after December 3, 2025, you may only receive the `v2` taxonomy.
  - `account_ids` string[] — An optional list of `account_ids` to retrieve for the Item. Retrieves all active accounts on item if no `account_id`s are provided. Note: An error will be returned if a provided `account_id` is not associated with the Item.

## Response `200`

OK

- TransactionsRecurringGetResponse — TransactionsRecurringGetResponse defines the response schema for `/transactions/recurring/get`
  - `inflow_streams` TransactionStream[], required — An array of inflow transaction streams.
    - `account_id` string, required — The ID of the account to which the stream belongs
    - `stream_id` string, required — A unique id for the stream
    - `category` string[], nullable, required — A hierarchical array of the categories to which this transaction belongs. See [Categories](https://plaid.com/docs/api/products/transactions/#categoriesget). All implementations are encouraged to use the new `personal_finance_category` instead of `category`. `personal_finance_category` provides more meaningful categorization and greater accuracy.
    - `category_id` string, nullable, required — The ID of the category to which this transaction belongs. See [Categories](https://plaid.com/docs/api/products/transactions/#categoriesget). All implementations are encouraged to use the new `personal_finance_category` instead of `category`. `personal_finance_category` provides more meaningful categorization and greater accuracy.
    - `description` string, required — A description of the transaction stream.
    - `merchant_name` string, nullable, required — The merchant associated with the transaction stream.
    - `first_date` string, date, required — The posted date of the earliest transaction in the stream.
    - `last_date` string, date, required — The posted date of the latest transaction in the stream.
    - `predicted_next_date` string, date, nullable — The predicted date of the next payment. This will only be set if the next payment date can be predicted.
    - `frequency` 'UNKNOWN' | 'WEEKLY' | 'BIWEEKLY' | 'SEMI_MONTHLY' | 'MONTHLY' | 'ANNUALLY', required — Describes the frequency of the transaction stream. `WEEKLY`: Assigned to a transaction stream that occurs approximately every week. `BIWEEKLY`: Assigned to a transaction stream that occurs approximately every 2 weeks. `SEMI_MONTHLY`: Assigned to a transaction stream that occurs approximately twice per month. This frequency is typically seen for inflow transaction streams. `MONTHLY`: Assigned to a transaction stream that occurs approximately every month. `ANNUALLY`: Assigned to a transaction stream that occurs approximately every year. `UNKNOWN`: Assigned to a transaction stream that does not fit any of the pre-defined frequencies.
    - `transaction_ids` string[], required — An array of Plaid transaction IDs belonging to the stream, sorted by posted date.
    - `average_amount` TransactionStreamAmount, required — Object with data pertaining to an amount on the transaction stream.
      - `amount` number, double — Represents the numerical value of an amount.
      - `iso_currency_code` string, nullable — The ISO-4217 currency code of the amount. Always `null` if `unofficial_currency_code` is non-`null`. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s.
      - `unofficial_currency_code` string, nullable — The unofficial currency code of the amount. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries.
    - `last_amount` TransactionStreamAmount, required — Object with data pertaining to an amount on the transaction stream.
      - `amount` number, double — Represents the numerical value of an amount.
      - `iso_currency_code` string, nullable — The ISO-4217 currency code of the amount. Always `null` if `unofficial_currency_code` is non-`null`. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s.
      - `unofficial_currency_code` string, nullable — The unofficial currency code of the amount. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries.
    - `is_active` boolean, required — Indicates whether the transaction stream is still live.
    - `status` 'UNKNOWN' | 'MATURE' | 'EARLY_DETECTION' | 'TOMBSTONED', required — The current status of the transaction stream. `MATURE`: A `MATURE` recurring stream should have at least 3 transactions and happen on a regular cadence (For Annual recurring stream, we will mark it `MATURE` after 2 instances). `EARLY_DETECTION`: When a recurring transaction first appears in the transaction history and before it fulfills the requirement of a mature stream, the status will be `EARLY_DETECTION`. `TOMBSTONED`: A stream that was previously in the `EARLY_DETECTION` status will move to the `TOMBSTONED` status when no further transactions were found at the next expected date. `UNKNOWN`: A stream is assigned an `UNKNOWN` status when none of the other statuses are applicable.
    - `personal_finance_category` PersonalFinanceCategory, nullable — Information describing the intent of the transaction. Most relevant for personal finance use cases, but not limited to such use cases. See the [taxonomy CSV file](https://plaid.com/documents/pfc-taxonomy-all.csv) for a full list of personal finance categories. If you are migrating to personal finance categories from the legacy categories, also refer to the [migration guide](https://plaid.com/docs/transactions/pfc-migration/).
      - `primary` string, required — A high level category that communicates the broad category of the transaction.
      - `detailed` string, required — A granular category conveying the transaction's intent. This field can also be used as a unique identifier for the category.
      - `confidence_level` string, nullable — A description of how confident we are that the provided categories accurately describe the transaction intent. `VERY_HIGH`: We are more than 98% confident that this category reflects the intent of the transaction. `HIGH`: We are more than 90% confident that this category reflects the intent of the transaction. `MEDIUM`: We are moderately confident that this category reflects the intent of the transaction. `LOW`: This category may reflect the intent, but there may be other categories that are more accurate. `UNKNOWN`: We don't know the confidence level for this category.
      - `version` 'v1' | 'v2' — Indicates which version of the personal finance category taxonomy is being used. [View PFCv2 and PFCv1 taxonomies](https://plaid.com/documents/pfc-taxonomy-all.csv). If you enabled Transactions or Enrich before December 3, 2025 you will receive the `v1` taxonomy by default and may request `v2` by explicitly setting this field to `v2` in the request. If you enabled Transactions or Enrich on or after December 3, 2025, you may only receive the `v2` taxonomy.
    - `is_user_modified` boolean, required — As the ability to modify transactions streams has been discontinued, this field will always be `false`.
    - `last_user_modified_datetime` string, date-time — The date and time of the most recent user modification. This will only be set if `is_user_modified` is `true`.
  - `outflow_streams` TransactionStream[], required — An array of expense transaction streams.
    - `account_id` string, required — The ID of the account to which the stream belongs
    - `stream_id` string, required — A unique id for the stream
    - `category` string[], nullable, required — A hierarchical array of the categories to which this transaction belongs. See [Categories](https://plaid.com/docs/api/products/transactions/#categoriesget). All implementations are encouraged to use the new `personal_finance_category` instead of `category`. `personal_finance_category` provides more meaningful categorization and greater accuracy.
    - `category_id` string, nullable, required — The ID of the category to which this transaction belongs. See [Categories](https://plaid.com/docs/api/products/transactions/#categoriesget). All implementations are encouraged to use the new `personal_finance_category` instead of `category`. `personal_finance_category` provides more meaningful categorization and greater accuracy.
    - `description` string, required — A description of the transaction stream.
    - `merchant_name` string, nullable, required — The merchant associated with the transaction stream.
    - `first_date` string, date, required — The posted date of the earliest transaction in the stream.
    - `last_date` string, date, required — The posted date of the latest transaction in the stream.
    - `predicted_next_date` string, date, nullable — The predicted date of the next payment. This will only be set if the next payment date can be predicted.
    - `frequency` 'UNKNOWN' | 'WEEKLY' | 'BIWEEKLY' | 'SEMI_MONTHLY' | 'MONTHLY' | 'ANNUALLY', required — Describes the frequency of the transaction stream. `WEEKLY`: Assigned to a transaction stream that occurs approximately every week. `BIWEEKLY`: Assigned to a transaction stream that occurs approximately every 2 weeks. `SEMI_MONTHLY`: Assigned to a transaction stream that occurs approximately twice per month. This frequency is typically seen for inflow transaction streams. `MONTHLY`: Assigned to a transaction stream that occurs approximately every month. `ANNUALLY`: Assigned to a transaction stream that occurs approximately every year. `UNKNOWN`: Assigned to a transaction stream that does not fit any of the pre-defined frequencies.
    - `transaction_ids` string[], required — An array of Plaid transaction IDs belonging to the stream, sorted by posted date.
    - `average_amount` TransactionStreamAmount, required — Object with data pertaining to an amount on the transaction stream.
      - `amount` number, double — Represents the numerical value of an amount.
      - `iso_currency_code` string, nullable — The ISO-4217 currency code of the amount. Always `null` if `unofficial_currency_code` is non-`null`. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s.
      - `unofficial_currency_code` string, nullable — The unofficial currency code of the amount. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries.
    - `last_amount` TransactionStreamAmount, required — Object with data pertaining to an amount on the transaction stream.
      - `amount` number, double — Represents the numerical value of an amount.
      - `iso_currency_code` string, nullable — The ISO-4217 currency code of the amount. Always `null` if `unofficial_currency_code` is non-`null`. See the [currency code schema](https://plaid.com/docs/api/accounts#currency-code-schema) for a full listing of supported `iso_currency_code`s.
      - `unofficial_currency_code` string, nullable — The unofficial currency code of the amount. Always `null` if `iso_currency_code` is non-`null`. Unofficial currency codes are used for currencies that do not have official ISO currency codes, such as cryptocurrencies and the currencies of certain countries.
    - `is_active` boolean, required — Indicates whether the transaction stream is still live.
    - `status` 'UNKNOWN' | 'MATURE' | 'EARLY_DETECTION' | 'TOMBSTONED', required — The current status of the transaction stream. `MATURE`: A `MATURE` recurring stream should have at least 3 transactions and happen on a regular cadence (For Annual recurring stream, we will mark it `MATURE` after 2 instances). `EARLY_DETECTION`: When a recurring transaction first appears in the transaction history and before it fulfills the requirement of a mature stream, the status will be `EARLY_DETECTION`. `TOMBSTONED`: A stream that was previously in the `EARLY_DETECTION` status will move to the `TOMBSTONED` status when no further transactions were found at the next expected date. `UNKNOWN`: A stream is assigned an `UNKNOWN` status when none of the other statuses are applicable.
    - `personal_finance_category` PersonalFinanceCategory, nullable — Information describing the intent of the transaction. Most relevant for personal finance use cases, but not limited to such use cases. See the [taxonomy CSV file](https://plaid.com/documents/pfc-taxonomy-all.csv) for a full list of personal finance categories. If you are migrating to personal finance categories from the legacy categories, also refer to the [migration guide](https://plaid.com/docs/transactions/pfc-migration/).
      - `primary` string, required — A high level category that communicates the broad category of the transaction.
      - `detailed` string, required — A granular category conveying the transaction's intent. This field can also be used as a unique identifier for the category.
      - `confidence_level` string, nullable — A description of how confident we are that the provided categories accurately describe the transaction intent. `VERY_HIGH`: We are more than 98% confident that this category reflects the intent of the transaction. `HIGH`: We are more than 90% confident that this category reflects the intent of the transaction. `MEDIUM`: We are moderately confident that this category reflects the intent of the transaction. `LOW`: This category may reflect the intent, but there may be other categories that are more accurate. `UNKNOWN`: We don't know the confidence level for this category.
      - `version` 'v1' | 'v2' — Indicates which version of the personal finance category taxonomy is being used. [View PFCv2 and PFCv1 taxonomies](https://plaid.com/documents/pfc-taxonomy-all.csv). If you enabled Transactions or Enrich before December 3, 2025 you will receive the `v1` taxonomy by default and may request `v2` by explicitly setting this field to `v2` in the request. If you enabled Transactions or Enrich on or after December 3, 2025, you may only receive the `v2` taxonomy.
    - `is_user_modified` boolean, required — As the ability to modify transactions streams has been discontinued, this field will always be `false`.
    - `last_user_modified_datetime` string, date-time — The date and time of the most recent user modification. This will only be set if `is_user_modified` is `true`.
  - `updated_datetime` string, date-time, required — Timestamp in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format (`YYYY-MM-DDTHH:mm:ssZ`) indicating the last time transaction streams for the given account were updated on
  - `personal_finance_category_version` 'v1' | 'v2' — Indicates which version of the personal finance category taxonomy is being used. [View PFCv2 and PFCv1 taxonomies](https://plaid.com/documents/pfc-taxonomy-all.csv). If you enabled Transactions or Enrich before December 3, 2025 you will receive the `v1` taxonomy by default and may request `v2` by explicitly setting this field to `v2` in the request. If you enabled Transactions or Enrich on or after December 3, 2025, you may only receive the `v2` taxonomy.
  - `request_id` string, required — A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive.

## Other responses

- `default` — Error response

---

[API](https://skmtc.net/plaid/apis/the-plaid-api.md) · [All operations](https://skmtc.net/plaid/apis/the-plaid-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/plaid/the-plaid-api/versions/64c4514ea59b/schema)
