Skip to content

Limits and allowances

Every number on this page is a mechanism, cited to the thing that enforces it. Prices are on the pricing page.

Enforced on every ingest request, on every deployment, regardless of plan.

LimitValueEnforced byResponse when exceeded
Rows per request5,000POST /v1/ingest400
GenAI spans per request5,000POST /v1/traces413
Request body8 MiBBoth ingest endpoints413
Retained content per field100 KiBThe ingest workerSilently truncated, with content_truncated set

The body limit is checked twice: once against the bytes on the wire, and again after gzip decompression. A small compressed body that expands past 8 MiB is rejected, so a compression bomb cannot get past the first check.

The SDKs stay well inside these. They cap a batch at 4 MiB, split anything larger in half and retry each side down to a single row, and handle a 413 the same way. If you write your own client, do the same. See Write your own client.

A workspace has a monthly captured-call allowance, counted per calendar month in UTC.

PlanAllowance
free100,000 captured calls per month
managedNo allowance. The counter still runs, and nothing gates on it

These are the only two values the database permits. There is no third tier.

Rows are counted as the worker processes them, into a per-workspace, per-month counter. The check happens at accept time, before the batch is written: if the counter has already reached the allowance, the request is refused.

Because the check is “already at or above the allowance” rather than “would exceed it”, a batch that crosses the line is accepted in full and the next request is refused. You will see slightly more than 100,000 calls in the month that ran out.

POST /v1/ingest and POST /v1/traces return 402 with a structured body:

{
"detail": {
"code": "quota_exceeded",
"message": "This workspace has reached its monthly captured-call limit.",
"quota": {
"period_month": "2026-09-01",
"calls_counted": 100000,
"allowance": 100000,
"over_quota": true,
"percent_used": 100.0
}
}
}

The dashboard shows a Capture paused banner and the sidebar meter turns red. Everything already captured stays queryable. Capture resumes at the start of the next UTC month, or when the allowance is raised.

The SDKs do not special-case 402. They treat it as a non-202 response, back off, and keep dropping rows. A process that runs past the allowance is not harmed, but it is not buffering for you either.

The sidebar meter warns at 80 percent and offers Book a call, which opens an upgrade request rather than charging anything.

SettingDefaultRange
Metadata retention90 days1 to 3,650 days, set per workspace

A background job runs hourly, deleting calls older than the workspace’s retention in batches of 10,000, then removing the batch ledger entries that no longer have any calls pointing at them. The per-run batch is clamped to between 1 and 50,000 rows, so a large backlog drains over several runs rather than in one statement.

Two details that are easy to get wrong:

  • On a managed deployment the deletion job only touches free workspaces. A managed workspace keeps its rows beyond the 90 day setting unless the operator removes them another way.
  • On a BYOC deployment the job applies to every workspace, using the same per-workspace retention value.

Retention is why the Traces window tops out at 90 days: a longer window would show a hole rather than history.

StageCapConfigurable
Leaves your process1 MiB per fieldYes, METERGRAPH_TEXT_MAX_BYTES. Floor of 1, no ceiling
Retained after ingest100 KiB per fieldNo

The request, the response and the serialized tool-call list are each bounded independently at both stages. See Captured fields.

LimitValue
Ingest key formatmg_ plus 48 hex characters
Ingest session token TTL1 hour
Session refresh marginThe SDK re-exchanges within 30 seconds of expiry
Scopes a dashboard key can carryingest, and only ingest

The real gating in Metergraph is by deployment profile, not by plan. A plan tier is a label and an allowance. What a deployment can do is decided by which profile it runs under.

There are three profiles: managed (the hosted cloud, and the customer-local Docker stack), byoc-core (a deployment in your own AWS account), and local, which shares the managed capability set.

Capabilitymanaged and localbyoc-core
Telemetry ingest and dashboardYesYes
AlertsYesYes
API keysYesYes
MembershipYesYes
Workspace settingsRead and writeRead only
ReportsYesYes
Analysis runsYesYes
Optimization recommendationsYesYes
Evaluations and scorecardsYes
DatasetsYes
Replay simulationsYes
CanariesYes
Billing and upgrade requestsYes
External delivery, including pull requestsYes
Self-service signup and invitationsYes
Platform administrationYes
Batch API provider probesYes
MCP agent APIYes
Import sync from another vendorYes

Gating is fail-closed at the HTTP layer: a request to a route whose capability is not available on this profile is refused before it reaches a handler. Core ingest, traces, performance, alerts, API keys, identity and membership reads carry no capability requirement and are always available.

Background work is gated too. On byoc-core, the worker runs only ingest batch processing and detector scans.

You can read the live answer for any deployment:

curl -sS https://app.metergraph.dev/v1/deployment
{ "deployment_profile": "managed", "cloud": "aws", "capabilities": ["agent_api", "alerts", "..."] }

That endpoint needs no authentication and is cacheable for five minutes.

Within a workspace, three roles.

RoleCan
ownerEverything, including renaming the workspace, inviting people, and approving external actions
memberEverything operational: create and disable ingest keys, acknowledge alerts, start an analysis
viewerRead only. Cannot acknowledge an alert, manage keys, or change replay configuration

Some things the old documentation described as tier-gated are not gated at all.

Claim you may have seenReality
Free, Growth and Scale tiersThe database permits exactly free and managed. There is no Growth or Scale
Per-plan feature entitlementsThe entitlement check returns true for every feature on every plan. It is a compatibility shim, not a gate
Content capture as a paid featureContent capture is on by default and controlled entirely client-side, by METERGRAPH_CAPTURE_TEXT and per-scope capture_text
Canaries and rollout as a shipping capabilityThe canaries capability exists on the managed profile, but there is no write path that puts a challenger model into the config document. model_for() returns your default