Work with this as data
Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/gvnr-dev:gvnr-dev-rate-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
OpenAPI Specification
openapi: 3.2.0
info:
title: Gvnr Rate API
version: 1.8.1
description: Budget & cost control for AI agents — per-agent spend caps, rate limits, idempotency, post-call reconciliation, and human approval bridges, enforced before each call.
servers:
- url: https://gvnr.dev
tags:
- name: Rate
paths:
/v1/rate/envelope:
put:
summary: Create or update a rate-limit envelope per (agent, provider, model)
security:
- bearerAuth: []
requestBody:
content:
application/json:
schema:
type: object
required:
- agent_id
- provider
- model
- requests_per_minute
properties:
agent_id:
type: string
maxLength: 128
provider:
type: string
maxLength: 64
description: Informational, e.g. "anthropic", "openai", "bedrock"
model:
type: string
maxLength: 128
description: Model identifier, e.g. "claude-sonnet-4-6"
requests_per_minute:
type: integer
minimum: 1
maximum: 1000000
description: Cap per fixed 60-second window (not sliding)
responses:
'200':
description: Envelope created or updated
content:
application/json:
schema:
type: object
required:
- success
- agent_id
- provider
- model
- requests_per_minute
properties:
success:
type: boolean
enum:
- true
agent_id:
type: string
provider:
type: string
model:
type: string
requests_per_minute:
type: integer
default:
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
tags:
- Rate
operationId: putV1RateEnvelope
x-operation-id-source: derived
/v1/rate/envelope/{agent_id}/{provider}/{model}:
get:
summary: Read current rate envelope state
security:
- bearerAuth: []
parameters:
- name: agent_id
in: path
required: true
schema:
type: string
- name: provider
in: path
required: true
schema:
type: string
- name: model
in: path
required: true
schema:
type: string
responses:
'200':
description: Current rate envelope record with live window state
content:
application/json:
schema:
type: object
required:
- agent_id
- provider
- model
- requests_per_minute
- requests_in_window
- window_start
properties:
agent_id:
type: string
provider:
type: string
model:
type: string
requests_per_minute:
type: integer
requests_in_window:
type: integer
description: Count consumed in the current 60s window
window_start:
type: integer
description: Unix ms when the current window opened
'404':
description: Envelope not found for this triple
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
default:
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
tags:
- Rate
operationId: getV1RateEnvelopeByAgentIdByProviderByModel
x-operation-id-source: derived
delete:
summary: Delete a rate envelope
security:
- bearerAuth: []
parameters:
- name: agent_id
in: path
required: true
schema:
type: string
- name: provider
in: path
required: true
schema:
type: string
- name: model
in: path
required: true
schema:
type: string
responses:
'200':
description: Envelope deleted
content:
application/json:
schema:
type: object
required:
- success
- agent_id
- provider
- model
properties:
success:
type: boolean
enum:
- true
agent_id:
type: string
provider:
type: string
model:
type: string
'404':
description: Envelope not found for this triple
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
default:
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
tags:
- Rate
operationId: deleteV1RateEnvelopeByAgentIdByProviderByModel
x-operation-id-source: derived
/v1/rate/check:
post:
summary: Runtime rate check — returns allowed=true with remaining count, or…
security:
- bearerAuth: []
requestBody:
content:
application/json:
schema:
type: object
required:
- agent_id
- provider
- model
properties:
agent_id:
type: string
maxLength: 128
provider:
type: string
model:
type: string
responses:
'200':
description: Rate check result — always 200; check `allowed` field. On allow, the counter is incremented as a side effect
content:
application/json:
schema:
oneOf:
- type: object
required:
- allowed
- requests_remaining_this_minute
properties:
allowed:
type: boolean
enum:
- true
requests_remaining_this_minute:
type: integer
description: Capacity left after counting this request
- type: object
required:
- allowed
- reason
properties:
allowed:
type: boolean
enum:
- false
reason:
type: string
enum:
- no_rate_envelope
- rate_exceeded
retry_after_ms:
type: integer
description: Present only when reason="rate_exceeded"; ms until window resets
default:
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
tags:
- Rate
operationId: postV1RateCheck
x-operation-id-source: derived
components:
schemas:
ErrorResponse:
type: object
required:
- error
properties:
error:
type: string
description: Stable machine-readable error code (e.g. "invalid_params", "rate_limited", "not_found")
required:
type: array
items:
type: string
description: Names/descriptors of required fields when error is "invalid_params"
hint:
type: string
description: Human-readable guidance for resolving the error
detail:
type: string
description: Additional context for the error
valid:
type: array
items:
type: string
description: Allowed values when input was rejected as out-of-set
valid_channels:
type: array
items:
type: string
description: Allowed notification channels (for approval requests)
retryable:
type: boolean
description: Whether retrying the same request can succeed. false = fix input / auth / config first, or terminal. Omitted when retryability is already implied by required/valid (fix the input) or retry_after_ms (wait, then retry).
retry_after_ms:
type: integer
description: Milliseconds to wait before retrying — present on rate_limited (429). Matches the runtime rate_check field.
limit:
type: string
description: Description of the limit that was hit
securitySchemes:
bearerAuth:
type: http
scheme: bearer
description: API key from POST /v1/account