Graine AI
Enterprise

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

CapabilityShared cloud, standardEnterprise
Simultaneous live calls100 per organization and 3 per agent to start, under a shared platform ceilingSet to your peak, per organization and per agent
Reserved capacityShares a platform-wide ceilingYour deployment is the ceiling — with a dedicated instance
Deployment modelMulti-tenant cloud we operateDedicated instance, or your own compute with our control plane
Data residencyFixed platform regions, not per tenantSingle jurisdiction, chosen at deployment
Audit retention400 daysAny window from 30 to 3,650 days, set per organization
Audit export and verificationFull history over the API, filterable, independently verifiableSame, across your longer window
Rate cardPlatform default ratesContact sales — negotiated, set for your organization
Payment modelPrepaid creditsContact sales — invoicing and committed spend
Support tierstandardContact 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:

curl -sS https://api.graine.ai/v2/user/me \
  -H "Authorization: Bearer gat_YOUR_API_KEY"
{
  "organization_id": "organization-live-example",
  "developer": {
    "id": "dev_example",
    "name": "Example Integration",
    "key_id": "key_0f3a9c2b71d45e68",
    "key_preview": "gat_...4e68"
  },
  "plan": "trial",
  "rate_limit_tier": "trial",
  "concurrency": {
    "max": 3,
    "current": 2,
    "agent_max": 3,
    "global_max": 1000,
    "enforced": true
  },
  "wallet": {
    "currency": "USD",
    "balance": 4.35,
    "allocated_total": 5.0,
    "lifetime_allocated": 5.0,
    "total_spent": 0.65
  },
  "rate_limits": {
    "default_per_minute": 1000,
    "calls_per_minute": 600,
    "executions_per_minute": 600
  }
}

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.

LimitA new account starts withGoverns
Organization limit100, set when the organization is createdSimultaneous live calls across the whole organization
Per-agent limit3, set when the organization is createdSimultaneous live calls for each agent — see how it applies
Campaign ceilingNone until you set max_concurrent_calls on a campaignSimultaneous live calls for one campaign
Platform ceilingSet by Graine, shared by every accountShared 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.

StandardEnterprise
Organization concurrency100, raised on requestContact sales — set to your peak
Per-agent concurrency3 to start, raised on requestContact sales
Time to change a limitUnder a minute, no redeployUnder a minute, no redeploy
Capacity isolated from the shared platform ceilingNot offeredAvailable 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):

{
  "error": 1300,
  "message": "Account concurrency limit reached (25 of 25 lines in use)."
}

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.

SettingDefaultRange
Audit retention400 days30 – 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:

curl -sS "https://api.graine.ai/v2/audit-logs?action_prefix=api_key.&since=2026-08-01T00:00:00%2B05:30" \
  -H "Authorization: Bearer gat_YOUR_API_KEY"

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:

curl -sS https://api.graine.ai/v2/audit-logs/verify \
  -H "Authorization: Bearer gat_YOUR_API_KEY"

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 cloudDedicated instanceYour compute, our control plane
Who runs the computeGraineGraineYou
IsolationLogical, per organizationSeparate stack and data storesYour infrastructure
Where call data and transcripts livePlatform regions belowThe region the instance is deployed inYour infrastructure
Region choiceNot per tenantChosen at deploymentYours
Concurrency ceilingShared platform ceiling above your limitYour instance is the ceilingYours
Credit checks, finalization, meteringOursOursStill ours — over the public internet
Egress requirement on your sideNoneNoneTCP/443 to our control plane, allowlisted
Air-gapped operationNot offeredNot offeredNot offered
Commercials—Contact salesContact sales

The shared cloud runs in fixed regions:

DataRegion
Compute, agents, call records, organization configurationIndia (Mumbai)
API credential storeUnited States (N. Virginia)
Call recordings and audio objectsUnited 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.

FeatureDefaultControls
NotificationsonOutbound notifications
Follow-up callsonAutomatic follow-up call scheduling
WebhooksonWebhook event delivery
MonitoringonMonitoring and metric collection
Calling windowonWhether calls are held to your calling hours
Concurrency enforcementonWhether 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.

StandardEnterprise
Rate cardPlatform defaultsContact sales — negotiated, set for your organization
CurrencyUSDContact sales
Initial creditsStarter credits on sign-upContact sales
Payment modelPrepaid creditsContact sales — invoicing and committed spend
Volume discountsContact salesContact sales
Minimum commitmentContact salesContact 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:

{ "error": 1400, "message": "Insufficient credits to place this call." }

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.

StandardPremiumEnterprise
Configured tierstandardpremiumContact sales
ChannelsContact salesContact salesContact sales
Response targetsContact salesContact salesContact sales
Named technical contactNot includedContact salesContact sales
Escalation pathContact salesContact salesContact 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.

LimitPer minuteCovers
Placing calls600 — budget against 500Creating calls, batches and batch schedules
Reading calls600 — budget against 500Listing calls, executions and usage
Knowledge-base uploads20Uploading to a knowledge base
Transliteration60Converting names between scripts
Everything else1,000Every 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:

{
  "error": 1300,
  "message": "Rate limit exceeded: 2000 requests per minute for this organization. Retry in 12s."
}

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.

curl -sS "https://api.graine.ai/v2/usage?from_date=2026-08-01T00:00:00%2B05:30&to_date=2026-08-26T00:00:00%2B05:30&group_by=day" \
  -H "Authorization: Bearer gat_YOUR_API_KEY"
ParameterValuesNotes
from_date, to_dateISO-8601 with a timezone offsetDefaults to the last 30 days; the window may not exceed 366 days
agent_idAn agent identifierRestricts the aggregate to one agent
group_bynone, agent, dayBreakdown 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.