Plaid · Schema
Transactions entity
A page of transactions for an account, spanning deposit, investment, loan, and line-of-credit transaction types.
FinanceFintechOpen BankingBank AccountsData AggregationPaymentsUnited States
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://raw.githubusercontent.com/api-evangelist/plaid/main/json-schema/plaid-transactions-schema.json",
"title": "Transactions entity",
"description": "A page of transactions for an account, spanning deposit, investment, loan, and line-of-credit transaction types.\n",
"x-generated": "2026-09-23",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/plaid-core-exchange-openapi.yml#/components/schemas/Transactions",
"allOf": [
{
"$ref": "#/$defs/PaginatedArray"
},
{
"type": "object",
"properties": {
"transactions": {
"type": "array",
"description": "An optionally paginated array of transactions.\nMay be any of the following: [deposit transaction](#deposit-transaction), [investment transaction](#investment-transaction), [loan transaction](#loan-transaction), [line of credit transaction](#line-of-credit-transaction)\n",
"items": {
"oneOf": [
{
"$ref": "#/$defs/DepositTransaction"
},
{
"$ref": "#/$defs/InvestmentTransaction"
},
{
"$ref": "#/$defs/LineOfCreditTransaction"
},
{
"$ref": "#/$defs/LoanTransaction"
}
]
}
}
},
"required": [
"transactions"
]
}
],
"$defs": {
"AccountCategory": {
"title": "Account Category type",
"description": "The category of account. For example, annuity, commercial, deposit, digital wallet, insurance, investment, loan, or line of credit.\n",
"enum": [
"ANNUITY_ACCOUNT",
"COMMERCIAL_ACCOUNT",
"DEPOSIT_ACCOUNT",
"DIGITAL_WALLET",
"INSURANCE_ACCOUNT",
"INVESTMENT_ACCOUNT",
"LOAN_ACCOUNT",
"LOC_ACCOUNT"
]
},
"DebitCreditMemo": {
"title": "DebitCreditMemo",
"description": "The posting type of a transaction. Because the transaction `amount` is an absolute value, this parameter is required to indicate the transaction direction and sign (+/-):\n- `DEBIT`: Money is leaving the account. The transaction amount will be exposed with a **positive** sign (+)\n- `CREDIT`: Money is entering the account. The transaction amount will be exposed with a **negative** sign (-)\n- `MEMO`: The transaction is pending and will be completed at the end of the day. (Plaid handles `MEMO` transaction the same as `DEBIT` transactions.)\n",
"type": "string",
"enum": [
"CREDIT",
"DEBIT",
"MEMO"
]
},
"DepositTransaction": {
"title": "Deposit Transaction entity",
"description": "A transaction on a deposit account type\n",
"type": "object",
"allOf": [
{
"$ref": "#/$defs/Transaction"
},
{
"type": "object",
"properties": {
"accountCategory": {
"type": "string",
"enum": [
"DEPOSIT_ACCOUNT"
]
},
"payee": {
"allOf": [
{
"$ref": "#/$defs/String255"
}
],
"description": "Payee name.\n"
},
"checkNumber": {
"type": "integer",
"description": "Check number. Plaid expects this solely if the transaction involves a check\n"
}
},
"required": [
"accountCategory"
]
}
]
},
"FiAttribute": {
"title": "FI Attribute entity",
"description": "Financial institution-specific attribute.\n\nSent as an array of name/value pairs, not a keyed object, with string values: `[{\"name\": \"isCashEquivalent\", \"value\": \"false\"}]`, not `{\"isCashEquivalent\": false}`. `isCashEquivalent` must be `\"true\"` or `\"false\"`.\n",
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Name of the financial institution-specific attribute\n"
},
"value": {
"type": "string",
"description": "Value of the financial institution-specific attribute\n"
}
}
},
"Identifier": {
"title": "Identifier",
"description": "Value for a unique identifier\n",
"type": "string",
"maxLength": 256
},
"InvestmentTransaction": {
"title": "Investment Transaction entity",
"description": "A transaction on an investment account.\nIn addition to the required fields in the base `Transaction` model, Plaid requires the following fields\nfor all transactions on an investment account:\n\n* `fees`\n* `transactionType`\n\nIf the transaction involves a security, Plaid additionally requires the following fields:\n\n* `unitPrice`\n* `units`\n* `symbol` OR both `securityId` and `securityIdType`\n",
"type": "object",
"allOf": [
{
"$ref": "#/$defs/Transaction"
},
{
"type": "object",
"properties": {
"accountCategory": {
"type": "string",
"enum": [
"INVESTMENT_ACCOUNT"
]
},
"transactionType": {
"$ref": "#/$defs/InvestmentTransactionType"
},
"securityId": {
"type": "string",
"description": "If you return the `securityId` for a holding, Plaid uses it to look up the closing price from NYSE Group Security Master.\nIf you don't return `securityId` for a holding that uses security IDs (not recommended), Plaid uses the `unitPrice` as the closing price.\n\nThis field, along with `securityIdType` are **required** unless `symbol` is provided.\n\n**Note:** If `securityId` is provided, `securityIdType` is required.\n"
},
"securityIdType": {
"$ref": "#/$defs/SecurityIdType"
},
"securityType": {
"$ref": "#/$defs/SecurityType"
},
"symbol": {
"type": "string",
"description": "Ticker / Market symbol\nThis field is **required** unless both `securityId` and `securityIdType` are provided\n"
},
"commission": {
"type": "number",
"description": "Plaid expects that your organization includes a value for commission if the commission isn't included in `fees`\n"
},
"fees": {
"type": "number",
"description": "Fees applied to the trade. Plaid expects that the `fees` include the commission, unless your organization separately provides a value for `commission`\n"
},
"unitPrice": {
"type": "number",
"description": "Unit price. Plaid uses this as the [price](https://plaid.com/docs/api/products/investments/#investments-transactions-get-response-investment-transactions-price). Plaid falls back to using this as the [close price](https://plaid.com/docs/api/products/investments/#investments-transactions-get-response-securities-close-price) if you don't return `securityId` for transactions involving securities.\n**Note:** This field is required if the transaction involves a security\n"
},
"units": {
"type": "number",
"description": "Plaid requires this field for holdings and transactions involving securities.\nFor security-based actions other than stock splits, quantity.\nShares for stocks, mutual funds, and others. Face value for bonds.\nContracts for options.\n\n**Note:** This field is required if the transaction involves a security.\n"
},
"unitType": {
"$ref": "#/$defs/UnitType"
},
"fiAttributes": {
"type": "array",
"description": "Array of financial institution-specific attributes. Plaid recommends including a value for the `isCashEquivalent` attribute in this array, sent as a string value of `true` or `false`. This populates the [`is_cash_equivalent`](https://plaid.com/docs/api/products/investments/#investments-transactions-get-response-securities-is-cash-equivalent) field in Plaid's customer-facing API.\n",
"items": {
"$ref": "#/$defs/FiAttribute"
}
}
},
"required": [
"fees",
"transactionType",
"accountCategory"
]
}
]
},
"InvestmentTransactionType": {
"title": "Investment Transaction Type",
"description": "The type of an investment transaction.\nPlaid maps these enums to Plaid [investment transaction types](https://plaid.com/docs/api/accounts/#investment-transaction-types-schema).\nPlaid doesn't map these enums to Plaid-specific transaction subtypes.\nPlaid maps these enums as follows:\n\n* ADJUSTMENT - fee\n* ATM - cash\n* CASH - cash\n* CHECK - cash\n* CLOSURE - Plaid suggests using SOLDTOCLOSE, PURCHASETOCLOSE, OPTIONEXERCISE or OPTIONEXPIRATION to indicate the specific type of closure, instead of using this enum.\n* CLOSUREOPT - Plaid suggests using SOLDTOCLOSE, PURCHASETOCLOSE, OPTIONEXERCISE or OPTIONEXPIRATION to indicate the specific type of closure, instead of using this enum.\n* CONTRIBUTION - buy (if transaction involves a security) or cash\n* DEP - cash\n* DEPOSIT - cash\n* DIRECTDEBIT - cash\n* DIRECTDEP - cash\n* DIV - cash\n* DIVIDEND - cash\n* DIVIDENDREINVEST - buy\n* EXPENSE - cash\n* FEE - fee\n* INCOME - cash\n* INTEREST - cash\n* INVEXPENSE - cash\n* JRNLFUND - transfer\n* JRNLSEC - transfer\n* MARGININTEREST - cash\n* OPTIONEXERCISE - transfer\n* OPTIONEXPIRATION - transfer\n* OTHER - cash - (unclassified)\n* PAYMENT - cash\n* POS - cash\n* PURCHASED - buy\n* PURCHASEDTOCOVER - buy\n* PURCHASETOCLOSE - buy\n* PURCHASETOOPEN - buy\n* REINVESTOFINCOME - buy\n* REPEATPMT - cash\n* RETURNOFCAPITAL - cash\n* SOLD - sell\n* SOLDTOCLOSE - sell\n* SOLDTOOPEN - sell\n* SPLIT - transfer\n* SRVCHG - fee\n* TRANSFER - transfer\n* XFER - transfer\n",
"type": "string",
"enum": [
"ADJUSTMENT",
"ATM",
"CASH",
"CHECK",
"CLOSURE",
"CLOSUREOPT",
"CONTRIBUTION",
"DEP",
"DEPOSIT",
"DIRECTDEBIT",
"DIRECTDEP",
"DIV",
"DIVIDEND",
"DIVIDENDREINVEST",
"EXPENSE",
"FEE",
"INCOME",
"INTEREST",
"INVEXPENSE",
"JRNLFUND",
"JRNLSEC",
"MARGININTEREST",
"OPTIONEXERCISE",
"OPTIONEXPIRATION",
"OTHER",
"PAYMENT",
"POS",
"PURCHASED",
"PURCHASEDTOCOVER",
"PURCHASETOCLOSE",
"PURCHASETOOPEN",
"REINVESTOFINCOME",
"REPEATPMT",
"RETURNOFCAPITAL",
"SOLD",
"SOLDTOCLOSE",
"SOLDTOOPEN",
"SPLIT",
"SRVCHG",
"TRANSFER",
"XFER"
]
},
"Iso4217Code": {
"title": "ISO 4217 Code",
"description": "Currency, fund and precious metal codes effective from June 25, 2024 per\n[ISO 4217 Currency Code Maintenance](https://www.six-group.com/en/products-services/financial-information/data-standards.html).\nZWL (the Zimbabwean dollar) expires August 31, 2024 and is deprecated\nand replaced with ZWG (Zimbabwe Gold), effective on June 25, 2024.\n",
"type": "string",
"enum": [
"AED",
"AFN",
"ALL",
"AMD",
"ANG",
"AOA",
"ARS",
"AUD",
"AWG",
"AZN",
"BAM",
"BBD",
"BDT",
"BGN",
"BHD",
"BIF",
"BMD",
"BND",
"BOB",
"BOV",
"BRL",
"BSD",
"BTN",
"BWP",
"BYN",
"BZD",
"CAD",
"CDF",
"CHE",
"CHF",
"CHW",
"CLF",
"CLP",
"CNY",
"COP",
"COU",
"CRC",
"CUC",
"CUP",
"CVE",
"CZK",
"DJF",
"DKK",
"DOP",
"DZD",
"EGP",
"ERN",
"ETB",
"EUR",
"FJD",
"FKP",
"GBP",
"GEL",
"GHS",
"GIP",
"GMD",
"GNF",
"GTQ",
"GYD",
"HKD",
"HNL",
"HTG",
"HUF",
"IDR",
"ILS",
"INR",
"IQD",
"IRR",
"ISK",
"JMD",
"JOD",
"JPY",
"KES",
"KGS",
"KHR",
"KMF",
"KPW",
"KRW",
"KWD",
"KYD",
"KZT",
"LAK",
"LBP",
"LKR",
"LRD",
"LSL",
"LYD",
"MAD",
"MDL",
"MGA",
"MKD",
"MMK",
"MNT",
"MOP",
"MRU",
"MUR",
"MVR",
"MWK",
"MXN",
"MXV",
"MYR",
"MZN",
"NAD",
"NGN",
"NIO",
"NOK",
"NPR",
"NZD",
"OMR",
"PAB",
"PEN",
"PGK",
"PHP",
"PKR",
"PLN",
"PYG",
"QAR",
"RON",
"RSD",
"RUB",
"RWF",
"SAR",
"SBD",
"SCR",
"SDG",
"SEK",
"SGD",
"SHP",
"SLE",
"SLL",
"SOS",
"SRD",
"SSP",
"STN",
"SVC",
"SYP",
"SZL",
"THB",
"TJS",
"TMT",
"TND",
"TOP",
"TRY",
"TTD",
"TWD",
"TZS",
"UAH",
"UGX",
"USD",
"USN",
"UYI",
"UYU",
"UYW",
"UZS",
"VED",
"VES",
"VND",
"VUV",
"WST",
"XAF",
"XAG",
"XAU",
"XBA",
"XBB",
"XBC",
"XBD",
"XCD",
"XDR",
"XOF",
"XPD",
"XPF",
"XPT",
"XSU",
"XTS",
"XUA",
"XXX",
"YER",
"ZAR",
"ZMW",
"ZWG",
"ZWL"
]
},
"LineOfCreditTransaction": {
"title": "Line-Of-Credit Transaction entity",
"description": "A line-of-credit transaction\n",
"type": "object",
"allOf": [
{
"$ref": "#/$defs/Transaction"
},
{
"type": "object",
"properties": {
"accountCategory": {
"type": "string",
"enum": [
"LOC_ACCOUNT"
]
},
"transactionType": {
"$ref": "#/$defs/LineOfCreditTransactionType"
},
"checkNumber": {
"type": "integer",
"description": "Check number. Plaid expects this solely if the transaction involves a check\n"
}
},
"required": [
"accountCategory"
]
}
]
},
"LineOfCreditTransactionType": {
"title": "Line-Of-Credit Transaction Type",
"description": "The type of a line of credit (LOC) transaction. Plaid passes through all LOC transaction types\n",
"type": "string",
"enum": [
"ADJUSTMENT",
"CHECK",
"FEE",
"INTEREST",
"PAYMENT",
"WITHDRAWAL",
"PURCHASE"
]
},
"LoanTransaction": {
"title": "Loan Transaction entity",
"description": "A transaction on a loan account\n",
"type": "object",
"allOf": [
{
"$ref": "#/$defs/Transaction"
},
{
"type": "object",
"properties": {
"accountCategory": {
"type": "string",
"enum": [
"LOAN_ACCOUNT"
]
},
"transactionType": {
"$ref": "#/$defs/LoanTransactionType"
}
},
"required": [
"accountCategory"
]
}
]
},
"LoanTransactionType": {
"title": "Loan Transaction Type",
"description": "The type of a loan transaction. Plaid passes through all loan transaction types\n\n- `ADJUSTMENT`: Adjustment or correction.\n- `FEE`: Fee charge. For example, a late payment fee.\n- `INTEREST`: Interest charge.\n- `PAYMENT`: Required payment that satisfies the minimum payment (e.g. principal + interest for mortgages).\n- `LUMP_SUM_PAYMENT`: A single payment of money, as opposed to a series of payments made over time.\n- `SKIP_PAYMENT`: Payment that satisfies deferral of a required payment.\n- `DOUBLE_UP_PAYMENT`: Additional payment beyond the required payment to reduce the principal.\n- `PAYOFF`: Payment that satisfies the terms of the mortgage loan and completely pays off the debt.\n",
"type": "string",
"enum": [
"ADJUSTMENT",
"FEE",
"INTEREST",
"PAYMENT",
"LUMP_SUM_PAYMENT",
"SKIP_PAYMENT",
"DOUBLE_UP_PAYMENT",
"PAYOFF"
]
},
"PageMetadata": {
"title": "Page Metadata",
"description": "Contains the opaque identifier, `nextPageKey`, to indicate a paginated result set.\nThe `nextOffset` identifier is deprecated and will be removed with a future major release.\n",
"type": "object",
"properties": {
"nextOffset": {
"type": "string",
"deprecated": true,
"description": "Opaque identifier. Does not need to be numeric or have any specific pattern.\nDeprecated in favor of `nextPageKey`, will be removed with a future major release\n"
},
"nextPageKey": {
"type": "string",
"description": "Opaque identifier. Does not need to be numeric or have any specific pattern.\nImplementation specific\n"
},
"totalElements": {
"type": "integer",
"description": "Total number of elements\n"
}
}
},
"PaginatedArray": {
"title": "Paginated Array",
"description": "Base class for results that may be paginated\n",
"type": "object",
"properties": {
"page": {
"$ref": "#/$defs/PageMetadata"
}
}
},
"SecurityIdType": {
"title": "Security ID Type",
"description": "Plaid consumes solely CUSIP, ISIN, and SEDOL.\n\nThis field, along with `securityId` are **required** unless `symbol` is provided.\n\n**Note:** If `securityIdType` is provided, `securityId` is required.\n",
"type": "string",
"enum": [
"CINS",
"CMC",
"CME",
"CUSIP",
"ISIN",
"ITSA",
"NASDAQ",
"SEDOL",
"SICC",
"VALOR",
"WKN"
]
},
"SecurityType": {
"title": "Security Type",
"description": "The type of a security\n",
"type": "string",
"enum": [
"BOND",
"DEBT",
"MUTUALFUND",
"DIGITALASSET",
"OPTION",
"OTHER",
"STOCK",
"SWEEP"
]
},
"String255": {
"title": "String 255",
"description": "String with a maximum length of 255 characters\n",
"type": "string",
"maxLength": 255
},
"Timestamp": {
"title": "Timestamp",
"description": "ISO 8601 date-time in format `YYYY-MM-DDThh:mm:ss.nnn[Z|[+|-]hh:mm]` according to\n[IETF RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6)\n\nSend UTC or a local time with its correct offset. Plaid doesn't normalize timestamps, so a local time labeled `Z` is read as UTC.\n",
"type": "string",
"format": "date-time"
},
"Transaction": {
"title": "Transaction",
"description": "Base entity for financial transactions. For monetary amounts, Plaid expects a decimal amount, with two places to represent fractional values of the base currency, for example `101.99`\n",
"type": "object",
"properties": {
"accountCategory": {
"$ref": "#/$defs/AccountCategory"
},
"transactionId": {
"description": "Long term persistent unique identifier of the transaction. Each ID must be unique within the scope of the account, as a duplicate ID will cause the transaction to be overwritten. The pending and posted versions of a transaction must have different IDs; you can associate them by sharing a `referenceTransactionId` instead of this field. This identifier's value must not be based on a counter that resets, such as at the end of a day or a statement cycle.\n",
"$ref": "#/$defs/Identifier"
},
"referenceTransactionId": {
"description": "For reverse postings, the identity of the transaction being\nreversed. For the correction transaction, the identity of the\nreversing post. For credit card posting transactions, the identity\nof the authorization transaction\n",
"$ref": "#/$defs/Identifier"
},
"postedTimestamp": {
"description": "The date and time that the transaction was posted to the account.\nThis property is **required** by Plaid when `status=POSTED`. Plaid expects this property to be omitted when `status=PENDING`\nISO 8601 date-time in format `YYYY-MM-DDThh:mm:ss.nnn[Z|[+|-]hh:mm]` according to\n[IETF RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6)\n\nSend UTC or a local time with its correct offset. Plaid doesn't normalize timestamps, so a local time labeled `Z` is read as UTC.\n",
"$ref": "#/$defs/Timestamp"
},
"transactionTimestamp": {
"description": "The date and time that the transaction was added to the server backend systems\nISO 8601 date-time in format `YYYY-MM-DDThh:mm:ss.nnn[Z|[+|-]hh:mm]` according to\n[IETF RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6)\n\nSend UTC or a local time with its correct offset. Plaid doesn't normalize timestamps, so a local time labeled `Z` is read as UTC.\n",
"$ref": "#/$defs/Timestamp"
},
"cardNumberDisplay": {
"type": "string",
"description": "The payment card number (e.g. debit, credit or digital), suitably masked,\nused to originate the transaction. May differ from primary account number as a\nsecondary or employee card or a one-time use number. This is an optional field\nand won't be returned for certain types of transactions such as cash or check deposits\n"
},
"description": {
"type": "string",
"description": "Description of the transaction, such as information about a merchant's\nname or place of business in a manner that is user friendly and accessible to the customer\n"
},
"debitCreditMemo": {
"$ref": "#/$defs/DebitCreditMemo"
},
"category": {
"type": "string",
"description": "Transaction category, preferably MCC or SIC. Plaid expects your organization to provide MCC, if available and applicable\n"
},
"subCategory": {
"type": "string",
"description": "Transaction category detail specifying the standard of the transaction category.\nFor example, \"MCC\"\n"
},
"status": {
"$ref": "#/$defs/TransactionStatus"
},
"amount": {
"type": "number",
"description": "The amount of money in the account currency. The amount is an absolute value. Plaid relies on the `DebitCreditMemo` enum to determine the direction (and sign) of the transaction\n"
},
"foreignAmount": {
"type": "number",
"description": "The amount of money in the foreign currency. If this amount is specified, then Plaid expects that the `foreignCurrency` property is also set\n"
},
"foreignCurrency": {
"$ref": "#/$defs/Iso4217Code"
}
},
"required": [
"debitCreditMemo",
"description",
"transactionId",
"transactionTimestamp",
"status",
"amount"
]
},
"TransactionStatus": {
"title": "Transaction Status",
"description": "The status of a transaction. Plaid consumes solely the `PENDING` and `POSTED` enums,\nand treats `MEMO` and `AUTHORIZATION` as if they were `PENDING`. Plaid expects that pending and posted transactions\nhave different `transactionIds`.\n* `AUTHORIZATION`\n* `MEMO` - A pending transaction to be completed at the end of this day\n* `PENDING` - A pending transaction\n* `POSTED` - A posted transaction\n",
"type": "string",
"enum": [
"AUTHORIZATION",
"MEMO",
"PENDING",
"POSTED"
]
},
"UnitType": {
"title": "Unit Type",
"description": "The units of an investment transaction\n",
"type": "string",
"enum": [
"CURRENCY",
"SHARES"
]
}
}
}
Work with this as data
Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for schemas
4 MCP tools reach this
find_json_schemasBrowse and filter every JSON Schema in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/plaid-transactions"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.