# Crypto Transaction Categorizer

> Crypto Transaction Categorizer is a paid API for AI agents from crypto-tx-categorizer-production.up.railway.app, paid per call via x402, $0.1/call, status unknown (last checked 2026-10-28).

Categorizes crypto and bank transactions into accounting categories with optional invoice matching and counterparty label interpretation

## Facts

- Endpoint: POST https://crypto-tx-categorizer-production.up.railway.app/api/v1/categorize?utm_source=zero.xyz
- Price: $0.1/call
- Payment: x402
- Status: unknown
- Last checked: 2026-10-28
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/crypto-transaction-categorizer-8d85c1de
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_tGcnSBxfiBA-x810YbHeZ

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability crypto-transaction-categorizer-8d85c1de -d '<json body>'
```

Example prompt: Categorize these 5 USDC transactions from my wallet — here are the hashes, timestamps, directions, counterparties, and amounts — and match them against my open invoices for Acme Corp ($500) and Globex ($1200). My own wallet addresses are 0xABC and 0xDEF, and label Acme Corp as 'client'.

## When to prefer this

Choose this endpoint when you need to classify crypto or bank transactions into accounting categories, especially when you want to match payments against issued invoices or interpret counterparty labels for bookkeeping purposes. It is ideal for freelancers, DAOs, or finance teams reconciling on-chain payments with expected receivables. Prefer it over generic blockchain analytics tools when invoice matching and label-based categorization are required.

## Known failure modes

- Missing required transaction fields (hash, timestamp, direction, counterparty, amount, asset) returns a validation error
- Exceeding 100 invoices or 50 own-wallet entries returns a limit exceeded error
- Invalid ISO 8601 timestamps cause parsing failures
- Ambiguous counterparty names may result in incorrect or no invoice matches
- Non-positive or zero amounts are rejected due to exclusiveMinimum constraint
- Payment failure via x402 protocol results in 402 response before processing

## How this service works

Categorize crypto/bank transactions with optional invoice matching and label interpretation

## Output

Returns a list of categorized transactions, each assigned an accounting category (e.g. income, expense, internal transfer), along with invoice match results indicating which transactions correspond to specific outstanding invoices, and interpreted labels for known counterparties.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "properties": {
  "invoices": {
   "type": "array",
   "items": {
    "type": "object",
    "required": [
     "client",
     "amount"
    ],
    "properties": {
     "asset": {
      "type": "string",
      "maxLength": 20,
      "minLength": 1,
      "description": "Optional. If omitted, the invoice matches any dollar-equivalent asset (USD, USDC, USDT, DAI)."
     },
     "amount": {
      "type": "number",
      "exclusiveMinimum": 0
     },
     "client": {
      "type": "string",
      "maxLength": 120,
      "minLength": 1,
      "description": "Client name, matched against the counterparty."
     },
     "issuedDate": {
      "type": "string",
      "description": "Optional ISO date; payments before it are not matched."
     }
    }
   },
   "maxItems": 100,
   "description": "Optional. Expected invoices to match against incoming payments."
  },
  "ownWallets": {
   "type": "array",
   "items": {
    "type": "string",
    "maxLength": 100,
    "minLength": 1
   },
   "maxItems": 50,
   "description": "Optional. Transfers to/from these are categorized as Internal transfer."
  },
  "knownLabels": {
   "type": "object",
   "description": "Optional. Counterparty -> label (e.g. \"Acme Corp (client)\"); labels are interpreted by keyword and direction.",
   "maxProperties": 100,
   "additionalProperties": {
    "type": "string",
    "maxLength": 120,
    "minLength": 1
   }
  },
  "transactions": {
   "type": "array",
   "items": {
    "type": "object",
    "required": [
     "hash",
     "timestamp",
     "direction",
     "counterparty",
     "amount",
     "asset"
    ],
    "properties": {
     "hash": {
      "type": "string",
      "maxLength": 120,
      "minLength": 1,
      "description": "Your own unique id for the transaction (e.g. a tx hash or bank reference)."
     },
     "asset": {
      "type": "string",
      "maxLength": 20,
      "minLength": 1,
      "description": "Currency or token symbol, e.g. USDC, ETH, USD."
     },
     "amount": {
      "type": "number",
      "description": "Positive amount in the transaction's asset.",
      "exclusiveMinimum": 0
     },
     "isSelf": {
      "type": "boolean",
      "description": "Optional. Set true when you already know this is a transfer between your own accounts."
     },
     "direction": {
      "enum": [
       "in",
       "out"
      ],
      "type": "string",
      "description": "Money in (income) or out (expense) from the account owner's point of view."
     
… (truncated)
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/crypto-transaction-categorizer-8d85c1de/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from crypto-tx-categorizer-production.up.railway.app](https://www.zero.xyz/host/crypto-tx-categorizer-production.up.railway.app/llms.txt)
