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.
List plans
Section titled “List plans”GET /v1/plansNo 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.
Response
Section titled “Response”{ "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 reference
Section titled “Field reference”| 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.
Example
Section titled “Example”curl https://api.chronary.ai/v1/plansimport { Chronary } from '@chronary/sdk';
// No api key required for this endpoint.const client = new Chronary();
const { plans } = await client.plans.list();const pro = plans.find((p) => p.id === 'pro');console.log(`Pro tier: $${pro.price / 100}/mo, ${pro.limits.api_calls} API calls`);from chronary import Chronary
client = Chronary(api_key=None) # public endpoint — no key required
result = client.plans.list()pro = next(p for p in result.plans if p.id == "pro")print(f"Pro: ${pro.price / 100}/mo, {pro.limits.api_calls} API calls")chronary plans listRate-limit headers
Section titled “Rate-limit headers”Every authenticated response emits two headers per draft-ietf-httpapi-ratelimit-headers-09:
RateLimit-Policy: "quota";q=1000000;w=2592000;pk=org_abc123RateLimit: "quota";r=985477;t=187200q— monthly quota limitw— window size in seconds (~30 days)pk— partition key (your org identifier)r— requests remainingt— 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.