Crypto tax classification you can build on.
Most APIs marketed for crypto taxes return transaction data (balances, transfers, decoded calls) and leave the tax determination to you. CryptoTaxEdge returns the determination itself: from one transaction hash, the canonical category, the US tax treatment, a confidence score, and an honest review flag when the answer genuinely needs a human.
One call
POST https://app.cryptotaxedge.com/v1/classify
{ "chain": "ethereum", "hash": "0x4935…e18c" }
200 OK
{
"api_version": "v1",
"category": "swap",
"treatment": "disposal",
"taxable": true,
"confidence": 95,
"needs_review": false,
"ledger_action": "Trade",
"protocol": "OpenSea Seaport",
"grey_area": null,
"assets": { "sent": […], "received": […] }
}
Chain detection is automatic when you enter just a hash. A batch endpoint (POST /v1/classify-batch, up to 100 hashes) and a read-only GET /quota-status round out the surface. Errors carry proper HTTP semantics (404 tx_not_found, 402 quota_exceeded, 429 rate_limited), and an upstream failure is a 502, never shipped as a classification.
Data API vs. determination API
The distinction that matters when you evaluate this category:
| Transaction-data APIs | CryptoTaxEdge |
|---|---|
| Return decoded activity: balances, transfers, method calls | Returns the tax determination: category + treatment + taxable |
| Tax logic is your team's problem, protocol by protocol | 15,000+ verified protocol rules across a registry of 100+ chains (depth varies), applied for you |
| One data source's view of the transaction | Multiple independent sources reconciled by a patent-pending consensus engine |
| Ambiguity surfaces as your bug, in production | Ambiguity surfaces as needs_review with taxable: null, by design |
Both layers are legitimate infrastructure; you may well use a data API elsewhere in your stack. This one exists so the tax layer is a call, not a roadmap: deterministic, review-honest, and evidence-backed, so the answer you build on today is the answer you get tomorrow.
Enrichment, classification, determination
The vocabulary in this category blurs, so here is how the three layers relate. Transaction enrichment turns raw logs into labeled activity: decoded methods, named protocols, human-readable legs. Transaction classification maps that activity onto a closed category set: this row is a swap, that one is a reward claim, that one is a plain transfer. Tax determination attaches the consequence: disposal, income, non-taxable, expense, or an honest needs_review. A crypto transaction enrichment API stops at the first layer; CryptoTaxEdge is a crypto transaction classification API that carries the row all the way through the third, with the category vocabulary published as a versioned standard and the mapping documented in the treatment taxonomy.
Because the output is the determination, the same engine embeds cleanly where the tax answer is the product: tax platforms, crypto subledgers, wallets showing a treatment column, accounting workflows, and AI agents via MCP. Embedding CryptoTaxEdge output in your own product is what the self-serve tiers are for; reselling classifications to paying end users is a partner conversation (hello@cryptotaxedge.com).
Integrate in three steps
- Get a key. Create a free account and mint a Developer key: 250 billable classifications a month, no card. Keys live in the dashboard.
- POST a hash. Send
{ "chain", "hash" }to/v1/classify, or up to 100 at once to/v1/classify-batch. Chain detection is automatic when you send just a hash. - Branch on the contract. Act on
treatmentandneeds_review, never on integer math againstconfidence. Routeneeds_review: truerows to a human queue; ataxable: nullmust never be coerced tofalse. Validate against the published record schema.
Honest by design
The engine routes to review rather than guessing. Confidence is a corroboration signal (stronger agreement across independent sources scores higher; disagreement routes to review), and genuinely contested treatments (LP deposits, wrapping, liquid staking) return a documented house position and the alternative in the grey_area block. A signed-in firm can save LP, wrap, liquid staking, and rebase stances in Settings, under Tax policy; that policy applies only to signed-in Explorer classifications that send it. anonymous Explorer, the Chrome extension, and API calls without a policy get the house default plus the alternate. CryptoTaxEdge describes positions and their basis; it does not assert a filing position for any taxpayer.
The full category and treatment set is a closed enum, published at /taxonomy, and every response validates against the published classification record schema. Want proof before you integrate? verbatim wire captures, including the honest deferrals, are published and replayed against the live engine daily.
MCP, for AI agents
The same engine is exposed as an MCP server at mcp.cryptotaxedge.com: connect it from any MCP-capable agent that can send a Bearer API key and classification becomes a tool call, with identical wire values to the API. Agents get the same honesty contract: a review flag instead of a hallucinated treatment.
Verify: put your labels through our checks (coming soon)
Status: built and flag-gated, not yet enabled. POST /v1/verify and /v1/verify-batch answer 404 until the flag is on. Pricing for Verify is not yet published.
You already classify. You send us the hash and your label; we return a verdict on your label under the Classification Standard, with the evidence: agree, disagree with the reconciled legs and the registry match that drove the disagreement, or unverifiable with the reason. You keep your label and your UI. We never see your users, balances or wallets, only hashes, chains and the label you want checked. Where it pays: review queues, the DeFi tail, the rows your own model flips on between runs, and the rows a CPA sends back. A disagree arrives with a dispute schema so your reviewer can overturn it with evidence. The Standard decides the treatment, the checks verify the facts the treatment depends on, and the CPA decides the filing.
Pricing
| Tier | Price | Included |
|---|---|---|
| Developer | $0 | 250 billable transactions/month; full API + MCP + Explorer, no card required |
| Pro | $249/month | 25,000 billable transactions, then $0.012 each; REST + MCP keys, webhooks |
| Platform | $999/month | 120,000 billable transactions, then $0.012 each; priority support, partner-tier rate limits (table below) |
| Enterprise | Contact us | 250,000+ committed volume, rates below a penny; SLA, white-label and resale rights |
You pay only for tax classifications. Identification is always free: plain transfers come back with the counterparty named, and approvals, spam, failed rows, and every repeat never count against your pool. Accounting firms have a separate door, the Firm plan, with seats and no metered billing.
Rate limits
| Key class | Requests per minute | Notes |
|---|---|---|
| Developer (free tier) | 60 per key | The working ceiling is the 250-transaction monthly pool, not the rate. |
| Partner-tier keys (platforms integrating at volume) | 300 per key | A batch call carries up to 100 hashes, so a partner steadily fills tens of thousands of transactions a minute. |
| Firm plan keys (MCP) | 600 per key |
Over the limit you get 429 rate_limited; back off and retry. Repeats of already-classified hashes are always free and always served.
FAQ
What does the CryptoTaxEdge API return?
From a transaction hash, one call returns the canonical category (swap, reward, transfer, and so on), the US tax treatment (disposal, income, non_taxable, expense, or needs_review), whether the event is taxable, an integer confidence score, the protocol involved, and the assets sent and received. Grey-area categories also return the documented house position and the alternative.
How is this different from a transaction-data API?
Transaction-data APIs return decoded activity (balances, transfers, decoded calls) and leave the tax determination to you. CryptoTaxEdge returns the determination itself: multiple independent data sources are reconciled and 15,000+ verified rules applied, so the response is a tax classification, not raw material for one.
Is there a free tier?
Yes. The Developer tier is $0 and includes 250 billable transactions per month with no card required. Paid tiers are Pro at $249/month for 25,000 billable transactions and Platform at $999/month for 120,000, each then $0.012 per transaction; committed volume above 250,000 is an Enterprise conversation with rates below a penny.
What happens when a transaction is genuinely uncertain?
The engine returns needs_review with taxable set to null instead of asserting a taxable or non-taxable outcome. Flagging uncertainty is a designed behavior, not a failure state, and a 502 from an upstream source is never shipped as a classification.
What is the difference between a crypto transaction enrichment API and a classification API?
Enrichment turns raw logs into labeled activity: decoded methods, named protocols, readable legs. Classification maps that activity onto a closed category set and attaches the tax determination: disposal, income, non_taxable, expense, or needs_review. An enrichment API hands you better raw material; a classification API hands you the answer, with a confidence signal and a review flag when the evidence does not settle it.
Can I embed CryptoTaxEdge classifications in my own product?
Yes. Self-serve API plans cover a developer's own product and workflows, including free products and internal betas. Charging end users for CryptoTaxEdge-powered output requires a partner agreement; write to hello@cryptotaxedge.com.
How the engine reaches an answer is documented in plain terms: how crypto tax treatment is determined · what needs_review means · why platforms disagree on the same transaction · the full answers library.
Questions, higher volume, or an integration that does not fit the grid: hello@cryptotaxedge.com.
Not tax advice. CryptoTaxEdge is software, not a licensed tax advisor. Classifications are informational only. Verify results and consult a qualified tax professional before filing. IRC section references are provided as general framing.