From raw feed to forecast-ready data. Under 200ms.

A single POST endpoint transforms miscategorized transaction batches into accurate, forecast-ready data. Here's exactly how the pipeline works.

Pipeline stages
1. Ingest — normalize bank format
2. Classify — ML reclassification
3. Score — confidence assignment
4. Forecast — 90-day signal generation
5. Return — corrected JSON response
Total: <200ms median

The full data path

Bank Transactions Open Banking API (Plaid/MX) Spendaq Normalize → Classify → Forecast Corrected JSON + forecast_signal Banking App Dashboard median latency: <200ms end-to-end

The API request and response

POST your transaction batch, get corrected categories and forecast signal back synchronously.

POST /v1/classify — Request
POST https://api.spendaqo.com/v1/classify
Authorization: Bearer spq_live_...
Content-Type: application/json

{
  "account_id": "acct_kst_8841",
  "transactions": [
    {
      "id": "txn_001",
      "amount_cents": 8499,
      "date": "2026-06-10",
      "merchant_name": "AMZN*MKTP",
      "raw_category": "DEBIT_MISC"
    },
    {
      "id": "txn_002",
      "amount_cents": 29900,
      "date": "2026-06-11",
      "merchant_name": "NOTION HQ",
      "raw_category": "PAYMENT_OTHER"
    },
    {
      "id": "txn_003",
      "amount_cents": 41200,
      "date": "2026-06-12",
      "merchant_name": "DELTA AIR",
      "raw_category": "UNCATEGORIZED"
    }
  ]
}
200 OK — Response (142ms)
{
  "status": 200,
  "latency_ms": 142,
  "results": [
    {
      "id": "txn_001",
      "corrected_category": "Office Supplies",
      "confidence_score": 0.97,
      "original_category": "DEBIT_MISC"
    },
    {
      "id": "txn_002",
      "corrected_category": "Software Subscription",
      "confidence_score": 0.96,
      "original_category": "PAYMENT_OTHER"
    },
    {
      "id": "txn_003",
      "corrected_category": "Business Travel",
      "confidence_score": 0.94,
      "original_category": "UNCATEGORIZED"
    }
  ],
  "forecast_signal": "stable_positive",
  "forecast_horizon_days": 90,
  "forecast_confidence": 0.83
}

Why sub-200ms matters for banking apps

Banking apps make synchronous API calls during transaction loading. If your classification layer is slow, your app is slow. Spendaq is designed as a synchronous enrichment layer — not an async batch job.

  • In-region compute

    Classification runs in US-East ephemeral containers. No cross-region hops in the critical path.

  • In-memory model serving

    The classification model is pre-loaded in memory. No cold-start penalty on classification calls.

  • Zero retention after response

    Transaction data is not persisted. Container destroyed after response returned.

Latency breakdown (p50)
API Gateway 8ms
Normalization 14ms
ML Classification 88ms
Forecast Signal 22ms
Response serialization 10ms
Total (p50) 142ms

Start your integration today.

Follow the quickstart guide — most integrations go live in under a sprint.