Classification API — read-only, no custody
The missing label for the DeFi transactions your tax tool can't read.
An API that turns raw on-chain transactions from Curve, Convex, Aerodrome, and Across into labeled categories — swap, LP deposit, reward claim, bridge fill — instead of the generic “transfer” your export shows today.
Classification only. Never a tax position, cost basis, or filing advice.
Raw log → classified output
Every crypto tax tool hits the same wall
The newest or more obscure DeFi protocols don't have a parser yet. Curve LP deposits, Convex reward claims, Aerodrome vote incentives, Across bridge fills — these import as unlabeled transfers, and someone has to relabel them by hand before the numbers mean anything.
This API is that parser, sold as infrastructure: send a transaction hash, get back a structured label with the protocol, the category, the exact assets in and out, and a confidence score.
How it works
Send a transaction
POST /v1/classify with a chain and a transaction hash you already have — from an Etherscan/Basescan export, your own node, or your product's existing pipeline.
Get a structured label back
Protocol, category, assets in/out, confidence score, and the reason for that confidence (decode_basis) — not a black box.
Or batch your whole history at once
POST /v1/batch up to 10,000 transactions in one call for a one-time historical import — the actual power-user workflow at tax time. Poll for results or give us a webhook.
Request
# chain + tx_hash — a pair you already have curl -X POST https://crypto-tx-classifier-api.onrender.com/v1/classify \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"chain": "ethereum", "tx_hash": "0x..."}'
Response
{
"results": [
{
"schema_version": "1.0",
"tx_hash": "0x...",
"chain": "ethereum",
"chain_id": 1,
"protocol": "curve",
"category": "lp_deposit",
"action_detail": "add_liquidity",
"assets_in": [{ "symbol": "USDC", "amount": "1000.0" }],
"assets_out": [{ "symbol": "3CRV", "amount": "998.42" }],
"confidence": 0.95,
"decode_basis": ["event:AddLiquidity", "config_driven_decode"],
"disclaimer": "classification only — not a tax position, cost-basis determination, or financial advice"
}
]
}
What's covered today
Four protocols, two chains, one bridge route — each one verified against live on-chain contract state, not scraped from a list. A transaction that touches a covered protocol but doesn't match a known event pattern comes back unclassified with a stated reason. Never a silent wrong label, never a dropped transaction.
| Protocol | Chain | Categories |
|---|---|---|
| Curve Finance | Ethereum | Swap, LP deposit/withdraw, gauge reward claim |
| Convex Finance | Ethereum | Stake/unstake, multi-token reward claim |
| Aerodrome Finance | Base | Swap, LP deposit/withdraw, vote/bribe reward claim |
| Across Protocol | Ethereum ↔ Base | Bridge deposit, bridge fill |
Need a protocol we don't cover yet? Metered-tier customers can request one. Anything with a verified contract and a standard event log gets a target 10-business-day turnaround.
Who it's for
For tax-software teams
Stop building and maintaining a protocol-specific parser for every new DeFi contract your users touch. Plug this in as a classification layer for the transactions your existing pipeline can't label — you keep the product, the filing logic, and the customer relationship.
For DeFi users doing your own books
Export your transaction history, run it through the batch endpoint once, get back labeled categories instead of a wall of unlabeled transfers. Free tier covers a modest year's worth of activity with no card required. No sales call, no platform integration — an instant, self-serve checkout built for one person doing their own books, not an enterprise deal.
Pricing
Free
- 250 classified transactions / month
- All 4 protocols, full response schema
- Single-transaction endpoint
- 10 requests/min
- No credit card, no wallet
Starter
- $0.0100 / classified transaction
- Everything in Free, plus:
- Batch endpoint — up to 10,000 tx/call
- 60 requests/min
- Credits never expire
Bulk
- $0.0060 / classified transaction (40% off Starter)
- Everything in Starter
- Sized for a full multi-year wallet history import
- Credits never expire
Vendor
- $0.0040 / classified transaction (60% off Starter)
- Everything in Starter
- Sized for sustained bulk/vendor classification
- Credits never expire
Paid packs are settled on-chain, non-custodially: each purchase gets a unique deposit address, watched for confirmation — no card, no third-party processor.
Base network only. Native USDC only — no other chain or asset is accepted at your deposit address.
Overpayment is not refunded, and credits are not refunded once issued.
FAQ
Is this a tax product? Will it tell me what I owe?
No. This API classifies transactions — it identifies what happened on-chain (a swap, an LP deposit, a reward claim) and never computes a tax position, cost basis, or "you owe" figure. Every API response says this explicitly.
What happens if you don't recognize my transaction?
It comes back labeled unclassified with a stated reason, never a wrong guess and never silently dropped. If it's on a protocol we don't cover at all, request it — see Pricing.
Why only 4 protocols?
Every protocol we support is verified against live on-chain contract state before it ships, not assumed from documentation. We'd rather ship a short, correct list and grow it on request than a long list of guesses.
Do you have access to my wallet or funds?
For classification, no — read-only against public chain data, you send us a transaction hash you already have, nothing to sign, nothing to custody. Buying a paid pack is the one place funds move, and even then it's a one-way on-chain transfer to a deposit address you control the amount and timing of — not a stored payment method, not a wallet connection.
Is the payment address safe? What if I send the wrong asset?
Each purchase gets its own unique deposit address, watched on-chain for confirmation. Base network only, native USDC only — sending a different chain or asset to that address is not recoverable, so this is stated explicitly on both the pricing page and the payment screen.
What chains do you support?
Ethereum mainnet and Base today.
What if my payment doesn't get credited?
Email cryptotxclassifier@proton.me with your deposit address and transaction hash. This is a one-person, best-effort channel with no SLA, but real — worth checking first that the deposit matches what's required: Base network only, native USDC only, sent to the purchase-specific deposit address shown at checkout.