financial-insights
stripe/link-cli
Read Link financial data—transactions, balances, and wallet sources—to answer spending and account questions.
What is financial-insights?
Reads a user's Link-connected financial data including transactions, balances, and linked wallet sources. Use when the user asks about their spending, account balances, recent purchases, or connected accounts. All operations are read-only and require user authentication with appropriate source actions.
- Retrieve recent transactions and spending history across linked accounts
- Check current account balances and cash positions
- List connected financial sources (bank accounts, cards, wallets)
- Filter transactions by date range, category, origin, or specific source
- Correlate transactions to their source accounts using source IDs
- Format financial data as JSON for agent processing
How to install financial-insights
npx skills add https://github.com/stripe/link-cli --skill financial-insights- Node.js and npm installed
- @stripe/link-cli package installed globally or available via npx
- User authenticated with Link and appropriate source actions granted (read_link_transactions, read_external_transactions, read_balances, read_source_details as needed)
How to use financial-insights
- 1.Check user authentication status with `link-cli auth status --format json`
- 2.Determine which source actions are needed based on the user's question (transactions, balances, sources, or combinations)
- 3.If not authenticated or missing required actions, initiate login with `link-cli auth login` or upgrade with `link-cli auth upgrade`, specifying only the needed source actions
- 4.Present the verification URL to the user and poll with `link-cli auth status` until approval succeeds
- 5.Run the appropriate command: `link-cli transactions list`, `link-cli balances list`, or `link-cli sources list` with `--format json`
- 6.Apply filters (--start-date, --end-date, --category, --origin, --source) to retrieve only the data needed to answer the question
- 7.Parse JSON response, correlate data using source_id, and format monetary amounts using currency-aware formatting (amounts are in smallest currency unit)
- 8.Present summarized financial information to the user without exposing sensitive identifiers, tokens, or payment credentials
Use cases
- User asks 'How much did I spend on restaurants last month?' — retrieve and filter transactions by category and date
- User asks 'What is my current checking account balance?' — retrieve balances and match to source metadata
- User asks 'Which accounts are connected?' — list all sources with institution and account type details
- User asks 'Summarize my cash position and recent spending' — retrieve both balances and recent transactions together
- User asks about recurring payments or subscriptions — filter transactions by merchant or category patterns
- Personal finance agents answering user questions about spending and accounts
- Financial dashboard builders summarizing user account activity
- Agents helping users understand their connected financial sources
- Applications providing spending insights and balance checks
financial-insights FAQ
User must be authenticated with Link and have granted the appropriate source actions. Check status with `link-cli auth status --format json`. If missing actions, use `auth login` for new sessions or `auth upgrade` to add permissions to existing sessions. Do not retrieve data until authentication succeeds.
Match the question to the smallest command set needed: transactions list for spending/history, balances list for current account balances, sources list for connected accounts. For questions requiring multiple data types (e.g., 'summarize my cash position and recent spending'), request all relevant actions and run multiple commands.
All amounts are integers in the currency's smallest unit (e.g., 152340 = $1,523.40 USD). Use a currency-aware formatter with the ISO 4217 minor-unit exponent; do not assume all currencies have two decimal places. For transactions, negative amounts indicate money leaving the account; for balances, interpret sign according to balance type.
A source_id is a unique identifier for a connected financial account (bank, card, wallet, etc.). Use it to correlate data across commands—for example, to find transactions for a specific account or match a balance to its source type. Do not assign transactions with null source_id by guessing from description.
Yes. Only retrieve data needed to answer the user's question. Do not expose sensitive identifiers, access tokens, credentials, or payment instrument details. Summarize financial information at the level needed to answer the question. All commands are read-only and do not move money or modify accounts.
Full instructions (SKILL.md)
Source of truth, from stripe/link-cli.
version: 0.15.1 name: financial-insights description: | Reads a user's Link financial data — transactions, balances, and wallet sources — so agents can answer questions about spending and available source capabilities. Use when the user says "check my balance", "how much did I spend", "show my transactions", "what accounts are connected", "summarize my spending", "recent purchases", or asks about their financial activity, account balances, or linked sources. allowed-tools:
- Bash(link-cli:*)
- Bash(npx --yes @stripe/link-cli:*)
- Bash(npx @stripe/link-cli:*)
- Bash(npm install -g @stripe/link-cli:*)
license: Complete terms in LICENSE
metadata:
author: stripe
url: link.com/agents
openclaw:
emoji: "📊"
homepage: https://link.com/agents
requires:
bins:
- link-cli
install:
- kind: node package: "@stripe/link-cli" bins: [link-cli] user-invocable: true
Financial insights
Use this skill to answer questions about a user’s Link-connected financial data, including:
- Recent transactions
- Spending patterns
- Account balances
- Linked wallet sources
- Basic summaries derived from the user’s financial data
All commands are read-only. They do not move money, initiate payments, modify accounts, or expose payment credentials.
Safety and privacy
Do not retrieve financial data until the user is authenticated with the required source actions.
Only retrieve the data needed to answer the user’s request. Do not run every list command by default.
Do not expose sensitive identifiers, access tokens, credentials, or payment instrument details. Summarize financial information at the level needed to answer the user’s question.
If the user asks for an action that would move money, reference skills/create-payment-credential/SKILL.md instead.
Authentication
Before retrieving financial data, check whether the user is authenticated and whether the current session has the required source actions.
link-cli auth status --format json
When present, inspect authorization_details in the response for entries with type: "source" and the required actions. The field may be absent when the token endpoint did not return authorization details or when authentication comes from LINK_ACCESS_TOKEN; in that case, run only the minimum data command needed and handle a permission error as described below.
If the user is not authenticated, start a login that requests only the source actions needed for the requested data. If the user is already authenticated but one or more required source actions are missing, use auth upgrade instead of auth login. auth upgrade preserves the current session while the user approves the additional access and replaces it only after approval succeeds.
Use the minimum required source actions:
- Transactions processed through Link:
read_link_transactions - Transactions imported from bank connections:
read_external_transactions - Account balances:
read_balances - Data source details and descriptions:
read_source_details. This action is broadly useful, for example if you will ever need to tie a transaction or balance to a particular account name.
If the user asks a question that requires multiple data types, request all relevant actions together.
Example for a new login that needs all financial data types:
link-cli auth login \
--client-name "<your-agent-name>" \
--source-actions read_link_transactions \
--source-actions read_balances \
--source-actions read_external_transactions \
--source-actions read_source_details \
--format json
Example for adding balance access to an existing session:
link-cli auth upgrade \
--client-name "<your-agent-name>" \
--source-actions read_balances \
--format json
Replace <your-agent-name> with a clear name for the agent or application. Present the returned verification_url to the user, then follow the response's _next instruction or poll with:
link-cli auth status --interval 5 --max-attempts 60 --format json
Do not proceed until authentication or the access upgrade succeeds. If the approval expires, is denied, or times out, report that outcome instead of repeatedly starting new authorization flows.
Choosing the right command
Use the smallest command set that answers the user’s question.
| User asks about | Command |
|---|---|
| Recent purchases, merchants, spend, transaction history, income, deposits, subscriptions | link-cli transactions list |
| Current available balance, account balance, cash position | link-cli balances list |
| Connected accounts, cards, banks, wallet sources, source metadata | link-cli sources list |
Examples:
- “How much did I spend on restaurants last month?” → Use transactions only.
- “What is my current checking account balance?” → Use balances only.
- “Which accounts are connected?” → Use sources only.
- “Summarize my cash position and recent spending.” → Use balances and transactions.
Output format
Use JSON for agent-readable structured output.
link-cli transactions list --format json
link-cli balances list --format json
link-cli sources list --format json
The default toon format is intended for humans. Prefer --format json whenever parsing, filtering, aggregating, or summarizing results.
All monetary amounts across all endpoints are integers in the currency's smallest unit (e.g. 152340 = $1,523.40 USD). Format amounts with a currency-aware formatter that uses the currency's ISO 4217 minor-unit exponent; do not assume every currency has two decimal places or always divide by 100.
Keep sign interpretation field-specific. Only transactions.amount uses negative for money leaving the account and positive for money entering it. Do not apply transaction sign semantics to balance fields; interpret current, cash.available, and credit.used according to the balance type.
Sources (concept)
A source is a financial account connected to the user's Link wallet — a bank account, credit card, savings account, etc. Each source has a unique id (e.g. csmrpd_abc123) that other endpoints may expose as source_id:
- In
transactions list,source_idindicates which account a transaction belongs to. - In
balances list, each balance entry includes asource_ididentifying the account. - In
sources list, the full source metadata (name, institution, type, status) is returned.
Use a source_id to correlate data across commands — for example, to find transactions for a specific account or to match a balance to its source type. Do not assign transactions with a null source_id to a source by guessing from their description.
Transactions
Use transactions to answer questions about spending, income, merchants, categories, recurring payments, deposits, or account activity.
link-cli transactions list --format json
Common options:
link-cli transactions list --format json --start-date 2025-01-01 --end-date 2025-01-31
link-cli transactions list --format json --category groceries
link-cli transactions list --format json --origin external_connection
link-cli transactions list --format json --source <source_id> --source <source_id>
| Flag | Description |
|---|---|
--start-date | Only transactions on or after this date (YYYY-MM-DD). |
--end-date | Only transactions on or before this date (YYYY-MM-DD). |
--category | Filter by category. |
--origin | Filter by origin: link or external_connection. |
--source | Filter by source ID (repeatable). |
See Pagination for shared list controls.
Response fields
| Field | Note |
|---|---|
amount | Negative = money leaving the account (debit/purchase), positive = money entering (credit/deposit). |
origin | external_connection (from linked bank/card) or link (Link-native transaction). |
category | May be null if unclassified. |
status | API-provided status string. Do not assume a closed set of values; observed values include succeeded. Interpret or filter a status only when its meaning is known. |
For transaction summaries:
- Normalize signs consistently before calculating totals.
- Distinguish debits from credits when possible.
- Group by merchant, category, account, currency, or time period only when relevant.
- Mention if the answer is based on a limited retrieved window.
Balances
Use balances to answer questions about current account balances or available funds.
link-cli balances list --format json
link-cli balances list --format json --source <source_id>
| Flag | Description |
|---|---|
--source | Filter by source ID (repeatable). |
See Pagination for shared list controls.
Response fields
| Field | Note |
|---|---|
type | cash (bank/savings) or credit (credit card/line of credit). Determines which sub-object is present. |
current | Balance before pending transactions. Not the same as available funds. |
cash.available | Object mapping currency codes to available funds (current minus outbound pending plus inbound pending). Only present when type is cash. |
credit.used | Object mapping currency codes to credit used. Only present when type is credit. |
as_of | When the balance was last updated — may be stale by hours or days. |
When summarizing balances:
- Preserve currencies.
- Do not add balances across different currencies unless the user explicitly asks and exchange-rate data is available.
- Use the
currentfield as the default definition of a balance, unless the user's question requires considering pending transactions. - If multiple sources are returned, summarize by account/source.
Sources
Use sources to answer questions about connected wallet sources, linked accounts, or available financial data sources. See Pagination for shared list controls.
link-cli sources list --format json
Response fields
| Field | Description |
|---|---|
id | Unique source identifier (same as source_id in other endpoints). |
name | Display name of the source. |
type | Source type (e.g. card, bank_account). |
capabilities | Object indicating what data is available. Each key (e.g. balances, transactions) maps to an object with a status field (e.g. eligible). |
external_connection.status | Connection status to the external institution. |
granted_actions | List of actions the user has granted for this source. |
When summarizing sources:
- Include only non-sensitive metadata needed for the answer.
- Avoid exposing full account numbers, credentials, tokens, or payment instrument details.
- Prefer labels such as institution, account type, source status, and last updated time when available.
Pagination
All three list commands support the same pagination flags:
| Flag | Description |
|---|---|
--limit | Maximum results per page (1-100). Prefer 100 when multiple pages may be needed. |
--starting-after | Fetch the next page after a cursor value. |
--ending-before | Fetch the previous page before a cursor value. Use for reverse navigation, not normal forward collection. |
JSON responses contain a data array and may contain has_more. They do not provide a separate next-cursor field. When has_more is true, derive the next cursor from the final item in data:
| Command | Next cursor |
|---|---|
transactions list | Final transaction's id. |
balances list | Final balance's source_id. |
sources list | Final source's id. |
For example:
link-cli transactions list --format json --limit 100 --starting-after <last_transaction_id>
Keep all filters identical across pages and change only --starting-after. Stop when has_more is false or absent, or when enough data has been retrieved for a non-exhaustive lookup. If has_more is true but data is empty or the required cursor is null or missing, stop and report that pagination could not continue.
Do not exhaustively paginate unless the user’s request requires a complete bounded result, such as a total for a specified time range.
Answering user questions
When answering:
- State the direct answer first.
- Mention the relevant time range and data source.
- Note any limitations, such as partial pagination, missing categories, pending transactions, or unsupported currencies.
- Avoid dumping raw records and object IDs unless the user asks for them.
- Prefer concise summaries, totals, and notable patterns.
Example response style:
You spent $342.18 on restaurants across 12 transactions in July. The largest restaurant transaction was $86.40 at Example Bistro on July 18. This is based on the transactions returned for your connected Link sources.
Error handling
If authentication fails, ask the user to re-authenticate.
If a command returns no data, say that no matching Link financial data was available for the requested scope.
If the CLI returns an error indicating missing permissions or source actions, request only the specific missing action. Use auth upgrade when a session is already authenticated and auth login when it is not, then wait for approval before retrying the data command once.
If data is incomplete or paginated, clearly state that the answer is based on the data retrieved so far.
Guardrails
Do not:
- Move money.
- Initiate payments.
- Modify financial sources.
- Retrieve unrelated financial data.
- Request broader source actions than needed.
- Expose credentials, tokens, or full payment details.
- Present uncertain derived insights as definitive.
Do:
- Use read-only commands.
- Authenticate before retrieval.
- Request the minimum required source actions.
- Use
--format jsonfor parsing. - Retrieve only the data needed.
- Summarize clearly and note limitations.
Related skills
More from stripe/link-cli and the wider catalog.

link-cli
Install and authenticate Stripe Link CLI for agent payments, financial insights, or both.

create-payment-credential
Get secure, one-time-use payment credentials from Link wallet to complete purchases on behalf of users.

ralph-tui-create-beads
Convert PRDs to beads for ralph-tui execution. Creates an epic with child beads for each user story. Use when you have a PRD and want to use ralph-tui with beads as the task source. Triggers on: create beads, convert prd to beads, beads for ralph, ralph beads.

ralph-tui-create-beads-rust
Convert PRDs to beads for ralph-tui execution using beads-rust (br CLI). Creates an epic with child beads for each user story. Use when you have a PRD and want to use ralph-tui with beads-rust as the task source. Triggers on: create beads, convert prd to beads, beads for ralph, ralph beads, br beads.

ralph-tui-create-json
Convert PRDs to prd.json format for ralph-tui execution. Creates JSON task files with user stories, acceptance criteria, and dependencies. Triggers on: create prd.json, convert to json, ralph json, create json tasks.

ralph-tui-prd
Generate structured Product Requirements Documents for ralph-tui task orchestration with AI-executable user stories.