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 setting on your account, which is why a limit can be raised for your account alone and take effect 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 and 3 per agent to start, under a shared platform ceiling | Set to your peak, per organization and per agent |
| 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, set for 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
A plan is not a fixed bundle. A plan name is a label carried on your API key: it decides which keys that key may create (its own plan or a lower one, never a higher one) and can carry higher request limits. Everything else that governs your account is the set of settings on this page, each adjustable on its own.
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 checked before every dial, not reconciled afterwards, so the limit is a real ceiling rather than a reporting threshold.
| Limit | A new account starts with | Governs |
|---|---|---|
| Organization limit | 100, set when the organization is created | Simultaneous live calls across the whole organization |
| Per-agent limit | 3, set when the organization is created | Simultaneous live calls for each agent — see how it applies |
| Campaign ceiling | None until you set max_concurrent_calls on a campaign | Simultaneous live calls for one campaign |
| Platform ceiling | Set by Graine, shared by every account | Shared ceiling above your organization's limit |
The per-agent limit is a ceiling for calls placed one at a time while none of
your running campaigns has contacts waiting. While campaigns are dialling, your
organization limit is split evenly across the agents whose campaigns have
contacts waiting, and each agent may use that share or its per-agent limit,
whichever is larger — so one campaign on one agent can use the whole
organization limit. A per-agent value at or above the organization limit never
holds a call back. /v2/user/me reports max as the lower of the two limits
(3 for a new organization) and agent_max as the per-agent limit; the
dashboard's Billing page shows the organization limit as Calls at once.
Two calls can never both take the last line. Because your limits are settings on your account, "raise us to 400 lines for tomorrow's campaign" is a change Graine makes within the minute rather than a release.
| Standard | Enterprise | |
|---|---|---|
| Organization concurrency | 100, raised on request | Contact sales — set to your peak |
| Per-agent concurrency | 3 to start, raised on request | 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. A direct call placed
at the limit is queued — a 202, dialled the moment a line frees — and a request
that cannot be queued is refused with a specific code, carrying Retry-After
(see Rate limits):
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 can itself be switched off for an organization. When it is off,
calls are still counted, so the numbers stay accurate, but nothing is held back
— used for controlled scenarios, never as a default. concurrency.enforced on
/v2/user/me says which applies to you.
If the live line count is briefly unavailable, calling continues and the limit is enforced approximately 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 setting.
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 | 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 older than the window are removed, and each removal is itself recorded, 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) |
| API credential store | United States (N. Virginia) |
| Call recordings and audio objects | United Kingdom, with a third-party object-storage provider |
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 account features
Six features can be switched on or off for your organization.
| Feature | Default | Controls |
|---|---|---|
| Notifications | on | Outbound notifications |
| Follow-up calls | on | Automatic follow-up call scheduling |
| Webhooks | on | Webhook event delivery |
| Monitoring | on | Monitoring and metric collection |
| Calling window | on | Whether calls are held to your calling hours |
| Concurrency enforcement | on | Whether concurrency limits hold calls back or only count them |
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 set per organization, which is how a negotiated commercial rate is applied.
Rates are held 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.
Text chats, Talk and calls
A text chat is charged per session of up to 5 minutes; a longer chat counts one more session per further 5 minutes. Talk and calls are charged per minute.
- A text chat is a conversation in your app or on your website with no voice at all. Its time counts for as long as it is open, including the wait before a chat closes by itself, about 5 minutes after the last message. A chat in which the customer never wrote is not charged, and a chat that closes by itself at that limit counts as one session, not two.
- Talk and calls are charged per minute and prorated to the second: phone calls, web calls, calls in your app, and Talk, including Talk started from the chat window.
Your effective rates are readable rather than inferred: the dashboard's
Billing page shows the rate card your calls and chats are priced against,
the price of a chat session included. They are not yet available through /v2.
| Standard | Enterprise | |
|---|---|---|
| Rate card | Platform defaults | Contact sales — negotiated, set for your organization |
| Currency | USD | Contact sales |
| Initial credits | Starter credits on sign-up | 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 /api/v1 endpoints
credits/rates and credits/ledger are the only calls on this page that are
not on /v2 yet. Call them from your own server with your API key, as you
would any /v2 route.
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.
Every entry carries an idempotency key and is written before the balance moves, so a retried or double-submitted payment returns the original entry rather than paying out twice. The balance is always computed as allocated minus spent, never kept as a separate copy, and adjustments above a fixed ceiling are refused outright rather than silently applied.
Every debit is auditable: the credit statement on the dashboard's Billing
page lists every movement of the wallet. It is not yet available through /v2.
A call is refused before it dials if the wallet cannot fund it:
Support
Every organization has a support tier — standard or premium. 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 sliding one-minute window, so two
requests arriving together can never both take the last of your allowance.
Every limit and the endpoints it covers are listed on Rate
limits.
| Limit | Per minute | Covers |
|---|---|---|
| Placing calls | 600 — budget against 500 | Creating calls, batches and batch schedules |
| Reading calls | 600 — budget against 500 | Listing calls, executions and usage |
| Knowledge-base uploads | 20 | Uploading to a knowledge base |
| Transliteration | 60 | Converting names between scripts |
| Everything else | 1,000 | Every other endpoint |
Limits are keyed per organization, not per key, so minting more keys does
not multiply your quota. Every authenticated response carries
X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset; a rejected
request is a 429 that adds Retry-After and returns:
These figures are the floor every key gets. A higher limit can be set for your plan — 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. The same request returns the same figures for up to 60 seconds.
One counting rule that will otherwise look like a discrepancy
Voicemail is a dimension, not an outcome. A voicemail pickup counts as a no-answer and also as a voicemail, 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 terms and purchase orders are agreed outside the platform. The tax invoices and credit notes raised for your organization are on the Billing page of the dashboard, each with a download — and once a payment is recorded against an invoice, its paid copy is there beside it.
- Billing is in USD.
- Encryption key custody is set per deployment. Field-level encryption covers phone numbers, webhook signing secrets and your authentication headers; per-organization keys, including a key held in your own key-management account, are scoped before contract — 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.

