← Back to Home

Koko Finance Developer Docs

Credit card intelligence via REST API or MCP server. Analyze portfolios, compare cards, get recommendations, check renewal value, and get merchant-level advice.

REST API https://kokofinance.net/api/v1
MCP https://kokofinance.net/mcp/

Getting Started

Try the API in 60 seconds.

Get API Key — Free
1

Get an API Key

Sign up to get your free API key instantly (2,000 calls/month). Get your API key →

2

Make Your First Call

curl -X POST https://kokofinance.net/api/v1/cards/compare \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "card_names": [
      "Chase Sapphire Preferred",
      "Capital One Venture X"
    ],
    "params": {
      "spending": {"dining": 400, "travel": 500},
      "primary_goal": "travel"
    }
  }'
3

Or Use the Python SDK

pip install koko-finance
from koko_finance import KokoClient

client = KokoClient(api_key="YOUR_API_KEY")
result = client.compare_cards(
    cards=[
        {"card_name": "Chase Sapphire Preferred", "annual_fee": 95},
        {"card_name": "Capital One Venture X", "annual_fee": 395},
    ],
    spending={"dining": 400, "travel": 500},
    primary_goal="travel",
)
print(result)

REST API Reference

Authentication

All endpoints (except /health) require an API key passed via the X-API-Key header:

X-API-Key: koko_your_api_key

Base URL

https://kokofinance.net/api/v1

Try it interactively in Swagger UI →

Fast vs Verbose Endpoints

Three endpoints offer both a fast (default) and verbose variant:

EndpointFast (default)Verbose
/portfolio/analyze Deterministic calculations, <100ms /portfolio/analyze/verbose — adds AI narrative (3-5s)
/cards/compare Side-by-side data, <100ms /cards/compare/verbose — adds AI winner & pros/cons (3-5s)
/cards/recommend Deterministic ranking, <100ms /cards/recommend/verbose — adds AI headline & explanation (2-4s)

The metadata.mode field in every response tells you which variant was used: "fast" or "verbose". The /card/renewal-check endpoint is always fast (<100ms).

POST /portfolio/analyze

Analyze 1-10 credit cards for total value, per-card verdicts (KEEP/OPTIMIZE/CANCEL), and break-even analysis. Fast deterministic endpoint (<100ms). Use /portfolio/analyze/verbose for AI-generated narrative.

FieldTypeRequiredDescription
cardsarrayYes1-10 cards, each with card_name and optional annual_fee
params.spendingobjectNoMonthly spending by category (dining, travel, groceries, gas, streaming, shopping, other)
params.primary_goalstringNotravel, cashback, build_credit, business, or balance_transfer
params.credit_tierstringNopoor, fair, good, or excellent
params.issuer_preferencesarrayNoBoost/de-boost issuers, e.g. [{"issuer": "Chase", "weight": 1.5}]
params.point_balancesarrayNoYour rewards balances, e.g. [{"program": "chase_ur", "balance": 150000}]. Enriches analysis with redemption context.
params.benefit_selectionsarrayNoIndividual benefit keys the user actually uses (e.g. ["uber", "dining", "admirals_club"]). Selected benefits count at 100%; unselected at 0%. If omitted, 50% default utilization is assumed.
Request
{
  "cards": [
    {"card_name": "Chase Sapphire Preferred", "annual_fee": 95},
    {"card_name": "American Express Gold Card", "annual_fee": 250}
  ],
  "params": {
    "spending": {
      "dining": 500, "travel": 300,
      "groceries": 400, "gas": 100,
      "streaming": 30, "shopping": 200,
      "other": 150
    },
    "primary_goal": "travel",
    "point_balances": [
      {"program": "chase_ur", "balance": 150000},
      {"program": "amex_mr", "balance": 80000}
    ],
    "benefit_selections": ["uber", "dining", "travel", "saks"]
  }
}
Response
{
  "success": true,
  "data": {
    "card_details": [
      {
        "card_name": "Chase Sapphire Preferred",
        "net_value": 188,
        "verdict": "keep",
        "break_even": {"status": "spending_required"}
      },
      ...
    ],
    "portfolio_summary": {
      "total_annual_fees": 345,
      "net_value": 434,
      "total_rewards": 444
    },
    "assumptions": {"redemption_rate": 1.0, "point_value": 0.01}
  },
  "metadata": {
    "request_id": "a1b2c3d4e5f6",
    "api_version": "v1",
    "latency_ms": 52,
    "mode": "fast",
    "timestamp": "2026-03-11T14:30:00Z"
  },
  "error": null
}

POST /cards/compare

Compare 2-3 credit cards side-by-side with fees, rewards, net value, and break-even analysis. Fast deterministic endpoint (<100ms). Use /cards/compare/verbose for AI-generated winner and narrative.

FieldTypeRequiredDescription
card_namesarray[string]Yes2-3 card names to compare
params.spendingobjectNoMonthly spending by category
params.primary_goalstringNoOptimization goal
Request
{
  "card_names": [
    "Chase Sapphire Preferred",
    "Capital One Venture X"
  ],
  "params": {
    "spending": {"dining": 400, "travel": 500, "groceries": 300},
    "primary_goal": "travel"
  }
}
Response
{
  "success": true,
  "data": {
    "comparison_table": [
      {
        "card_name": "Chase Sapphire Preferred",
        "annual_fee": 95,
        "net_value": 188,
        "total_rewards": 198,
        "break_even": {"status": "spending_required"}
      },
      ...
    ],
    "assumptions": {"redemption_rate": 1.0, "point_value": 0.01}
  },
  "metadata": {
    "request_id": "b2c3d4e5f6a1",
    "api_version": "v1",
    "latency_ms": 45,
    "mode": "fast",
    "timestamp": "2026-03-11T14:31:00Z"
  },
  "error": null
}

POST /cards/recommend

Get the best card recommendations for a spending category. From the full market, or from your existing portfolio. Fast deterministic endpoint (<100ms). Use /cards/recommend/verbose for AI-generated narrative (portfolio mode only).

FieldTypeRequiredDescription
categorystringYesSpending category: dining, travel, groceries, gas, etc.
portfolio_card_namesarray[string]NoIf provided, recommend from portfolio instead of market
params.spendingobjectNoMonthly spending by category
params.credit_tierstringNoFilter by credit tier
params.primary_goalstringNoOptimization goal
Request
{
  "category": "dining",
  "params": {
    "spending": {"dining": 600, "groceries": 400},
    "credit_tier": "excellent",
    "primary_goal": "cashback"
  }
}
Response
{
  "success": true,
  "data": {
    "recommendations": [
      {
        "card_name": "American Express Gold Card",
        "issuer": "American Express",
        "annual_fee": 250,
        "net_value": 380,
        "rewards_structure": "4x dining, 4x groceries..."
      }
    ],
    "category": "dining",
    "total_candidates": 8
  },
  "metadata": {...},
  "error": null
}

POST /card/renewal-check

Check if a card is worth keeping at annual fee renewal time. Returns RENEW, DOWNGRADE, or CANCEL_AND_REPLACE.

FieldTypeRequiredDescription
card_namestringYesName of the card to check
params.spendingobjectNoMonthly spending by category
params.primary_goalstringNoOptimization goal
benefit_selectionsarrayNoBenefit keys the user actually uses (e.g. ["uber", "airline_fee", "dining"]). Selected benefits count at 100%; unselected at 0%.
Request
{
  "card_name": "Chase Sapphire Preferred",
  "params": {
    "spending": {
      "dining": 400, "travel": 300, "groceries": 500
    },
    "primary_goal": "travel"
  },
  "benefit_selections": ["dining", "travel"]
}
Response
{
  "success": true,
  "data": {
    "verdict": "RENEW",
    "year2_net_value": 120.50,
    "confidence": "high",
    "downgrade_options": [...],
    "replacement_options": [...],
    "thresholds_used": {
      "cancel": -100,
      "keep": 50
    }
  },
  "metadata": {...},
  "error": null
}

Merchant Intelligence

Merchant-level endpoints resolve a merchant name to a spending category, match card credits, and rank your portfolio by reward value. Deterministic for 350+ known merchants; uses Gemini AI fallback for unknown merchants.

POST /which-card-at-merchant

Find the best card from your portfolio for a purchase at a specific merchant. Auto-detects the spending category (e.g. Starbucks → dining) and ranks your cards by reward value.

FieldTypeRequiredDescription
merchantstringYesMerchant name (e.g. "Starbucks", "Saks Fifth Avenue", "Delta Air Lines")
amountnumberNoPurchase amount in dollars (default 100)
portfolioarray[string]YesCard names in your portfolio
Request
{
  "merchant": "Starbucks",
  "amount": 35,
  "portfolio": [
    "Chase Sapphire Reserve",
    "Amex Gold",
    "Citi Double Cash"
  ]
}
Response
{
  "success": true,
  "data": {
    "recommended_card": "American Express Gold Card",
    "category_detected": "dining",
    "category_method": "exact",
    "reason": "Starbucks codes as dining — Amex Gold 4x vs CSR 3x vs Citi DC 2%",
    "earnings_comparison": [
      {
        "card": "American Express Gold Card",
        "multiplier": "4x",
        "points_earned": 140,
        "program": "Membership Rewards",
        "estimated_value": "$2.10"
      },
      ...
    ]
  },
  "metadata": {...}
}

POST /merchant-benefits

Check if any cards in your portfolio have credits or benefits at a specific merchant. Also includes an earning recommendation (which card earns the most here).

FieldTypeRequiredDescription
merchantstringYesMerchant name (e.g. "Saks Fifth Avenue", "Uber", "Disney+")
portfolioarray[string]YesCard names in your portfolio
Request
{
  "merchant": "Saks Fifth Avenue",
  "portfolio": [
    "Amex Platinum",
    "Chase Sapphire Reserve"
  ]
}
Response
{
  "success": true,
  "data": {
    "matching_benefits": [
      {
        "card": "The Platinum Card from American Express",
        "benefit_key": "saks",
        "name": "Saks Fifth Avenue Credit",
        "value": 100,
        "frequency": "semi-annual",
        "schedule": "$50 Jan-Jun, $50 Jul-Dec",
        "note": "Your Amex Platinum has a $100 Saks Fifth Avenue Credit (semi-annual)."
      }
    ],
    "earning_recommendation": {
      "best_card": "The Platinum Card from American Express",
      "multiplier": "1x",
      "note": "Saks codes as shopping — use Amex Platinum to combine with the credit."
    }
  },
  "metadata": {...}
}

GET /card-benefits

Get all credits, benefits, and rewards multipliers for a specific card. Returns structured data with value, frequency, schedule, and conditions for each credit.

FieldTypeRequiredDescription
cardstring (query param)YesCard name (e.g. "Amex Platinum", "Chase Sapphire Reserve")
Request
GET /api/v1/card-benefits?card=Amex%20Platinum
Response
{
  "success": true,
  "data": {
    "card": "The Platinum Card from American Express",
    "issuer": "American Express",
    "annual_fee": 695,
    "credits": [
      {
        "benefit_key": "uber",
        "name": "Uber Cash",
        "value": 200,
        "frequency": "monthly",
        "schedule": "$15/mo + $20 Dec"
      },
      {
        "benefit_key": "saks",
        "name": "Saks Fifth Avenue Credit",
        "value": 100,
        "frequency": "semi-annual"
      },
      ...
    ],
    "total_credit_value": 1584,
    "rewards_multipliers": {
      "airlines": 5,
      "hotels": 5,
      "base": 1
    },
    "points_program": "amex_mr",
    "portal_cpp": 1.1
  },
  "metadata": {...}
}

GET /benefit-categories

Returns the benefit key registry — all valid keys for benefit_selections, grouped by category. No authentication required. Use this to discover which keys to pass in portfolio and renewal requests.

Response
{
  "categories": [
    {
      "category": "dining_credit",
      "label": "Dining Credits",
      "keys": ["dining", "resy_dining"]
    },
    {
      "category": "lounge_access",
      "label": "Lounge Access",
      "keys": ["admirals_club", "united_club_membership"]
    },
    {
      "category": "other",
      "label": "Other Benefits",
      "keys": ["uber", "global_entry", "clear_plus", "lyft", ...]
    },
    ...
  ],
  "all_keys": ["admirals_club", "airline_fee", "avis_budget", ...],
  "usage": {
    "benefit_selections": "Pass individual keys to portfolio/analyze or card/renewal-check...",
    "benefit_categories_used": "Alternative: pass category names instead..."
  }
}
Try all endpoints interactively in Swagger UI →

MCP Server

Already using Claude, Cursor, or another AI client? Connect via MCP instead of REST. The MCP server provides 11 tools and 4 workflow prompts. Prefer traditional HTTP? See the REST API.

MCP calls count against the same monthly quota as REST API calls.

Available Tools

KoKo exposes 11 tools through MCP. Each tool returns structured JSON data that AI assistants can interpret and present to users.

search_credit_cards

Search for credit cards using natural language. Supports queries like "best travel card under $200 annual fee" or "cashback card for groceries."

ParameterTypeRequiredDescription
querystringYesNatural language search query
max_resultsintegerNoMax cards to return (1-10, default 5)

compare_cards

Compare 2-3 credit cards side by side with fees, rewards, net value, and break-even analysis (<100ms).

ParameterTypeRequiredDescription
card_nameslist[string]Yes2-3 card names to compare
monthly_spendingobjectNoMonthly spend by category, e.g. {"dining": 500, "travel": 300}

get_card_details

Get comprehensive details about a specific credit card including annual fee, rewards structure, benefits, welcome bonus, and application URL.

ParameterTypeRequiredDescription
card_namestringYesCard name (partial names work, e.g. "Sapphire Preferred")
issuerstringNoIssuer name to narrow results (e.g. "Chase")

calculate_card_value

Calculate the financial value and break-even point of a credit card based on your spending. Uses conservative calculation assumptions included in the response under the assumptions key.

ParameterTypeRequiredDescription
annual_spendingnumberYesTotal annual spending on this card ($)
annual_feenumberYesCard's annual fee ($)
sign_on_bonusnumberNoSign-on bonus amount (default 0)
sign_on_bonus_typestringNo"points", "cash", or "multiplier" (default "points")

create_mcp_session

Create a session for tracking your credit card analysis across multiple tool calls.

ParameterTypeRequiredDescription
No parameters required

optimize_portfolio

Analyze your credit card portfolio with health score, net value, and KEEP/OPTIMIZE/CANCEL verdicts for each card (<100ms).

ParameterTypeRequiredDescription
card_nameslist[string]YesList of credit card names you own
monthly_spendingobjectNoMonthly spending by category ($)
point_balanceslist[object]NoPoints/miles balances: [{"program": "chase_ur", "balance": 80000}, ...]
benefit_selectionslist[string]NoBenefit keys you use: ["uber", "dining", "admirals_club"]. Use GET /benefit-categories for valid keys.
session_idstringNoSession ID from create_mcp_session

check_card_renewal

Check whether to renew a credit card when the annual fee comes due. Returns a RENEW, DOWNGRADE, or CANCEL_AND_REPLACE verdict with downgrade options and replacement suggestions.

ParameterTypeRequiredDescription
card_namestringYesThe card to evaluate (e.g. "Chase Sapphire Reserve")
monthly_spendingobjectNoMonthly spending by category ($)
other_cardslist[string]NoOther cards you own for portfolio context
benefit_selectionslist[string]NoBenefit keys you use: ["uber", "dining", "admirals_club"]. Use GET /benefit-categories for valid keys.
benefit_categories_usedlist[string]NoAlternative: category names instead of individual keys
session_idstringNoSession ID from create_mcp_session

recommend_card_for_category

Recommend which card from your portfolio to use for a specific spending category, ranked by reward value (<100ms).

ParameterTypeRequiredDescription
card_nameslist[string]YesList of credit card names you own
categorystringYesOne of: groceries, dining, travel, gas, online_shopping, everything_else
amountnumberNoPurchase amount in dollars (default $100)
session_idstringNoSession ID from create_mcp_session

which_card_at_merchant

Find the best card from your portfolio for a purchase at a specific merchant. Auto-detects the spending category from the merchant name (e.g. Starbucks → dining). Deterministic for 350+ known merchants; uses AI fallback for unknown merchants.

ParameterTypeRequiredDescription
merchantstringYesMerchant name (e.g. "Starbucks", "Saks Fifth Avenue")
amountnumberNoPurchase amount in dollars (default $100)
card_nameslist[string]YesCard names in your portfolio

check_merchant_benefits

Check if any cards in your portfolio have credits or benefits at a specific merchant. Returns matching credits with value, frequency, and schedule, plus an earning recommendation.

ParameterTypeRequiredDescription
merchantstringYesMerchant name (e.g. "Saks Fifth Avenue", "Uber")
card_nameslist[string]YesCard names in your portfolio

get_card_benefits

Get all credits, benefits, and rewards multipliers for a specific card. Returns structured data with value, frequency, schedule, and conditions for each credit.

ParameterTypeRequiredDescription
card_namestringYesCard name (e.g. "Amex Platinum", "Amex Gold")

MCP Prompts

4 pre-built workflow templates that guide your AI assistant through common credit card tasks.

portfolio-review

Analyze your credit card portfolio with health score, card-by-card verdicts (KEEP/OPTIMIZE/CANCEL), and optimization strategies.

ParameterTypeRequiredDescription
card_namesstringYesComma-separated list of card names you own
monthly_spendingstringNoMonthly spending by category, e.g. "dining: 500, groceries: 400"

which-card

Find out which card from your wallet to use for a specific purchase or spending category to maximize your rewards.

ParameterTypeRequiredDescription
card_namesstringYesComma-separated list of card names you own
categorystringYesOne of: groceries, dining, travel, gas, online_shopping, everything_else
amountstringNoPurchase amount in dollars (default $100)

new-card-finder

Find the best new credit card based on your spending habits, fee tolerance, and credit score.

ParameterTypeRequiredDescription
spending_focusstringYesYour primary spending category (e.g. "travel and dining")
annual_fee_limitstringNoMaximum annual fee you'd consider (default "no limit")
credit_scorestringNoYour credit score range (e.g. "good", "excellent")

renewal-check

Check whether to renew a credit card when the annual fee comes due. Get a RENEW, DOWNGRADE, or CANCEL_AND_REPLACE verdict with value analysis and retention tips.

ParameterTypeRequiredDescription
card_namestringYesThe card to evaluate (e.g. "Chase Sapphire Reserve")
monthly_spendingstringNoMonthly spending by category, e.g. "dining: 500, groceries: 400"
other_cardsstringNoComma-separated list of other cards you own

How to Connect

Claude Desktop

Go to Settings → Connectors and add a new MCP server with this URL:

https://kokofinance.net/mcp

Click Connect — a browser window will open for Google sign-in. Once authenticated, KoKo tools are available in your conversations.

Claude Code (CLI)

Add KoKo as an MCP server with a single command:

claude mcp add --transport http koko-credit-cards https://kokofinance.net/mcp/

Claude Code Plugin

Install the KoKo plugin for Claude Code to get both the MCP tools and an expert credit card advisor skill.

git clone https://github.com/KokoFinance/koko-credit-card-plugin.git
claude --plugin-dir ./koko-credit-card-plugin

See the plugin repository for details.

Cursor, Cline & Other AI Assistants

If your AI assistant supports MCP servers, configure it with:

Endpoint:  https://kokofinance.net/mcp/
Transport: Streamable HTTP
Protocol:  MCP 2025-03-26

Direct HTTP (JSON-RPC)

Send MCP JSON-RPC requests directly via HTTP POST:

curl -X POST \
  https://kokofinance.net/mcp/ \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "initialize",
    "params": {
      "protocolVersion": "2025-03-26",
      "capabilities": {},
      "clientInfo": {"name": "MyApp", "version": "1.0"}
    }
  }'

MCP Authentication

KoKo's MCP server uses OAuth 2.0 (Google) for authentication. MCP-compatible clients like Claude.ai and Claude Desktop handle the OAuth flow automatically — you'll be prompted to sign in with Google when you first connect.

OAuth Discovery

For programmatic clients, the OAuth authorization server metadata is available at:

GET https://kokofinance.net/mcp/.well-known/oauth-authorization-server

Auto-Discovery

KoKo supports the MCP auto-discovery standard. AI clients can find our server configuration at:

GET https://kokofinance.net/.well-known/mcp.json

API Key Authentication (for Usage Tracking)

If you have a Koko API key, you can optionally pass it via the X-API-Key header in your MCP transport configuration. MCP calls made with an API key count against your monthly tier quota (same pool as REST API calls).

Without an API key, MCP access continues to work via OAuth with no quota enforcement.

Claude Desktop Configuration

{
  "mcpServers": {
    "koko-finance": {
      "url": "https://kokofinance.net/mcp/",
      "headers": {
        "X-API-Key": "koko_your_api_key_here"
      }
    }
  }
}

Claude Code CLI

claude mcp add --transport http \
  --header "X-API-Key: koko_your_api_key_here" \
  koko-credit-cards https://kokofinance.net/mcp/

When you hit your monthly limit, MCP tool responses will include an error with a link to upgrade. Check your usage at any time with GET /api/v1/usage.

Troubleshooting

OAuth / Authentication Errors

SymptomSolution
"Please check your server URL and make sure your server handles auth correctly" Verify you're using https://kokofinance.net/mcp (no trailing slash). Remove and re-add the server in Settings → Connectors.
Google sign-in window doesn't appear Check your browser's pop-up blocker. The OAuth flow opens a new window for Google sign-in.
Previously connected but now getting auth errors OAuth tokens may have expired. Remove the server from Connectors and re-add it to re-authenticate.

Tool Errors

SymptomSolution
"Card not found" for a card you know exists Try using the full card name with issuer, e.g. "Chase Sapphire Preferred" instead of just "Sapphire Preferred".
Tool call times out Some tools query external data sources and may take a few seconds. If the issue persists, the server may be cold-starting (~10 seconds).

Verifying Server Status

# Check server health
curl https://kokofinance.net/health

# Check MCP auto-discovery
curl https://kokofinance.net/.well-known/mcp.json

# Check REST API health
curl https://kokofinance.net/api/v1/health

Python SDK

A lightweight Python client for the REST API with typed exceptions and clean error handling.

pip install koko-finance
from koko_finance import KokoClient

client = KokoClient(api_key="YOUR_API_KEY")

# Analyze your credit card portfolio
analysis = client.analyze_portfolio(
    cards=[
        {"card_name": "Chase Sapphire Preferred", "annual_fee": 95},
        {"card_name": "American Express Gold Card", "annual_fee": 250},
        {"card_name": "Citi Double Cash", "annual_fee": 0},
    ],
    spending={"dining": 500, "travel": 300, "groceries": 600, "gas": 150},
    primary_goal="travel",
)

# Compare two cards head-to-head
comparison = client.compare_cards(
    cards=[
        {"card_name": "Chase Sapphire Preferred", "annual_fee": 95},
        {"card_name": "Capital One Venture X", "annual_fee": 395},
    ],
    spending={"dining": 400, "travel": 500},
    primary_goal="travel",
)

# Get recommendation for a spending category
recs = client.recommend_card(
    category="dining",
    spending={"dining": 600},
    credit_tier="excellent",
)

# Check if a card is worth renewing
renewal = client.check_renewal(
    card={"card_name": "Chase Sapphire Preferred", "annual_fee": 95},
    spending={"dining": 400, "travel": 300},
)

# Merchant Intelligence: best card at a merchant
best = client.which_card_at_merchant(
    merchant="Starbucks",
    amount=35,
    portfolio=["Chase Sapphire Reserve", "Amex Gold", "Citi Double Cash"],
)

# Check card credits at a merchant
benefits = client.merchant_benefits(
    merchant="Saks Fifth Avenue",
    portfolio=["Amex Platinum", "Chase Sapphire Reserve"],
)

# Get all credits/benefits for a card
card_info = client.card_benefits(card="Amex Platinum")
GitHub Repository →

Rate Limits & Errors

Rate Limits

All authenticated endpoints are rate-limited. Current limits:

TierRate LimitMonthly Calls
Free60 requests/minute2,000
Pro60 requests/minute30,000

Rate limit headers are included in every response:

HeaderDescription
X-RateLimit-LimitRequests allowed per minute
X-RateLimit-RemainingRequests remaining in current window
X-RateLimit-ResetSeconds until the rate limit window resets
Retry-AfterSeconds to wait before retrying (only on 429)

View pricing and rate limits →

Error Response Format

All errors follow the same envelope format:

{
  "detail": {
    "error": "rate_limit_exceeded",
    "message": "Rate limit: 60 requests/minute"
  }
}

Common Error Codes

StatusErrorDescription
401missing_api_keyNo API key provided in request headers
401invalid_api_keyThe API key is not recognized
401api_key_revokedThe API key has been deactivated
422Validation errorRequest body doesn't match expected schema
429rate_limit_exceededToo many requests — check Retry-After header
500Internal server errorSomething went wrong on our end