Skip to content
Console
Browse documentation
Reference

Plans, limits, and retention

Understand the current plan catalog, usage meters, history windows and work limits.

On this page

Anectico measures usage in units a developer can connect to application behavior. Seats are not a usage meter.

The table below is the current self-serve catalog. An early-access agreement or the Console may show different effective limits. Billing and usage in the Console, or anectico usage, is the source of truth for an active organization.

Self-serve limits

Plan Pooled events / month Active metric series Replay sessions / month Retention Projects Agent audit history Daily decision-scoring cap
Free 1 million 1,000 100 7 days 1 30 days $0.10 / day
Solo 10 million 10,000 10,000 30 days 10 30 days $0.50 / day
Pro 150 million 50,000 50,000 90 days 50 90 days $2 / day
Scale 500 million 100,000 250,000 180 days 1,000 180 days $10 / day

Plans differ by volume and history. Agent access through MCP and the CLI is included on every plan, and you bring your own model: Anectico does not run an investigation for you on any plan. See agent plan headroom for the separate provisional OAuth approval and automated-work allowances, and agent budgets for owner-set operation and typed-decision spend controls.

API request rate

Every plan also has a request rate: how many API requests per second your management keys may send, and how many at once (the burst). It counts requests to the REST API and to MCP, not accepted work, and is separate from the operation budgets.

Plan Requests per second Burst
Free 10 20
Solo 50 100
Pro 100 200
Scale 500 1,000

Each management key has its own allowance, so one busy key does not slow another, even when the same person created both. All of your workspace's management keys, across projects, are also counted together against one workspace allowance at the plan's rate, so creating more keys does not multiply it. A person signed in to the Console, or an agent connected over OAuth, has the person's own allowance. An owner can lower the rate per key, as a default for keys, or for the whole workspace, never above the plan; after a downgrade a value above the new plan is not applied. The request rate is an operational limit, not billing: reading the API does not use your event allowance, and no price depends on it. See Manage agent budgets.

Agent activity and proof-page opens follow the audit-history window above. A downgrade immediately shortens what can be read; older records are removed on the next retention pass. An upgrade widens the window but never restores deleted records.

The daily decision-scoring cap bounds the small typed judgments Anectico makes on your behalf on every plan. Today there are four made on your behalf — ranking anomaly findings, suggesting a category and an attention marker for the repeated log templates you look at, saying which declared name an observed-but-undeclared tracking-plan event name or property key was most likely meant to be, and judging how serious each Issue you look at is right now and which part of your application it comes from — plus any decision-score evaluators you configure. One judgment costs a fraction of a cent, so your plan's event and series meters are the real allowance and this cap only stops a runaway. When it is reached nothing is refused: findings simply stay unranked, log templates are listed without labels, tracking-plan suggestions stay pending, issue judgments stay pending, and decision-score evaluations are not scored — a sampled check waits to be retried, and an on-demand evaluation answers 429 saying nothing was scored — until the cap resets at midnight UTC. Everything else works exactly as before. The same holds whenever the scoring model is unavailable, except that an on-demand evaluation then answers 503 (or 400 when typed evaluation is not available at all).

Anectico does not translate a plain-language question into a query. Your own agent writes the query, or the read-only SQL, with its own model and runs it through the same tools you would.

Current prices and included product capabilities are listed on the pricing page.

Conditional reads still use request allowance

Authorized conditional reads of a saved insight definition or ready analytics result may return bodyless 304. These requests still use the key and workspace request allowances and keep the applicable rate and checked headers. They start no measurement and use no accepted-query budget. Stored payload reads, permission and lifecycle checks, source verification and public JSON serialization still occur. See conditional reads for accepted validators, private revalidation, lifecycle states and your cache-disposal duties.

What counts as an event

Product events and technical events (logs and spans, including error signals) draw from separately configured allocations within the organization's pooled allowance. Each newly admitted logical event reserves one unit in its family in the UTC month of its original server admission. A critical error is included in technical events, with a separate critical-error count; identity controls and metric points have their own visible counts and do not consume either event allocation. The general pooled-events summary is the sum of admitted product and technical events, not a second charge.

The agent-run events Anectico emits for you — $agent_run_started, $agent_run_finished and $agent_tool_failed — are ordinary product events and consume the configured product allocation. They are counted once, as events: the agent metrics in your dashboards are a separate meter (active series) over the same underlying signal, and the two are never charged for the same row twice.

Metrics use active series because their cost depends on the number of distinct label combinations, not only the number of data points. At the active-series limit, existing series continue to ingest; only unseen metric names or label combinations are rejected. This rejection is non-retryable. The meter is organization-wide and its background snapshot may lag by a few minutes. Replays count recording sessions that started in the period.

Which month usage lands in

Usage is counted in the period of its original server admission, not the timestamp on the data. If your SDK buffers events offline and sends them later — a mobile app reconnecting after a flight — those events are counted in the month they first reach us, even though they keep their original timestamps everywhere you read them. Backdating a timestamp therefore does not move usage into an earlier period, and it never removes usage from the current one.

Projects

Each plan allows a fixed number of projects: 1 on Free, 10 on Solo, 50 on Pro and 1000 on Scale. Creating one beyond the limit is refused; upgrade to raise it.

Downgrading never deletes a project. If a downgrade leaves you above the new limit, everything keeps working and you simply cannot create another until you are back under it.

Deleting data changes one meter, not the other

Deleting a metric frees active-series capacity. Active series measures what you are currently tracking, so a metric you delete stops counting against the limit once the next background snapshot runs; that is why removing an accidental high-cardinality metric is the remedy when you are near the cap. The freed capacity is real capacity: new series are admitted against it from that same snapshot, not only at the start of the next monthly period. A series reserved immediately before a snapshot can be held through one additional snapshot interval so an in-flight data point from another project is not mistaken for deleted data.

A deleted metric that your application keeps sending stays deleted, and stays free. Its data points are still hidden from every query, dashboard, and alert, and they do not count toward your active series or take capacity from a new one — so you do not have to redeploy before the capacity comes back. Deletion suppression is project-scoped: the same series sent by a different project remains active and is admitted normally. If you want the deleted project's metric again, send it under a name you have not deleted.

Deleting logs, spans, errors, or product events does not refund their admission counts. That meter counts what was admitted during the period, so retention expiry or deletion cannot return capacity. Project deletion preserves the organization's monthly usage; organization erasure removes its counters. Delete for privacy, correction, or hygiene — not to recover event capacity. Replay sessions behave the same way.

Retention

Retention is a rolling history window. Data outside the plan's window is no longer available to search, timelines, API reads, or MCP tools.

Product and technical history start at midnight UTC, the configured number of days before today. For example, seven-day history on October 6 includes events from September 29 at 00:00 UTC onward; that entire oldest day remains available until midnight UTC on October 7. An event received late within that window uses its occurrence time, so a 167-hour-old event remains readable. A previous shortening can set a later starting point.

The window is organization-wide. Every project inherits the organization's current plan or administrative override; projects cannot advertise or configure a separate retention period.

If the window is shortened, older history expires under the new limit. Increasing it later keeps the history that is still available for longer, but it does not bring back history that already expired under the earlier window. There is no archive or recovery of expired history.

Read coverage

See Read coverage and intake completeness for requested and effective windows, retention floors, empty-result interpretation and intake settlement. A readable window does not certify complete upstream capture.

Family policy configuration

The family policy API records product and technical retention choices within separately granted ceilings (seven to 365 days maximum) and allocations within the existing pooled events allowance. Every organization starts with a default derived from its plan: ceilings equal the plan's retention, the pool equals its monthly events allowance, and the choice keeps full retention with 20% of the pool for product events. Every project reads the same organization policy and pool. Only Anectico can grant a ceiling or increase the allowance. Customer updates require both current revisions and organization-wide settings authority.

Retry receipts are retained for seven days, up to 1,000 unexpired receipts per organization; new mutations refuse at that bound while existing retries remain readable. Keys are 1–128 UTF-8 bytes. These are policy-update retry receipts, separate from event-admission records. Family policy never extends replay or other content policy.

Product capture admission

POST /api/v1/capture and internal agent-run events use the product allocation. Each new product event is admitted whole while the organization's product count for the month is below 125% of that allocation, and refused with quota_exceeded at or above that threshold; zero allocation refuses new product events. The decision is per event, so the rest of a batch is still decided normally. Technical traffic cannot consume this capacity. Identity controls (identify and $groupidentify) are admitted through product exhaustion and counted separately.

The only policy refusal is an organization whose allocations still need to be chosen (for example after an entitlement change). Capture then refuses the whole request with retryable 503 dependency_unavailable; OTLP HTTP returns retryable 503 and OTLP gRPC Unavailable. A usage measurement that has not refreshed recently, or the start of a new month, never refuses intake. Admission decisions use counts that can lag other intake servers by a few seconds, so an allocation is a threshold, not an exact spending ceiling.

Repeating the same message_id with the same normalized payload in the same project within seven days is recognized as a retry: it keeps its original timestamp when you omit it, is not counted again, and is still acknowledged even after exhaustion. Reusing a message_id with a different payload refuses that event alone as invalid_event. Keep IDs, payloads and explicit timestamps unchanged; see capture retries. Counts measure admission, not confirmed storage, and uncertain queue delivery keeps the count.

GET /api/v1/usage/families, anectico usage families, MCP get_family_usage, and Billing and usage in the Console show the month's admission counts and INDEPENDENT enforcement. The counts are a snapshot as of observed_at (refreshed every few minutes); revision identifies the snapshot. A missing measurement means unknown, not zero, while a present measurement with zero counts means measured zero. Counts measure admission, not confirmed storage or complete source coverage. Retention, project deletion, and exact retries do not refund or multiply them. The allocation permits documented overage, so it is not an exact spending ceiling.

Technical OTLP admission

OTLP logs and spans use the technical allocation independently of product capture. Ordinary logs and spans follow the configured sampling ladder as their family's count rises; at zero allocation they are refused. Critical error signals continue to be admitted through technical exhaustion and are included in technical_events, critical_errors, and, when admitted at or above the allocation, critical_error_overage. Metrics use the separate active-series gate and appear as metric_points. Sampling is reported as OTLP partial success; exporters must not resubmit sampled positions.

Positions are counted once they are published. OTLP has no required client retry identity, so sending the same export again creates new positions and can consume more capacity. A publish failure returns retryable 503 (HTTP) or Unavailable (gRPC) and is not counted; follow the exporter's normal retry guidance, which may deliver part of the batch twice. A successful response or partial success is final for that submission.

Field limits

These apply to every plan and are not usage meters. They bound one payload rather than a month's volume, so a request that trips one is rejected immediately and is not retryable without a change.

Field Limit
Metric name 255 characters
Span name 255 characters
Attribute key 512 bytes
Attribute value 32,768 bytes
Attribute value nesting depth 8 levels
distinct_id 200 bytes
Distinct IDs in one recording lookup 100
Matchers in one alert silence 32
Alert-silence matcher label name 512 bytes
Alert-silence matcher value 4,096 bytes
Stack frames symbolicated for one request or occurrence 256
Event name (product events) 200 UTF-8 bytes
Attributes per span, span link, log record, data point, or exemplar 256
Total attribute bytes per span, log record, or data point 262,144 bytes
Spans, log records, or data points per export request 10,000

For OTLP attributes, the attribute value limit uses the following byte accounting, applied recursively to arrays and nested key-value lists. This is the receiver's size budget, independent of whether the export uses JSON or protobuf; it is not the serialized request length.

Value type Bytes charged
String UTF-8 byte length
Byte string Raw byte length, before any base64 encoding
Integer, floating-point number, boolean, or empty value 8 bytes
Array Sum of each element's charged size, plus 1 byte per element
Key-value list Sum of each key's UTF-8 byte length and its value's charged size, plus 2 bytes per entry

The container accounting applies at every nesting level, including elements whose values are empty strings or empty containers. For example:

Attribute value Charged size Within the 32,768-byte value limit?
One 32,768-byte string 32,768 bytes Yes
Array of 1,000 strings, each 31 bytes 1,000 × (31 + 1) = 32,000 bytes Yes
Array of 1,000 strings, each 32 bytes 1,000 × (32 + 1) = 33,000 bytes No
Array of 1,024 strings, each 31 bytes 1,024 × (31 + 1) = 32,768 bytes Yes
Array of 1,024 strings, each 32 bytes 1,024 × (32 + 1) = 33,792 bytes No

Exactly 32,768 charged bytes is allowed; the other field, nesting and per-item limits still apply.

Each distinct ID in a recording lookup is also subject to the 200-byte distinct_id limit above. Alert-silence regular expressions use the matcher-value limit and are validated when the silence is created or edited; a malformed expression is rejected instead of creating a silence that can never match.

The total attribute bytes limit sums each attribute key's UTF-8 byte length and its value's charged size for one item, because one item is stored as one record. For a span that is its own attributes plus every span link's and every span event's; for a log record it is the body plus the attributes; for a metric data point it is the point's attributes plus its exemplars'. Individually legal attributes can add up past this, and an item that does is rejected. It is set well above ordinary instrumentation — a span carrying eight maximum-size exception stack traces still fits — so reaching it usually means an application is attaching a whole request or response body to a span. Attach a reference instead, or truncate before the attribute is set.

Metric and span names follow the OpenTelemetry maximum instrument-name length of 255 characters. Names are otherwise accepted as your instrumentation emits them, including forms OpenTelemetry does not itself recommend — a leading digit, a colon (as Prometheus recording rules use), spaces, and non-ASCII letters all work.

What a name may not contain is characters a reader cannot see: control characters, bidirectional overrides, zero-width and invisible characters, and variation selectors. These have no legitimate use in a name, and a name carrying them would display as something other than what it is wherever it is read — on a proof page, in a search result, or by an agent reading it through the API.

An export rejected by OTLP field validation names the field category and the rule. For example, attributes: attribute value exceeds 32768 bytes identifies the value limit without naming the submitted attribute key. HTTP returns status 400 with this message; gRPC returns InvalidArgument with the same message. Submitted names, keys, identifiers and values are not echoed back, so compare your payload against the limits above. Malformed payloads and unclassified validation failures use a generic rejection message instead of exposing parser or internal error details.

OTLP admission validates individual items and batch limits; it does not check the complete trace graph for cycles. Parents and linked spans can arrive in separate exports or be outside the retained data. An accepted export therefore does not certify an acyclic graph. Cycles found by critical-path analysis are reported through has_cycle; see trace and unified search.

One invalid item rejects the whole export request. If a single metric in a batch carries an invalid name, the batch is refused rather than partially accepted, so nothing is silently dropped. Fix the name and resend.

Gauge, sum, explicit-histogram and summary metrics are accepted. Exponential histograms are rejected as unsupported metric data; configure the exporter to send explicit histograms before resending. Summary counts and quantile values are stored as measurements and do not replace exporter labels or create a new series whenever the observed values change.

Span start and end times, span-event times, metric observation times and exemplar times must be present and fit the storage timestamp range. A metric's optional start time cannot follow its observation time. Numeric observations must be present and finite; summary quantiles must be between zero and one. These checks happen before delivery is acknowledged. OTLP NoRecordedValue markers are accepted and count toward request limits; their timestamps and attributes are validated, while their unused measurement fields are ignored. They produce no measurement row or persistent staleness tombstone, so earlier measurements remain available in historical queries. Logs use their source timestamp when present and otherwise their observed timestamp; at least one valid time is required.

Span events on an agent span are separately indexed up to 4,096 per span. Agent span events — the evaluation, guardrail and context records carried on a model-call span — each become an individually addressable agent event you can filter, count and alert on. Past 4,096 on one span, the remaining events are still stored on the span and still readable there, but they are not separately indexed. Nothing is rejected and nothing is dropped from the span. The OpenTelemetry SDK default caps span events at 128, so reaching this needs a deliberately raised OTEL_SPAN_EVENT_COUNT_LIMIT; if you are, split the work across spans rather than raising it further, because one span carrying thousands of events is also slower to read.

Instrumentation attributes, service name, and exception types

Every instrumentation attribute map gets the same display-safety handling: resource, span, span-event, span-link, log-record, gauge, sum, histogram and summary data-point attributes, plus exemplar filtered attributes.

For item attributes, the count and byte limits in the table above are validation limits. Exceeding one rejects the export as described above. Attributes that pass those limits then receive a second, per-attribute character check. That check never rejects the export: a key or value containing undisplayable characters is replaced by a stable fingerprint.

Resource and span-event attributes are not subject to the per-attribute count and value limits in the table above. A span event's attribute bytes do count toward its span's total-attribute-bytes limit, because they are stored on that span. Their stored representation is bounded instead:

Field Stored limit
Resource service.name, deployment.environment.name, deployment.environment (and environment, env, service.environment) 255 characters
Any other resource or span-event attribute value 32,768 characters
Resource or span-event attribute key 512 characters
Resource attributes per resource 256
Span event name, exception type 255 characters

An undisplayable value is replaced by sha256:<digest>. A clean value that exceeds a stored character limit keeps a short readable prefix followed by …sha256:<digest>. The fingerprint is stable, so all telemetry from that source still groups together, and it is computed over exactly the bytes you sent, so you can identify which value it was:

printf '%s' "<the value you sent>" | shasum -a 256

Every attribute key is an identifier and may not contain newlines, carriage returns or tabs. Attribute values are prose and may contain all three — a multi-line exception stack trace, SQL statement, HTTP user agent or request body is stored intact. The resource identity values in the first row above are the exception: they are single-line identifiers because they appear as labels throughout the product.

If a resource carries more than 256 attributes, the excess is dropped in a stable order and the number dropped is recorded on the resource as anectico.resource.attributes_dropped. service.name and the environment attributes are never dropped.

The character-safety handling in this section is applied per attribute and never causes an export to be rejected. The item count and byte validation limits still apply before it.

Product analytics measurement limits

Trend, funnel and retention measurements run asynchronously and are bounded separately from the usage meters above:

Limit Value
Measurements pending or running per project 4
Maximum wait for a synchronous answer (wait_millis) 25 seconds
Maximum time one measurement may run 120 seconds
How long a completed result stays readable 1 hour
Contributors per selection 1,000,000, read 1–100 per page

A measurement that exceeds its running time, memory or scan budget fails outright with a named reason rather than returning a smaller answer. A measurement is also refused outright, before it starts, when there is not enough room to store the result it would produce — the reason says so, the answer is never a partial one, and a measurement refused this way is not counted against your concurrent measurements. See measure product events for the full definition, retry semantics, and how to poll past the wait_millis ceiling.

A funnel correlation adds its own bounds: at most 5 event properties, 50 excluded events, 50 returned signals, a minimum support of at most 10,000, and 1,000 ranked candidates. A definition above one is refused with QUERY_CORRELATION_LIMIT; anectico analytics capabilities reports the current values.

Web analytics adds its own bounds: a dimension returns at most 100 values (20 when you do not say), and the rest are combined in one other row; a day, week or month series holds at most 100 periods. A definition above either is refused with QUERY_WEB_LIMIT. One dimension value is at most 256 bytes (a longer one counts as missing), a service name at most 128 bytes, and one page leave reports at most seven days (604,800,000 ms) of visible time; a leave outside that range is invalid and contributes no time. anectico analytics capabilities reports the current values.

Heatmaps add their own bounds: a click grid is at most 50 columns by 200 rows (20 by 40 when you do not say) and a clicks result returns at most 2,000 cells, the most clicked first, with the rest combined in one other entry; an elements result returns at most 100 elements (20 when you do not say) plus the missing-selector row, with the rest in other. A grid or a limit above these is refused with QUERY_HEATMAP_LIMIT. A page is at most 256 bytes, a service name 128 bytes, one selector 512 bytes (a longer one counts as no selector) and one tag name 64 bytes. A measurement whose selections would list more than 20,000,000 participant rows in all fails with PRODUCT_RESULT_FAILURE_REASON_EXECUTION_BUDGET instead of publishing part of a result. anectico analytics capabilities reports the current values.

Revenue adds its own bounds: a result holds at most 10 currencies (the rest are counted in other_currencies, never added), a breakdown returns at most 50 values per currency (10 when you do not say) with the rest combined in one other row, top_payers is at most 25 and a series holds at most 100 periods. A definition above a breakdown, top-payer or period bound is refused with QUERY_REVENUE_LIMIT. An amount has four decimal places and a size of at most 99,999,999,999.9999; an occurrence outside that is counted as invalid and measured nowhere. A result that would list more than 20,000,000 people across all its payer selections fails with PRODUCT_RESULT_FAILURE_REASON_EXECUTION_BUDGET. anectico analytics capabilities reports the current values.

Surveys have their own bounds, reported by anectico surveys limits: a project holds at most 200 surveys of every state and runs at most 20 active ones; a survey has up to 10 questions, a choice question 2 to 12 options and a route list up to 20 routes of at most 512 characters; a name is at most 200 characters, a description 2,000, a prompt 500 and an option or end label 200; an open-text answer is at most 2,000 characters and a rating scale ends at 10 at most; a cooldown after any survey is at most 365 days; and one visitor is offered at most three surveys at a time. A launch, a stop or a reached response cap changes what is offered within about 15 seconds. A definition above a bound is refused with SURVEY_LIMIT. A survey result lists at most 10 questions of 12 options each, pages open-text answers 1 to 50 at a time, and fails with PRODUCT_RESULT_FAILURE_REASON_EXECUTION_BUDGET rather than list more than 20,000,000 people across all its selections. anectico analytics capabilities reports the current values.

Service health snapshot

The service snapshot is a top list ordered over every service that reported activity in the window:

Limit Value
Services returned (limit, --limit) 1 to 200; 50 when you do not say
Services one window may hold 10,000
Service name text to match (service_match, --match) 256 bytes, no control characters
Health states to select (health_filter, --health) One per call
Time one read may run 10 seconds

There is no next page. Choosing a health state or part of a name does not widen or shrink what is read: the same limits apply to every service that reported activity, and the selection is made over all of them before the list is cut. A window with more than 10,000 services, or a read that exceeds its time, scan or memory limit, is refused with no list rather than a partial ranking, and never as "no service matched"; narrow the window, the project or the environment. A window whose end is not after its start is refused. These values are starting engineering limits, not measured capacity, and may change once real workloads are measured.

Busy expensive reads

A few reads are expensive enough that each server runs only a few of them at once, whoever asks:

Read At once, per server
Service snapshot, and a trace search by exact span attribute 8, at most 2 for one organization
Session replay steps, snapshot stream and report screenshots 2, at most 1 for one organization

A request that waits about two seconds without a free place answers 429 with Retry-After: 1 and details.reason: "READ_ADMISSION_BUSY" (error code read_admission_busy). Nothing was read: retry the identical request after the header, backing off if it is refused again, and never treat it as an empty answer. A 429 without that reason is the request rate or a limit of the request itself. A program that shows these reads to many people should read once in its own backend and share the answer: the service snapshot no more than once a minute per project, with an explicit project and a window of 24 hours or less, and a replay only when someone opens it. The status board example and Polling, retries and refusals show how.

Replay reads share the organization limit across all projects and credentials. An admitted read normally has twenty seconds of work; an earlier request deadline applies first. Cancelling it stops reconstruction and derivation and discards unfinished output. A recording read is bounded to 32 MiB of decoded events, 100,000 events and 1,000 chunks, with 8 MiB per chunk. Steps have a separate 4 MiB derived-data budget and at most 200 steps per page. Oversized derived or encoded output is refused, never returned as a successful partial reading. A 429 for that resource limit lacks READ_ADMISSION_BUSY; waiting for capacity does not fix an oversized request. Missing chunks, limited related signals and incomplete coverage stay explicit. These bounds do not qualify browser capture or privacy.

Read-only SQL over events

Read-only SQL runs one SELECT over a single table, events, and has its own bounds. GET /api/v1/analytics/sql/capabilities reports the current values.

Limit Value
Window Required; at most 92 days
Events loaded into a run 1,000,000 events and 256 MiB. A window that holds more fails with SQL_ERROR_CODE_SLICE_TOO_LARGE; the input is never silently cut
Rows returned 1,000 when you do not say; at most 10,000 (MCP: 100, at most 1,000)
Size of the returned rows 8 MiB. A longer result is cut and truncated is true
Columns in a result 200
Statement size 16,384 bytes
Execution time 30 seconds
Memory per statement 512 MiB
Rows a statement may read 20,000,000
Concurrent runs 1 per organization
Rate 20 runs a minute and 300 an hour per organization, counting statements that are refused; beyond it, REST answers 429

Scheduled reports

A scheduled report is bounded separately from the usage meters above. These are enforced limits, not plan tiers: they are the same on every plan, and GET /api/v1/reports/limits returns them.

Limit Value
Scheduled reports per project 50
Recipients per report 20
Name / note length 120 / 1,000 characters
Rendered sections in a dashboard report 12 (other widgets are listed with a link)
Table rows / columns per section 10 / 6
Shortest interval between scheduled runs 1 day
Fixed day of the month 1 to 28; the last day of the month covers the rest
Oldest scheduled time that is still sent 6 hours; an older one is skipped and recorded
Runs waiting at once per report 3
Run history 180 days

After downtime only the latest due run is sent. Channel types that carry a report are email, Slack and webhook.

Warehouse export

Warehouse export is bounded separately from the usage meters above. These are enforced limits, not plan tiers: they are the same on every plan, and GET /api/v1/warehouse/limits returns them.

Limit Value
Destinations per project 10
Exports per project 20
Event names in an export's filter 50
Name length 120 characters
Backfill lookback 30 days
Rows per run 3,000,000
Bytes per run 4 GiB (one event may be at most 3 MiB)
Rows / bytes per part 500,000 / 256 MiB
Shortest interval between runs 1 hour
Safety lag before an events window runs 10 minutes
Windows caught up per pass after downtime 24
Oldest audience snapshot time still written 12 hours
Attempts against a destination that does not answer 8
Manual runs waiting at once per export 3
Run history 180 days
Destination connection tests 30 an hour and 200 a day per organization; beyond it, REST answers 429

Destination types are limited to S3-compatible storage, and an audience export is limited to ordinary cohorts.

Person data archives

There is no whole-run identifier count limit. Each archive is bounded by its configured uncompressed size (default 2 GiB), one record is at most 64 MiB, and a build attempt has at most two hours. Exceeding an enforced limit fails the export without a partial archive. Temporary selection identifiers are deleted after the build, and abandoned selections expire. See Export a person's data.

Anectico Live

A live screen is bounded separately from the usage meters above. These are enforced limits, not plan tiers: they are the same on every plan.

Limit Value
Panels per screen 12
Trend panels per screen 4
Panel title 120 characters
Note text 500 characters
Fastest refresh, trend panel 60 seconds
Fastest refresh, count panels 30 seconds
Viewing-link lifetime 30 days by default; no scheduled expiry is an explicit choice
Display session, idle 24 hours, extended by use
Display session, absolute 30 days, never extended
Reads of one viewing link 120 per minute

Trend panels are capped at four because a project may run four product-analytics measurements at once, and a live screen must leave room for the measurements you run by hand. A trend panel refused for capacity is shown as Delayed and retried on the next cycle as the identical request; it is never queued and never escalated.

Refresh happens on a server timer rather than on a viewer's poll, so the cost of a screen does not grow with the number of people watching it, and a screen nobody has opened recently is not refreshed at all. Reading a link far above a display's own cadence is throttled, as is exchanging a link's secret for a session.

More screens is the way past the panel budget: publish two screens with two links rather than one crowded screen. See Live screen templates and panels.

When a limit is reached

Anectico warns before a limit is exhausted. Under the planned policy, verbose logs degrade before spans, while errors continue to ingest and alerts continue to evaluate. New replay sessions can be paused. Clients should honor 429 responses and Retry-After; they should not retry in a tight loop.

The OTLP gRPC endpoint carries no HTTP status, so a throttled export is answered with RESOURCE_EXHAUSTED accompanied by a retry delay. Standard OpenTelemetry exporters read that delay and retry the batch automatically; no client change is needed. The delay matches the Retry-After value the HTTP endpoint returns for the same condition.

Use Billing and usage in the Console (/billing), or anectico usage, to view current plan and usage.

Deleting a project or organization

Deleting a project revokes its API credentials and display links and starts removing its saved intake sources, derived log-metric configuration, privacy settings and status-page drafts, incidents, maintenance, publication copies, subscribers and pending notification material. Display sessions are removed. Public-page withdrawal and custom-domain release must finish before the page's remaining stored content is removed; temporary service failures can delay this work. A retired public page address remains reserved to prevent reuse.

Deleting an organization applies that removal to every project and also removes its usage counters, cached payment account details, purchase links, change previews and sign-in refresh sessions. Deleting a single project preserves organization-wide usage and payment state. Payment cleanup also runs when checkout is disabled.

Security and financial audit records, revoked credential history and minimal records needed to prevent deleted data or authority returning are retained. These records do not restore access to a deleted project or organization.

Technical asset declarations

A project can hold 1,000 distinct technical asset declarations across environments and kinds. Replaying an original result or replacing the same declaration does not consume another slot; a new declaration or shadow adoption at capacity refuses with asset_declaration_limit. Preview and declaration never create a sighting. See Declare an asset before it runs for selector, version and hash and byte bounds.

Preparing a replacement or adoption requires no more than 1,000 versions, 1,000 observation identities and 1,000 shadow-review signals on the selected asset. Larger records refuse as ineligible; a partial preview cannot be confirmed.

Browser aggregate sharing

A project has at most 100 active grants. Each names at most 10 exact results, 3 closed selectors and 5 exact origins; creation is bounded to 16 KiB. Grant expiry is between five minutes and 90 days, bounded by parent expiry. Runtime tokens last at most five minutes without refresh; projections refuse above 1 MiB. Parent transport and operation accounting applies, and unchecked allowance is unknown.

See Share a saved aggregate with a browser page for the full credential, theft, lifetime, privacy and external-copy contract.

Recent-customer top lists

Recent customers measures observed errors, person-linked traces and product events in one project. Default: last 24 hours and top 25; explicit windows span at most seven days and limits are 1–100. Product and technical history floors apply separately. The current identity admission ceiling is 512 distinct source keys. Exceeding a scan or identity limit refuses the whole ranking, without a partial list or invented totals. One accepted read uses one query operation budget; it creates no audience or additional event meter. The result never establishes upstream completeness or recovery of expired history.

Static aggregate publication

A publishable grant names one saved result, one to three closed projections and one to five exact origins. Required expiry is five minutes to 30 days, within parent expiry. Each grant shares the existing 100-active-grants project ceiling, 16 KiB creation body and 1 MiB output ceiling. Reads spend the same two-per-second, burst-20 grant allowance and the parent's and workspace's request allowances. Counter outages say unchecked and unknown, never measured zero or known remaining capacity; current authorization outages refuse. Saved-result polling creates no measurement execution.

Observed reliability reads and previews

Observed customer reliability reads are available on every tier within installed technical history, current source permissions and the existing execution-query budget. They introduce no separate usage bill or declared reliability-specific paid allowance. Account owner and content policy checks still apply. A refused optional read is unavailable, never healthy.

A reliability preview describes a proposed person or account read. It is advisory and reserves nothing: no scan, execution query, scheduler slot or later authorization. Actual measurement uses the existing query operation budget. Preview metadata reads still follow the normal request allowance and activity recording. There is no separate usage price for observed reliability.

The normalized request fixes the service, exact selectors, definition, exclusions and absolute requested interval. Compare it with the disclosed effective interval and installed history floor. complete, partially_covered and outside_retention describe retained history. Partial reads measure only the effective interval; measurement_state=outside_history means no measurement because the requested interval is outside retention, not zero observed requests. Unknown history, unavailable execution and missing current authority are separate checks. A preview is no promise that a later read will run.

A small output page does not estimate the underlying work. Source rows, bytes, subject cardinality and used work remain unknown. Read the actual effective work limits when available; unavailable limits remain unavailable. The interactive window defaults to 24 hours and spans at most seven days. Rankings default to 25 results and cap at 100, with at most 2000 subject groups. Detail output caps at ten operations and five request references; explicit zero disables each optional output. p95 ranking requires at least 100 valid durations and p99 at least 1000, or a higher caller-supplied minimum. Exact details may show fewer samples with an insufficiency warning.

Four measurements accept at most 200 distinct --exclude-http-status integers from 400 through 599; the default set is empty. Exclusions remove attempts from both outcomes and latency, and must match between preview, execution and comparison. Account types and keys preserve exact UTF-8 bytes, up to 200 and 1024 bytes respectively, without NUL. Whole-window aggregation happens before sample qualification and paging; changing page size does not lower source work.

Effective work caps can tighten with the installed workload. Current operation ceilings are 10 million source rows, 256 MiB source bytes, 128 MiB memory, three source statements and ten seconds overall. Person row and byte caps apply per statement; account row and byte caps cover the composition, with each possible statement receiving at most one third. Read the preview's actual limits and work_caps.limit_basis for the installed selection. Overflow refuses the whole measurement. No partial source prefix is presented as a complete population.

Ranks are live, with whole eligible and excluded counts separate from page count. Continue with the original absolute window; late arrivals, erasure and identity changes can alter later pages. Operation and evidence legs have separate read boundaries and omitted counts. A disabled or unavailable leg has unknown omissions. See observed reliability and shared evidence limits.

Preview does not measure percentiles, traffic completeness, historical sampling, capture settlement, future capacity or delivery effects. Checked refusals and possible future refusals remain distinct. Optional profile withholding does not deny the base person measurement.

Account objective safety limits

Every tier permits at most 20 active exact account objectives per project, with cadence at least five minutes. Paused creation and metadata preview reserve no active slot. Source execution uses the existing organization admission (at most two heavy reads per organization and eight per serving instance), query budget and the stricter installed work limits. The objective count ceiling is one statement, ten million source rows, 512 MiB source bytes, 128 MiB memory and ten seconds of source execution within at most 30 seconds overall, shortened by a rule timeout or caller deadline. Results disclose effective limits; a small returned account does not establish a cheap scan. Overflow and timeout withhold decisions. These safety limits set no price or plan allowance. Strict activation additionally needs every required interval retained, settled and unsampled under accepted-intake history; unknown coverage is not evaluated, never healthy.

Account-value work

The following are provisional engineering ceilings, pending capacity qualification; they are not measured throughput, a service guarantee, included plan allowances or prices. The connection and automated-work catalog adds no separate account-value allowance or query charge. No customer-value dollar meter, financial ingestion charge or conversion is introduced. Existing request, query, export and agent-operation budgets still apply.

Exact job Provisional bound
Declaration import 500 unique rows and 1 MiB input; validate the complete file; no automatic splitting.
Server confirmation preview 4 MiB complete before and proposed content; ten-minute confirmation token.
Declaration list and export Default 20, maximum 100 rows; 1 MiB complete encoded page; current-page observations.
Requested financial window 90 days, absolute half-open timestamps; actual source retention can shorten it.
Identity context 150,000 exact aliases and 32 MiB combined input and returned context.
Account context 50,000 exact account keys and 32 MiB business context.
Selected error occurrences 3,000,000, before any display cut.
Observed model calls 1,000,000, with at most 50,000 distinct trace contexts.
Financial source work 20 million cumulative source and context rows, including refresh, validation and one reassembly.
Displayed account or ranked-issue rows Default 20, maximum 100; full source totals or ranking precede this cap.
Explicit or canonical issue union At most 100 canonical issues.
Incident case links At most 1,000 raw links and 1 MiB checked-link metadata, independently of the canonical-issue cap. Unsupported and duplicate raw links still consume work.
Account–issue matrix 100,000 distinct pairs, independently of the alias and account caps. One account across many issues still consumes pairs.
Accounted aggregation buffers 128 MiB, independent of matrix count; a large entry can refuse sooner.
Each source statement At most 10 seconds, 10 million scanned rows, 512 MiB read bytes and 128 MiB memory; limits throw rather than truncate.
End-to-end financial read Original 30-second deadline, including retry and context work and waiting; an earlier caller deadline wins.
Financial admission Two active jobs per organization within an owning read instance, four total in that instance, at most two seconds waiting. These are instance bounds, not a distributed organization-wide limit.

Each owner can refuse sooner under its applicable source, memory, query or plan budget. Source refusals identify the crossed limit in rows, read bytes, seconds or temporary bytes when it is known; an unidentified source limit does not claim a row overflow. Raw incident links, canonical issues, matrix pairs and bytes are independent dimensions, never substitutes for one another. Overflow, cancellation, failed source or repeated state drift returns no successful partial financial result. Do not split a refused exact union or import silently. A display limit cannot reduce the source work required for exact totals. See declared account value for coverage and interpretation.

Support story limits

support story defaults to 24 hours, maximum seven days; the end is exclusive and cannot be in the future. Threshold defaults to 3000 ms, each page to 20 rows, explicit limits 1–50. Complete aliases are bounded at 512; technical source scans at ten million rows and three seconds each, with at most two concurrent sources. A bound is disclosed, never converted to empty evidence. Continue one section using its issued cursor and unchanged absolute bounds, threshold and selection. These engineering bounds are not throughput or pricing promises. See Support story.

Recorded support complaint classification

The no-matching-report read checks at most 10,000 recorded contact facts, in twenty pages of 500, under a single three-second source budget. Exactly 10,000 requires complete exhaustion; a continuation excludes the whole source. Current identity verification has a separate bound of 250,000 distinct keys and 32 MiB. Exceeding either bound never produces sampled absence. Support facts expire 30 days after contact time. Backfilled recording does not extend that lifetime. These are read controls, not complete external support coverage or throughput promises.

Survey session correlation and identity coverage

Shown, response and dismissal calls accept an optional source session_id: at most 200 UTF-8 bytes, with unsafe identifier and control characters refused. Missing or empty means not collected. The first accepted operation keeps its original person, session and timestamp across retries; a later session cannot move it. Session correlation does not establish a recording or query visibility.

Delivery requires complete coverage of at most 100 unique linked visitor IDs. Above it, SURVEY_IDENTITY_COVERAGE_UNSUPPORTED refuses before a partial offer or outcome is written. A temporary identity outage is a retryable failure, separate from a valid empty offer. Person export and erasure retain their full identity selection. Multiple selected choices produce multiple pooled event rows; one accepted response is still one response.

Recorded contact bounds

A contact expires 30 days from its actual reported time, not recording or retry time. Future and already expired times refuse. Capacity is 1,000 new facts per project per rolling recording day and 30,000 retained rows, including minimal withdrawn outcomes. Preview creates no fact, admission or accepted write. Aliases are at most 256 bytes; passive account, ticket and contact coordinates are nonblank single-line UTF-8 at most 255 bytes each. Complete story identity is bounded to 512 aliases. These engineering controls promise neither throughput nor complete external support coverage.