DEV Community

Per
Per

Posted on

We built a crypto fee API that tells you what it doesn't know

The problem with crypto fee data

If you've tried to answer "what does it cost to buy BTC with a card in Germany?" programmatically, you've probably hit this: most comparison sites either show stale affiliate-ranked lists, or return nothing when they don't have data.

Neither is useful if you're building a product that needs structured fee data.

We built Augea to solve this. The Route Viability API gives you structured fee data across 33 exchanges, 10 countries, and 2 payment rails — with one rule: if we don't know something, we say so explicitly.

What the API returns

One endpoint. Three parameters. Every exchange in the catalog.

curl -H "Authorization: Bearer YOUR_KEY" \
  "https://augea.io/api/agent/route-viability?country=DE&asset=BTC&rail=card"
Enter fullscreen mode Exit fullscreen mode

The response includes every tracked exchange — not just the ones with data. Each entry has a viabilityState:

  • rankable — verified fee data exists. Fee range included.
  • tracking — we have a snapshot row but not enough data to rank it yet.
  • no_data — exchange is in our catalog but we have nothing for this route.
{
  "exchangeSlug": "coinbase",
  "viabilityState": "rankable",
  "feeRange": { "low": 1.49, "high": 3.99 },
  "freshnessBucket": "FRESH",
  "capturedAt": "2025-03-17T10:00:00.000Z",
  "unknownReason": null
}
Enter fullscreen mode Exit fullscreen mode
{
  "exchangeSlug": "robinhood",
  "viabilityState": "no_data",
  "feeRange": null,
  "freshnessBucket": null,
  "unknownReason": "No snapshot data for this route"
}
Enter fullscreen mode Exit fullscreen mode

No filtering. No hiding. The second response is just as valid as the first — it tells you exactly what we don't know.

Why "unknown" is a first-class state

Every response carries a provenance.audit block:

{
  "audit": {
    "noInference": true,
    "unknownsFirstClass": true,
    "contractVersion": "v1"
  }
}
Enter fullscreen mode Exit fullscreen mode

noInference: true means we never fabricate data. If the evidence pipeline didn't produce a fee range, the field is null — not estimated, not interpolated.

unknownsFirstClass: true means a tracking or no_data state is a deliberate response, not an error. Your code should handle it as valid information: "Augea tracks this exchange but doesn't have fee data for this route yet."

This matters because most downstream products need to distinguish between "this route costs X" and "we don't know what this route costs" — and they need that distinction to be machine-readable, not buried in a footnote.

Freshness buckets

Fee data gets stale. We don't hide that — every entry has a freshnessBucket:

Bucket Age What it means
FRESH < 7 days Recent evidence
DEGRADED 7–30 days Usable but aging
STALE 30–90 days May not reflect current pricing
UNRANKABLE > 90 days Too old for cost comparison

Your product decides what to do with this. We just tell you how old the data is.

Route summary

Each response includes a routeSummary so you can quickly check coverage depth:

{
  "totalExchangeCount": 33,
  "rankableCount": 9,
  "trackingCount": 4,
  "noDataCount": 20,
  "hasViableRoute": true
}
Enter fullscreen mode Exit fullscreen mode

hasViableRoute is true when at least one exchange is rankable — meaning cost comparison is possible. It's not a recommendation. It's a coverage signal.

What the API explicitly won't do

The response includes a responseGuidance block:

{
  "allowedUses": [
    "Determine whether a route is covered by Augea data",
    "List which exchanges have verifiable cost data for a route",
    "Surface fee range estimates alongside freshness and provenance"
  ],
  "forbiddenUses": [
    "Recommend or rank exchanges as 'best' or 'safest'",
    "Present fee ranges as guaranteed quotes",
    "Infer exchange quality or safety from viability state"
  ]
}
Enter fullscreen mode Exit fullscreen mode

We ship this in the response itself — not just in the docs — so downstream consumers always have the boundary visible.

Coverage

Currently in beta:

  • 10 countries: US, GB, DE, SE, CA, AU, FR, NL, SG, PL
  • 18 assets: BTC, ETH, SOL, XRP, ADA, DOGE, AVAX, LINK, DOT, MATIC, LTC, BCH, PEPE, SHIB, UNI, TAO, XLM, ATOM
  • 2 rails: card (credit/debit), bank (bank transfer)
  • 33 exchanges tracked across these markets

Not every exchange supports every combination. The API tells you which ones do.

Auth and rate limits

Bearer token authentication. Keys are provisioned manually during beta.

Authorization: Bearer <your-api-key>
Enter fullscreen mode Exit fullscreen mode

Rate limit: 60 requests per minute per key. On 429, you get a Retry-After header.

Errors are structured and versioned:

{
  "version": "augea-route-viability.v1",
  "ok": false,
  "error": {
    "code": "RATE_LIMITED",
    "message": "Rate limit exceeded. Retry after 42 seconds."
  }
}
Enter fullscreen mode Exit fullscreen mode

Contract stability

The response version is augea-route-viability.v1. Within v1:

  • New fields may be added
  • Existing fields will not be removed or renamed
  • Your code should tolerate unknown fields

This is an additive-only contract. No silent breaking changes.

Get a beta key

The API is free during beta. No billing, no commitment.

Email api@augea.io with:

  • What you're building
  • Which markets you need
  • Expected query volume

Full docs: augea.io/docs/api/route-viability


Augea is a crypto fee comparison and route intelligence product. We track 33 exchanges across 10 countries with evidence-first methodology. Estimates, not quotes.

Top comments (0)