Plans and tiers
What an enterprise agreement gives you — higher call concurrency, dedicated and customer-hosted deployment, single-jurisdiction residency, a longer verifiable audit window, a negotiated rate card and a named support tier — each grounded in a per-organization setting the platform enforces.
An enterprise agreement with Graine raises the ceilings that actually constrain a production integration, and opens deployment shapes the shared cloud cannot offer. Concretely, it moves seven things: how many calls you can run at once, how you are deployed, where your data is processed, how long your audit trail is kept and exportable, what you pay per minute, how you are billed, and how you are supported.
Each of those is a stored per-organization value, not a code path — which is why a limit can be raised for your account alone, live, and take effect across every worker within a minute, with no release and no restart.
Commercial values — rates, minimum commitments, payment terms and support terms — are quoted per agreement and appear below as Contact sales.
What enterprise adds
| Capability | Shared cloud, standard | Enterprise |
|---|---|---|
| Simultaneous live calls | 100 per organization, 100 per agent, under a shared platform ceiling | Set to your peak, per organization and per agent |
| Batch parallelism | 10 concurrent contacts per batch | Set per organization |
| Reserved capacity | Shares a platform-wide ceiling | Your deployment is the ceiling — with a dedicated instance |
| Deployment model | Multi-tenant cloud we operate | Dedicated instance, or your own compute with our control plane |
| Data residency | Fixed platform regions, not per tenant | Single jurisdiction, chosen at deployment |
| Audit retention | 400 days | Any window from 30 to 3,650 days, set per organization |
| Audit export and verification | Full history over the API, filterable, independently verifiable | Same, across your longer window |
| Rate card | Platform default rates | Contact sales — negotiated, stored against your organization |
| Payment model | Prepaid credits | Contact sales — invoicing and committed spend |
| Support tier | standard | Contact sales — channels, response targets, escalation path, named contact |
Security controls are not a tier dimension
Tenant isolation, scope-based access control on every mutating endpoint, the append-only hash-chained audit log, HMAC-signed webhooks and per-organization rate limiting apply to every organization at every plan level. They are described in Security, not here, because there is no lower setting of them to sell you.
How a plan is applied
There is no plan catalog inside the platform. The organization configuration
document has no plan field — a plan name is a label carried on the API
key, and the only behaviour attached to it is a privilege ladder: a key may
mint a new key on its own plan or a lower one, never a higher one. What governs
your account is the set of per-organization values in this page, each
independently adjustable.
That is an advantage in a negotiation rather than a gap. The honest answer to "what does Enterprise include?" is "these dimensions, set to what you need," and any one of them can be changed for your organization alone without waiting for a release.
Read your own account's settings at any time:
That single response is the authoritative statement of your tier.
Concurrency
The most consequential dimension: how many calls your organization may have in flight simultaneously. It is enforced by an atomic governor before every dial, not reconciled afterwards, so the limit is a real ceiling rather than a reporting threshold.
| Setting | Default | Governs |
|---|---|---|
concurrency_limits.total_system | 100, seeded on organization creation | Simultaneous live calls across the whole organization |
concurrency_limits.per_agent | 100, seeded on organization creation | Simultaneous live calls for any single agent |
concurrency_limits.batch_size | 10, seeded on organization creation | Parallelism within one batch |
| Platform ceiling | 1,000 | Shared ceiling above your organization's limit |
Your effective limit is the lower of the organization and per-agent values,
which is why /v2/user/me reports both. The per-agent level only gates when it
sits below the organization limit; above it, the value is tracking-only.
The first three levels are atomic counters in Redis incremented by a single Lua check-and-increment, so two workers cannot both take the last slot. Limits are read from the organization configuration and cached for 60 seconds — which is what makes "raise us to 400 lines for tomorrow's campaign" a configuration change rather than a deployment.
| Standard | Enterprise | |
|---|---|---|
| Organization concurrency | 100, raised on request | Contact sales — set to your peak |
| Per-agent concurrency | 100 | Contact sales |
| Batch parallelism | 10 | Contact sales |
| Time to change a limit | Under a minute, no redeploy | Under a minute, no redeploy |
| Capacity isolated from the shared platform ceiling | Not offered | Available with a dedicated deployment — Contact sales |
Exhausting concurrency is not something you have to infer. The call request is
refused with a specific code, and the response carries Retry-After:
When the live counts cannot be read the message degrades to Account concurrency limit reached; all lines are in use. — the code stays 1300 either
way, which is what you branch on.
Two behaviours to plan around
Enforcement is itself a per-organization flag
(features.concurrency_management_enabled). When it is disabled, counters still
increment for observability but nothing blocks — used for controlled scenarios,
never as a default.
If the coordination store becomes unreachable, the governor falls back to per-process counters. Calling continues; the limit stops being enforced globally until it recovers. This is monitored, and it is the reason reserved capacity is a contract term backed by a dedicated deployment rather than a configuration value.
Audit retention and export
Every state-changing request on the /v2 API writes one row to an append-only,
per-organization audit log, and every row is exportable through the API. The
retention window is genuinely adjustable per organization.
| Setting | Default | Range |
|---|---|---|
audit_retention_days | 400 days | 30 – 3,650 days, per organization |
400 days is the default so a full financial year plus a filing month is always available. Rows are removed after the window by a sweep that records what it pruned, so legitimate retention and tampering stay distinguishable — a pruned log still verifies clean.
Export is a normal API read, filterable by action, resource, acting API key and time window:
Each row carries its own hash and the hash of its predecessor, so an exported log can be re-verified independently of us. A live verification endpoint returns the same result:
Reading the audit log requires a key holding the audit:read scope. The
mechanism, including what verification actually detects, is described in
Security.
Deployment model and data residency
Covered in full on Deployment. Its bearing on tiering:
| Shared cloud | Dedicated instance | Your compute, our control plane | |
|---|---|---|---|
| Who runs the compute | Graine | Graine | You |
| Isolation | Logical, per organization | Separate stack and data stores | Your infrastructure |
| Where call data and transcripts live | Platform regions below | The region the instance is deployed in | Your infrastructure |
| Region choice | Not per tenant | Chosen at deployment | Yours |
| Concurrency ceiling | Shared platform ceiling above your limit | Your instance is the ceiling | Yours |
| Credit checks, finalization, metering | Ours | Ours | Still ours — over the public internet |
| Egress requirement on your side | None | None | TCP/443 to our control plane, allowlisted |
| Air-gapped operation | Not offered | Not offered | Not offered |
| Commercials | — | Contact sales | Contact sales |
The shared cloud runs in fixed regions:
| Data | Region |
|---|---|
| Compute, agents, call records, organization configuration | India (Mumbai, ap-south-1) |
| API credential store | United States (N. Virginia, us-east-1) |
| Call recordings and audio objects | France (Paris) — third-party object storage, not the cloud provider above |
There is no per-tenant region pinning on the shared cloud — region is a property of the deployment. Single-jurisdiction processing is therefore a dedicated or customer-hosted deployment, scoped before contract rather than toggled in a settings page.
Calling window and feature flags
Six flags are set per organization and govern whole subsystems.
| Flag | Default | Governs |
|---|---|---|
notifications_enabled | on | Outbound notifications |
followups_enabled | on | Automatic follow-up call scheduling |
webhooks_enabled | on | Webhook event delivery |
monitoring_enabled | on | Monitoring and metric collection |
working_hours_enabled | on | Enforcement of the calling window |
concurrency_management_enabled | on | Whether concurrency limits block or merely count |
Calling-window enforcement is usually a compliance requirement rather than a preference, so it is worth stating separately. Each organization carries a timezone, a weekly schedule (default 09:00–18:00, Monday to Friday), a holiday list, and per-category overrides — follow-up calls, for instance, ship exempt from the window by default. Retry behaviour is configured alongside it, per outcome category, with both fixed-delay and exponential-backoff strategies.
Rates, the wallet and the credit ledger
Usage is metered against a prepaid credit balance. Every rate is stored per organization and is overridable per organization — that is the mechanism behind any negotiated commercial rate.
Rates live in organization_configs.cost_management, in USD, in two layers:
- A flat default per cost component, used when nothing more specific applies: telephony, transcription, synthesis, language model, and a platform fee.
- Per-provider and per-model rates, in the natural unit for each: telephony and transcription per minute, speech synthesis per 1,000 characters, language models per 1,000 tokens.
Your effective rates are readable rather than inferred:
| Standard | Enterprise | |
|---|---|---|
| Rate card | Platform defaults | Contact sales — negotiated, stored per organization |
| Currency | USD internally | Contact sales |
| Initial credits | Seeded on organization creation | Contact sales |
| Payment model | Prepaid credits | Contact sales — invoicing and committed spend |
| Volume discounts | Contact sales | Contact sales |
| Minimum commitment | Contact sales | Contact sales |
Two legacy /api/v1 endpoints
credits/rates and credits/ledger are the only calls on this page that are
not /v2. There is no /v2 equivalent yet.
/api/v1 accepts your gat_ key but does not carry the /v2 tenancy
guarantees — see Tenant
isolation. Call them from your own
backend with your own organization's key; do not hand an /api/v1 credential to
a principal you would not trust with the whole tenant set, and do not build a
customer-facing feature on them.
The credit ledger
Worth understanding because it is what your finance team will audit. Every movement of money is written as a ledger entry first and a balance second. Entries are typed — seed, top-up, grant, refund, correction, charge reversal, charge re-application — and reversing a charge is deliberately not the same operation as granting credit, so the two never blur in a reconciliation.
Entries carry an idempotency key with a uniqueness constraint, and the entry is inserted before any balance moves. A retried or double-submitted payment therefore loses the insert and returns the original entry rather than paying out twice. The remaining balance is always derived from allocated minus spent rather than read from a stored mirror, and adjustments above a fixed ceiling are refused outright rather than silently applied.
Every debit is auditable:
A call is refused before it dials if the wallet cannot fund it:
Support
The platform stores a support tier per organization with an integer priority;
standard and premium are seeded on organization creation. What a tier
entitles you to — channels, response targets, escalation path and whether you
have a named technical contact — is a contract term rather than a platform
behaviour.
| Standard | Premium | Enterprise | |
|---|---|---|---|
| Configured tier | standard | premium | Contact sales |
| Channels | Contact sales | Contact sales | Contact sales |
| Response targets | Contact sales | Contact sales | Contact sales |
| Named technical contact | Not included | Contact sales | Contact sales |
| Escalation path | Contact sales | Contact sales | Contact sales |
Response-time and availability commitments are agreed in the contract. Graine does not publish them as marketing figures.
API rate limits
Applied per organization on the /v2 API as a weighted sliding window, executed
as a single atomic operation so two concurrent requests cannot both see
headroom.
| Bucket | Limit | Covers |
|---|---|---|
default | 1,000 / minute | Everything not listed below |
calls.create | 500 / minute | Creating calls, batches and batch schedules |
executions.list | 500 / minute | Listing calls, executions and usage |
Limits are keyed per organization, not per key, so minting more keys does
not multiply your quota. Every response carries X-RateLimit-Limit,
X-RateLimit-Remaining and X-RateLimit-Reset; a rejected request adds
Retry-After and returns:
These limits read a platform value rather than a per-organization one, so they are the same for every organization today and a higher request limit is a platform change rather than an account setting. Raise it during scoping if your integration needs it. In practice, spend and calling capacity are bounded by concurrency and the funding gate rather than by request rate; the limiter is a fairness control.
Reconciling usage
Usage aggregates are available directly, for the period and grouping you choose.
| Parameter | Values | Notes |
|---|---|---|
from_date, to_date | ISO-8601 with a timezone offset | Defaults to the last 30 days; the window may not exceed 366 days |
agent_id | An agent identifier | Restricts the aggregate to one agent |
group_by | none, agent, day | Breakdown returned alongside the totals |
The response reports call counts, connected minutes and spend. Results are cached for 60 seconds per organization and filter set.
One counting rule that will otherwise look like a discrepancy
Voicemail is a dimension, not an outcome. A voicemail pickup is stored as a no-answer plus a flag, so it is counted in both. The outcome fields therefore do not sum to the call total. This is intentional, and it is the correct behaviour when reconciling — but it will look like an error the first time you add up the columns.
Usage aggregates are computed from call records rather than from the credit ledger, so they answer "what did we do" quickly. For "what were we charged", reconcile against the ledger, which is the authoritative financial record.
Scoped before contract
A few things are agreed in a scoping conversation rather than switched on in a settings page. Stated here so they do not surface late in a procurement cycle:
- Invoicing, purchase orders and tax documents are handled outside the platform.
- Billing is in USD. Internal accounting uses a single currency.
- Encryption keys at rest are platform-held. Field-level encryption covers phone numbers, webhook signing secrets and customer authentication headers — see Security.
- Region is a property of the deployment, not a per-tenant setting on the shared cloud.
- Committed-spend and annual terms are contractual and reconciled outside the platform.

