From Powder
Use when user asks to upload, analyze, or extract data from a financial statement (PDF, Excel, or image). Handles brokerage statements, 401k statements, and account documents. Validates files, monitors processing, and formats results as human-readable tables.
How this skill is triggered — by the user, by Claude, or both
Slash command
/Powder:upload-and-extractThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Automates the complete workflow of uploading financial statements (brokerage, bank, credit card) to the Powder API and extracting structured data. Handles validation, status monitoring, error recovery, and formatting of results.
Automates the complete workflow of uploading financial statements (brokerage, bank, credit card) to the Powder API and extracting structured data. Handles validation, status monitoring, error recovery, and formatting of results.
powder CLI is installed and API token is configuredpowder --json upload <path> [--portfolio <id>]powder --json status <id> --watch --timeout 600Before starting, verify the environment:
# Check powder CLI is available
which powder
# Verify auth token is set (checks both plugin config and env var)
test -n "${POWDER_API_TOKEN:-$CLAUDE_PLUGIN_OPTION_POWDER_API_TOKEN}" && echo "set" || echo "not set"
Decision Tree:
powder not found → Suggest running /Powder:setup to install the CLI/Powder:setup to configure authenticationImportant: Token Passthrough — Always prefix powder commands with:
POWDER_API_TOKEN="${POWDER_API_TOKEN:-$CLAUDE_PLUGIN_OPTION_POWDER_API_TOKEN}" powder ...
Before uploading, check the file meets requirements:
# Check file exists and get size
ls -lh "$FILE_PATH"
# Verify extension
file "$FILE_PATH"
Validation Checklist:
.pdf, .xlsx, .png, .jpg, .jpegDecision Tree:
.csv and .xls (convert to .xlsx), .doc/.docx (export to PDF), .html (save as PDF)Execute the upload command with JSON output:
powder --json upload "$FILE_PATH"
Optional Flags:
--type brokerage - Statement type (default, currently the only supported type — can be omitted)--portfolio <id> - Associate with existing portfolio IDExpected Response:
{
"id": 12345,
"status": "processing",
"portfolio_id": 67890
}
Capture:
id - Document ID for status trackingportfolio_id - Portfolio this data belongs toError Handling:
Monitor the document processing with automatic polling:
powder --json status 12345 --watch --timeout 600
Flags:
--watch - Poll every 2 seconds until terminal status--timeout 600 - Wait up to 10 minutes (recommended for complex statements)Terminal Statuses:
done → Success, proceed to Step 4failed → Extraction failed, see error detailserror → Processing error, see error detailsclosed → Document was closed or cancelledNon-Terminal Statuses:
pending → Upload is queued for processingprocessing → OCR/extraction in progressin_review → Manual review required (rare)Decision Tree:
done → Proceed to Step 5 (fetch data)powder status <id> to check laterfailed, error, or closed → Go to Step 4 (error recovery)When processing fails, extract error details:
powder --json status 12345
Common Error Scenarios:
| Error Code | Meaning | Fix |
|---|---|---|
PASSWORD_PROTECTED_PDF | PDF requires password | Remove password protection and re-upload |
CORRUPT_PDF / INVALID_PDF_HEADER | File is damaged | Re-download or re-export the PDF |
UNSUPPORTED_FILE_TYPE | Wrong file format | Convert to supported format (.pdf, .xlsx, .png, .jpg) |
EMPTY_PDF / EMPTY_EXCEL | No extractable content | Check source file has visible content |
See reference/error-codes.md for the full error code reference.
Next Steps:
Once status is done, retrieve the extracted data:
powder --json data 12345
Response Structure:
{
"id": 12345,
"status": "done",
"data": {
"portfolio_id": 67890,
"ownerships": [...]
},
"count": 1,
"page": 1
}
Formatting Rules (see reference/output-formatting.md):
Found {count} holdings in portfolio {portfolio_id}Example Output:
Found 1 holdings in portfolio 67890
Holdings:
┌──────────────────────────────────────┬────────┬──────────────────────────┬───────────┬─────────────────┐
│ Name │ Ticker │ Account │ Quantity │ Statement Value │
├──────────────────────────────────────┼────────┼──────────────────────────┼───────────┼─────────────────┤
│ Example Target Date Fund │ EXMPL │ Brokerage Account *** │ 1,000.00 │ $50,000.00 │
└──────────────────────────────────────┴────────┴──────────────────────────┴───────────┴─────────────────┘
Totals:
- Statement Value: $50,000.00
- Current EOD Value: $114,992.97
- Holdings: 1
⚠️ Anomalies Detected:
- Large valuation gap (66.5% difference) between statement and current EOD price
See reference/output-formatting.md for the full API response shape, field definitions, and formatted output example.
npx claudepluginhub powder-finance/claude-code-powder-plugin --plugin powder-pluginParses financial statement PDFs (checking, savings, credit card, brokerage, 401k, HSA, mortgage, tax form) into normalized JSON with dates, balances, and transactions.
Parses local Settlement Detail report files (CSV/XLSX) for settlement amount validation, fee analysis, and reconciliation knowledge Q&A. Does not support other report types.
Ingests monthly/quarterly financial packages (Excel, PDF, CSV) for portfolio companies, extracts KPIs, flags variances to budget, and produces board-ready summary dashboards with covenant compliance status.