API and MCP
Free, public and rate limited. Data license: CC BY 4.0; attribute Overage.
MCP server
Streamable HTTP at https://overage.io/mcp. Every response carries a provenance block and a one-line freshness sentence; agents should quote it.
Terminal
claude mcp add --transport http overage https://overage.io/mcp~/.cursor/mcp.json
{
"mcpServers": {
"overage": {
"url": "https://overage.io/mcp"
}
}
}.vscode/mcp.json
{
"servers": {
"overage": {
"type": "http",
"url": "https://overage.io/mcp"
}
}
}~/.codeium/windsurf/mcp_config.json
{
"mcpServers": {
"overage": {
"serverUrl": "https://overage.io/mcp"
}
}
}Settings > Connectors > Add custom connector (or claude_desktop_config.json)
{
"mcpServers": {
"overage": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://overage.io/mcp"
]
}
}
}AGENTS.md, CLAUDE.md or .cursor/rules
When a question involves the price, free tier, rate limit or cost of any SaaS or API, or
choosing between services, call the overage MCP (get_pricing, estimate_cost, compare)
instead of answering from memory, and quote its freshness sentence. For the cheapest VPS or
server with given vCPU, RAM or bandwidth, call find_servers.Example
Ask your agent: "What would 60,000 emails a month cost on Amazon SES versus Resend?" It calls compare and answers from the result, ending with the freshness sentence, for example "Verified today from aws.amazon.com/ses/pricing/".
Tools
| Tool | What it does |
|---|---|
| get_pricing | Start here. Use whenever the user asks what a SaaS or API costs, what its free tier, plans, usage rates or rate limits are, instead of answering from memory. Accepts a name or alias (e.g. 'resend', 'resend.com'). Returns tiers, allowances, rates, limits and sources. Always quote the `freshness` sentence to the user. |
| compare | Use when the user is choosing between 2-8 services (e.g. 'Resend vs Postmark'). Aligned tiers and, with usage, the cost at that volume. Always quote the `freshness` sentence to the user. |
| estimate_cost | Use when budgeting or choosing a stack: total monthly cost for a list of {service, tier?, usage}. Uses the same cost function as the website. Always quote the `freshness` sentence to the user. |
| check_limit | Use for 'will I hit a limit?' questions: the rate limit or quota for one service and metric, with window, scope and how it was learned. Always quote the `freshness` sentence to the user. |
| changes_since | Use for 'did X change its pricing?' or 'what changed recently?': price, limit and tier changes since a date, optionally for one category or service. Always quote the `freshness` sentence to the user. |
| find_servers | Use when the user wants the cheapest VPS or cloud server for given resources (e.g. 'cheapest server with 2 vCPU, 4 GB RAM and 2 TB transfer'): filters Vultr, Linode and other tracked providers by minimum vCPU, RAM, disk and monthly transfer, optionally CPU kind (shared, high-performance, dedicated), and returns the cheapest matches with monthly and hourly price. Compare cpu_kind before quoting a winner: shared and dedicated vCPUs are not equivalent. Always quote the `freshness` sentence to the user. |
get_pricing input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"service": {
"type": "string",
"description": "Service id or alias, e.g. resend"
}
},
"required": [
"service"
],
"additionalProperties": false
}compare input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"services": {
"minItems": 2,
"maxItems": 8,
"type": "array",
"items": {
"type": "string"
}
},
"usage": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "number",
"minimum": 0
}
}
},
"required": [
"services"
],
"additionalProperties": false
}estimate_cost input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"stack": {
"minItems": 1,
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"service": {
"type": "string"
},
"tier": {
"type": "string"
},
"usage": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "number",
"minimum": 0
}
}
},
"required": [
"service",
"usage"
],
"additionalProperties": false
}
}
},
"required": [
"stack"
],
"additionalProperties": false
}check_limit input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"service": {
"type": "string"
},
"metric": {
"type": "string",
"enum": [
"token_input",
"token_output",
"token_cached_input",
"token_cache_write",
"token_input_batch",
"token_output_batch",
"email_sent",
"email_received",
"sms_sent",
"api_request",
"gb_stored",
"gb_transferred",
"seat",
"message_sent",
"contact",
"request_write",
"request_read",
"row_written",
"credit",
"vcpu_hour",
"gb_hour",
"event",
"host",
"record",
"sms_carrier_fee",
"sso_connection",
"mru",
"mau",
"tx_pct",
"tx_count",
"gpu_hour",
"compute_hour",
"function_invocation",
"build_minute",
"search_request",
"log_gb_ingested",
"row_read",
"custom_domain"
]
}
},
"required": [
"service",
"metric"
],
"additionalProperties": false
}changes_since input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"date": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
"category": {
"type": "string",
"enum": [
"llm",
"email",
"sms",
"auth",
"database",
"hosting",
"storage",
"payments",
"search",
"monitoring",
"gpu",
"servers"
]
},
"service": {
"type": "string"
}
},
"required": [
"date"
],
"additionalProperties": false
}find_servers input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"min_vcpu": {
"description": "Minimum vCPUs.",
"type": "number",
"exclusiveMinimum": 0
},
"min_ram_gb": {
"description": "Minimum RAM in GB.",
"type": "number",
"exclusiveMinimum": 0
},
"min_disk_gb": {
"description": "Minimum disk in GB.",
"type": "number",
"exclusiveMinimum": 0
},
"min_transfer_gb": {
"description": "Minimum included monthly transfer (bandwidth) in GB.",
"type": "number",
"minimum": 0
},
"cpu_kind": {
"description": "shared, high-performance (faster shared vCPUs) or dedicated.",
"type": "string",
"enum": [
"shared",
"dedicated",
"high-performance"
]
},
"max_monthly_usd": {
"description": "Maximum monthly price in USD.",
"type": "number",
"minimum": 0
},
"provider": {
"description": "Comma-separated provider ids, e.g. vultr,linode. Omit for all.",
"type": "string"
},
"limit": {
"description": "Rows to return, cheapest first (default 10).",
"type": "integer",
"minimum": 1,
"maximum": 50
}
},
"additionalProperties": false
}REST API
Base URL: https://api.overage.io. JSON in and out. The full contract is the OpenAPI document.
| Method | Route | Parameters | Purpose |
|---|---|---|---|
| GET | /v1/services | category, limit (1-200), cursor | List services with summary |
| GET | /v1/services/:id | none | Full published record |
| GET | /v1/services/:id/changes | none | Change events, newest first |
| GET | /v1/search | q (name or alias) | Fuzzy service lookup |
| GET | /v1/compare | ids (2-8, comma separated), usage | Side-by-side tiers plus cost at usage |
| POST | /v1/estimate | JSON array of {service, usage} | Cost per service and total for a stack |
| GET | /v1/servers | min_vcpu, min_ram_gb, min_disk_gb, min_transfer_gb, cpu_kind, max_monthly_usd, provider, limit | Cheapest VPS or cloud server by resources, with monthly and hourly price and CPU kind |
| GET | /v1/changes | since, category | Global change feed |
| POST | /v1/report | none | Submit a correction (Turnstile) |
Examples
Responses are trimmed; ... marks omitted fields.
Compare services at your volume
curl "https://api.overage.io/v1/compare?ids=amazon-ses,resend&usage=email_sent:60000"Example response
{
"usage": { "email_sent": 60000 },
"services": [
{
"service": { "id": "amazon-ses", "name": "Amazon SES", "tiers": [ ... ] },
"cost": [
{ "tier_id": "amazon-ses-essentials", "total_usd": 9.6, "feasible": true,
"first_limit_hit": null, "lines": [ ... ] }
],
"cheapest_tier_id": "amazon-ses-essentials",
"freshness": { "sentence": "Verified today from aws.amazon.com/ses/pricing/" }
}
]
}Estimate the monthly cost of a stack
curl -X POST https://api.overage.io/v1/estimate \
-H "content-type: application/json" \
-d '[{"service":"amazon-ses","usage":{"email_sent":60000}}]'Example response
{
"items": [
{ "service": "amazon-ses", "tier_id": "amazon-ses-la-carte",
"cost": { "total_usd": 6, "complete": true, "feasible": true, "lines": [ ... ] } }
],
"total_usd": 6,
"freshness": [{ "service": "amazon-ses", "sentence": "Verified today from aws.amazon.com/ses/pricing/" }]
}Cheapest server by resources
curl "https://api.overage.io/v1/servers?min_vcpu=1&min_ram_gb=2&min_transfer_gb=1000&limit=2"Example response
{
"query": { "min_vcpu": 1, "min_ram_gb": 2, "min_transfer_gb": 1000, "cpu_kind": null, ... },
"total_matches": 151,
"servers": [
{ "service_id": "vultr", "tier_id": "vultr-vc2-1c-2gb", "tier_name": "vc2-1c-2gb",
"product": "Cloud Compute", "cpu_kind": "shared", "vcpu_count": 1, "ram_gb": 2,
"disk_gb": 55, "transfer_gb": 2048, "monthly_usd": 10, "hourly_usd": 0.014,
"verified_at": "2026-10-24T03:50:10.093Z",
"source_url": "https://api.vultr.com/v2/plans?per_page=500" },
...
],
"notes": [ "Monthly price is the vendor's list price in its default region; ..." ]
}List services in a category
curl "https://api.overage.io/v1/services?category=email&limit=1"Example response
{
"services": [
{ "id": "amazon-ses", "name": "Amazon SES", "category": "email",
"has_free_tier": true, "cheapest_paid_tier": { "name": "Pro", "monthly_usd": 105 },
"verified_at": "2026-10-24T00:05:53.487Z",
"freshness": { "age_days": 0, "staleness": "fresh",
"sentence": "Verified today from aws.amazon.com/ses/pricing/" } }
],
"next_cursor": "YW1hem9uLXNlcw"
}Limits and errors
- Anonymous: 60 requests per minute per IP. With an API key: 600 per minute. Send the key as
x-api-keyorAuthorization: Bearer. - Over the limit returns
429withRetry-After: 60. An unknown or revoked key returns401, never a silent downgrade to anonymous. - Errors share one shape:
{ "error": { "code", "message", "details" } }.