Skip to content

Plans

The plans endpoint exposes Chronary’s pricing and enforcement caps as machine-readable data. Agents can use it to discover current tier limits, surface upgrade paths, or render their own pricing UIs without hardcoding values that may drift.

GET /v1/plans

No authentication required. The response is cacheable at the edge (Cache-Control: public, max-age=300, s-maxage=3600, stale-while-revalidate=86400) and carries an ETag for 304 conditional requests. The endpoint is IP-rate-limited.

{
"plans": [
{
"id": "free",
"name": "Free",
"tagline": "For prototyping and small agents",
"price": 0,
"currency": "usd",
"limits": {
"agents": 3,
"calendars": 10,
"events": 2500,
"api_calls": 50000,
"webhook_deliveries": 5000,
"availability_queries": 10000,
"ical_subscriptions": 5,
"proposals": 0
},
"display_features": ["3 agents", "10 calendars", "2,500 events/month", "50,000 API calls/month", "5,000 webhook deliveries", "5 iCal subscriptions", "3-day audit log history", "Community support"],
"recommended": false
},
{
"id": "pro",
"name": "Pro",
"tagline": "For production agent workflows",
"price": 2900,
"currency": "usd",
"limits": {
"agents": 50,
"calendars": 250,
"events": 125000,
"api_calls": 1000000,
"webhook_deliveries": 250000,
"availability_queries": 1000000,
"ical_subscriptions": 100,
"proposals": null
},
"display_features": ["Everything in Free, plus:", "Scheduling proposals & temporal holds", "Cross-agent availability", "50 per-agent API keys", "90-day audit log history", "50 agents", "250 calendars", "125,000 events/month", "1,000,000 API calls/month", "Email support"],
"recommended": true
},
{
"id": "custom",
"name": "Custom",
"tagline": "For multi-agent platforms and enterprise",
"price": null,
"currency": null,
"limits": null,
"display_features": ["Custom volume limits", "Custom rate limits and webhook retries", "Custom audit log retention", "Dedicated support engineer", "Invoice billing", "Security reviews"],
"recommended": false,
"custom_pricing": true,
"contact_url": "https://chronary.ai/contact"
}
]
}

| Field | Type | Description | |-------|------|-------------| | id | enum | Plan identifier: free, pro, or custom | | name | string | Display name | | tagline | string | One-line summary | | price | integer | null | Recurring monthly amount in the smallest currency unit (e.g. USD cents). null for the custom-priced tier. Never a float. | | currency | string | null | Lowercase ISO-4217 code. null for the custom-priced tier. | | limits | object | null | Enforced caps. null fields inside the object mean unlimited; a null object (custom) means quotas are negotiated separately. | | display_features | string[] | Marketing copy — do not parse for capability checks. Use limits instead. | | recommended | boolean | Hint for UIs to visually highlight the default/popular tier (currently pro). | | custom_pricing | boolean? | Present and true on the custom tier. | | contact_url | string? | Sales contact URL for the custom-priced tier. |

Internal signup-state tiers (free-agent, free-agent-unverified) are not returned — they’re enforcement states, not purchasable products.

Terminal window
curl https://api.chronary.ai/v1/plans

Every authenticated response emits two headers per draft-ietf-httpapi-ratelimit-headers-09:

RateLimit-Policy: "quota";q=1000000;w=2592000;pk=org_abc123
RateLimit: "quota";r=985477;t=187200
  • q — monthly quota limit
  • w — window size in seconds (~30 days)
  • pk — partition key (your org identifier)
  • r — requests remaining
  • t — seconds until quota reset (delta-seconds, clock-skew safe)

On 429 responses, Retry-After is also set to the same delta-seconds value. These headers replace the informal X- prefixed patterns deprecated by RFC 6648.

The public /v1/plans endpoint does not emit RateLimit headers — only authenticated routes do.