enrichment
Descriptors in, merchants and categories out.
Enrichment is an endpoint on the same key as everything else, not a separate product with a separate contract. It runs deterministically first, so the answer exists whether or not a model is reachable — and it works on transactions you aggregated somewhere else.
- descriptor rules
- 526
- primary categories
- 14
- subcategories
- 89
- AI endpoints
- 9
endpoints
What enrichment covers.
Four AI endpoints accept a raw payload; two ordinary data endpoints serve detected streams and the taxonomy itself.
- POST
/v1/ai/categorizeMap transactions onto the platform taxonomy with a confidence score each. Accepts a raw payload. - POST
/v1/ai/merchantResolve one raw descriptor into a clean merchant name, category, and website. Takes only a query. - POST
/v1/ai/subscriptionsFind paid subscriptions, price them annually, and flag the ones that look unused. Accepts a raw payload. - POST
/v1/ai/fraud-riskScore transactions for duplicates, unfamiliar merchants, and out-of-pattern amounts. Accepts a raw payload. - POST
/v1/recurring/getDetected recurring streams for a connected item: cadence, direction, average amount, next expected date. - POST
/v1/categories/getThe full taxonomy — the exact strings every other surface uses.
requests
Send transactions, get labels back.
This request needs no connected account, no Link flow, and no item — just a key.
# No access_token: enrich transactions from any source.curl https://connect.feels.money/v1/ai/categorize \-H "Authorization: Bearer $FEELCONNECT_SECRET_KEY" \-H "Content-Type: application/json" \-d '{"transactions": [{ "id": "t1", "description": "SQ *BLUE BOTTLE COFFEE OAK", "amount": 6.75 },{ "id": "t2", "description": "COMCAST CABLE COMM", "amount": 89.99 }]}'
rules first
Deterministic by default, model-enhanced when useful.
The ordering matters more than the model: a categorizer that answers differently on Tuesday is not a categorizer.
- 526 ordered descriptor rules run first and first match wins. Transaction-type descriptors — payroll, interest charges, ATM fees, card payments, transfers — deliberately outrank merchant names, because
PAYMENT TO VISAis a transfer no matter whose brand is in the string. - Every answer is normalized onto the taxonomy before it leaves, so a model that invents a category cannot leak one into your database.
- The model is an enhancement, not a dependency. When it is unreachable the endpoints answer from rules alone and say so in
engine. Nothing queues, nothing polls, and the request still returns in one round trip. - Recurring detection is not an AI call at all. Streams are computed on ingest from the transactions the connector returned, so
/v1/recurring/getis a plain read against your normal request quota.
| engine | What produced the response |
|---|---|
| rules | Deterministic engines only. Always available, always the same answer. |
| ai | Schema-validated model output drove the response. |
| ai+rules | Rules produced the base result and the model enriched it — narratives, edge cases, unfamiliar descriptors. |
taxonomy
14 primary categories, 89 subcategories.
One vocabulary across the sandbox engine, the enrichment endpoints, stored transactions, and the dashboards. Fetch it at /v1/categories/get and store it beside your data.
Income
Salary · Freelance · Interest · Dividends · Refund · Bonus · Other Income
Transfer
Internal Transfer · External Transfer · Savings Transfer · Investment Contribution · Credit Card Payment · Loan Payment · Cash Withdrawal · Cash Deposit
Food & Drink
Restaurants · Fast Food · Coffee Shops · Bars & Nightlife · Delivery · Bakeries & Desserts
Groceries
Supermarket · Convenience Store · Specialty Foods · Warehouse Club · Farmers Market
Shopping
Clothing & Apparel · Electronics · Home Goods · Online Marketplace · Beauty & Personal Care · Books & Hobbies · Pets · Gifts
Entertainment
Streaming · Movies & Events · Music · Games · Concerts & Shows · News & Magazines
Travel
Flights · Hotels & Lodging · Car Rental · Vacation Packages · Travel Insurance
Transport
Rideshare · Public Transit · Fuel · Parking · Tolls · Auto Maintenance · Auto Payment
Housing
Rent · Mortgage · Home Insurance · Property Tax · Home Improvement · Furniture · HOA Fees
Utilities
Electricity · Water & Sewer · Gas · Internet · Mobile Phone · Trash & Recycling
Subscriptions
Software & SaaS · Cloud Storage · Memberships · Meal Kits · Box Subscriptions · Education & Courses
Health & Fitness
Gym & Fitness · Pharmacy · Doctor & Dental · Vision · Mental Health · Sports & Outdoors
Fees
Bank Fees · ATM Fees · Late Fees · Interest Charges · Foreign Transaction Fees · Service Charges
Other
Uncategorized · Charity & Donations · Education · Childcare · Taxes · Legal & Professional
recurring
How a stream is decided.
The detector is a pure function over transactions, so you can reason about why something was or was not called recurring.
| Median interval between charges | Cadence assigned |
|---|---|
| 5 to 9.5 days | weekly |
| 11 to 20 days | biweekly |
| 24 to 38 days | monthly |
| 75 to 120 days | quarterly |
| 300 to 430 days | annual |
Each stream carries a merchant name, category, cadence, average and last amount, last and next expected date, a direction of outflow or inflow, and a status of active, paused, or ended. Inflow streams are how payroll shows up. The full shape is in the recurring reference.
faq
Questions developers actually ask.
keep reading
Where to go next.
- AI referenceAll 9 enrichment products with request and response shapes.
- Category taxonomyEvery primary and detailed label, and how to fetch them.
- Bank data APIWhere the transactions come from when you do connect an account.
- PricingHow AI requests are metered, plan by plan.
- Plaid alternativeUsing enrichment on data you already aggregate elsewhere.
- API explorerRun these calls against the sandbox from the browser.