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.
https://kokofinance.net/api/v1
https://kokofinance.net/mcp/
Getting Started
Try the API in 60 seconds.
Get API Key — FreeGet an API Key
Sign up to get your free API key instantly (2,000 calls/month). Get your API key →
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"
}
}'
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
Fast vs Verbose Endpoints
Three endpoints offer both a fast (default) and verbose variant:
| Endpoint | Fast (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.
| Field | Type | Required | Description |
|---|---|---|---|
cards | array | Yes | 1-10 cards, each with card_name and optional annual_fee |
params.spending | object | No | Monthly spending by category (dining, travel, groceries, gas, streaming, shopping, other) |
params.primary_goal | string | No | travel, cashback, build_credit, business, or balance_transfer |
params.credit_tier | string | No | poor, fair, good, or excellent |
params.issuer_preferences | array | No | Boost/de-boost issuers, e.g. [{"issuer": "Chase", "weight": 1.5}] |
params.point_balances | array | No | Your rewards balances, e.g. [{"program": "chase_ur", "balance": 150000}]. Enriches analysis with redemption context. |
params.benefit_selections | array | No | Individual 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. |
{
"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"]
}
}
{
"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.
| Field | Type | Required | Description |
|---|---|---|---|
card_names | array[string] | Yes | 2-3 card names to compare |
params.spending | object | No | Monthly spending by category |
params.primary_goal | string | No | Optimization goal |
{
"card_names": [
"Chase Sapphire Preferred",
"Capital One Venture X"
],
"params": {
"spending": {"dining": 400, "travel": 500, "groceries": 300},
"primary_goal": "travel"
}
}
{
"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).
| Field | Type | Required | Description |
|---|---|---|---|
category | string | Yes | Spending category: dining, travel, groceries, gas, etc. |
portfolio_card_names | array[string] | No | If provided, recommend from portfolio instead of market |
params.spending | object | No | Monthly spending by category |
params.credit_tier | string | No | Filter by credit tier |
params.primary_goal | string | No | Optimization goal |
{
"category": "dining",
"params": {
"spending": {"dining": 600, "groceries": 400},
"credit_tier": "excellent",
"primary_goal": "cashback"
}
}
{
"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.
| Field | Type | Required | Description |
|---|---|---|---|
card_name | string | Yes | Name of the card to check |
params.spending | object | No | Monthly spending by category |
params.primary_goal | string | No | Optimization goal |
benefit_selections | array | No | Benefit keys the user actually uses (e.g. ["uber", "airline_fee", "dining"]). Selected benefits count at 100%; unselected at 0%. |
{
"card_name": "Chase Sapphire Preferred",
"params": {
"spending": {
"dining": 400, "travel": 300, "groceries": 500
},
"primary_goal": "travel"
},
"benefit_selections": ["dining", "travel"]
}
{
"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.
| Field | Type | Required | Description |
|---|---|---|---|
merchant | string | Yes | Merchant name (e.g. "Starbucks", "Saks Fifth Avenue", "Delta Air Lines") |
amount | number | No | Purchase amount in dollars (default 100) |
portfolio | array[string] | Yes | Card names in your portfolio |
{
"merchant": "Starbucks",
"amount": 35,
"portfolio": [
"Chase Sapphire Reserve",
"Amex Gold",
"Citi Double Cash"
]
}
{
"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).
| Field | Type | Required | Description |
|---|---|---|---|
merchant | string | Yes | Merchant name (e.g. "Saks Fifth Avenue", "Uber", "Disney+") |
portfolio | array[string] | Yes | Card names in your portfolio |
{
"merchant": "Saks Fifth Avenue",
"portfolio": [
"Amex Platinum",
"Chase Sapphire Reserve"
]
}
{
"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.
| Field | Type | Required | Description |
|---|---|---|---|
card | string (query param) | Yes | Card name (e.g. "Amex Platinum", "Chase Sapphire Reserve") |
GET /api/v1/card-benefits?card=Amex%20Platinum
{
"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.
{
"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..."
}
}
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."
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | Yes | Natural language search query |
max_results | integer | No | Max 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).
| Parameter | Type | Required | Description |
|---|---|---|---|
card_names | list[string] | Yes | 2-3 card names to compare |
monthly_spending | object | No | Monthly 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
card_name | string | Yes | Card name (partial names work, e.g. "Sapphire Preferred") |
issuer | string | No | Issuer 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
annual_spending | number | Yes | Total annual spending on this card ($) |
annual_fee | number | Yes | Card's annual fee ($) |
sign_on_bonus | number | No | Sign-on bonus amount (default 0) |
sign_on_bonus_type | string | No | "points", "cash", or "multiplier" (default "points") |
create_mcp_session
Create a session for tracking your credit card analysis across multiple tool calls.
| Parameter | Type | Required | Description |
|---|---|---|---|
| No parameters required | |||
optimize_portfolio
Analyze your credit card portfolio with health score, net value, and KEEP/OPTIMIZE/CANCEL verdicts for each card (<100ms).
| Parameter | Type | Required | Description |
|---|---|---|---|
card_names | list[string] | Yes | List of credit card names you own |
monthly_spending | object | No | Monthly spending by category ($) |
point_balances | list[object] | No | Points/miles balances: [{"program": "chase_ur", "balance": 80000}, ...] |
benefit_selections | list[string] | No | Benefit keys you use: ["uber", "dining", "admirals_club"]. Use GET /benefit-categories for valid keys. |
session_id | string | No | Session 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
card_name | string | Yes | The card to evaluate (e.g. "Chase Sapphire Reserve") |
monthly_spending | object | No | Monthly spending by category ($) |
other_cards | list[string] | No | Other cards you own for portfolio context |
benefit_selections | list[string] | No | Benefit keys you use: ["uber", "dining", "admirals_club"]. Use GET /benefit-categories for valid keys. |
benefit_categories_used | list[string] | No | Alternative: category names instead of individual keys |
session_id | string | No | Session 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).
| Parameter | Type | Required | Description |
|---|---|---|---|
card_names | list[string] | Yes | List of credit card names you own |
category | string | Yes | One of: groceries, dining, travel, gas, online_shopping, everything_else |
amount | number | No | Purchase amount in dollars (default $100) |
session_id | string | No | Session 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
merchant | string | Yes | Merchant name (e.g. "Starbucks", "Saks Fifth Avenue") |
amount | number | No | Purchase amount in dollars (default $100) |
card_names | list[string] | Yes | Card 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
merchant | string | Yes | Merchant name (e.g. "Saks Fifth Avenue", "Uber") |
card_names | list[string] | Yes | Card 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
card_name | string | Yes | Card 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
card_names | string | Yes | Comma-separated list of card names you own |
monthly_spending | string | No | Monthly 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
card_names | string | Yes | Comma-separated list of card names you own |
category | string | Yes | One of: groceries, dining, travel, gas, online_shopping, everything_else |
amount | string | No | Purchase amount in dollars (default $100) |
new-card-finder
Find the best new credit card based on your spending habits, fee tolerance, and credit score.
| Parameter | Type | Required | Description |
|---|---|---|---|
spending_focus | string | Yes | Your primary spending category (e.g. "travel and dining") |
annual_fee_limit | string | No | Maximum annual fee you'd consider (default "no limit") |
credit_score | string | No | Your 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
card_name | string | Yes | The card to evaluate (e.g. "Chase Sapphire Reserve") |
monthly_spending | string | No | Monthly spending by category, e.g. "dining: 500, groceries: 400" |
other_cards | string | No | Comma-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
| Symptom | Solution |
|---|---|
| "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
| Symptom | Solution |
|---|---|
| "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")
Rate Limits & Errors
Rate Limits
All authenticated endpoints are rate-limited. Current limits:
| Tier | Rate Limit | Monthly Calls |
|---|---|---|
| Free | 60 requests/minute | 2,000 |
| Pro | 60 requests/minute | 30,000 |
Rate limit headers are included in every response:
| Header | Description |
|---|---|
X-RateLimit-Limit | Requests allowed per minute |
X-RateLimit-Remaining | Requests remaining in current window |
X-RateLimit-Reset | Seconds until the rate limit window resets |
Retry-After | Seconds 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
| Status | Error | Description |
|---|---|---|
401 | missing_api_key | No API key provided in request headers |
401 | invalid_api_key | The API key is not recognized |
401 | api_key_revoked | The API key has been deactivated |
422 | Validation error | Request body doesn't match expected schema |
429 | rate_limit_exceeded | Too many requests — check Retry-After header |
500 | Internal server error | Something went wrong on our end |