Data Collection
Configuration for what data SDKs collect by default, including technical context, PII, and sensitive data.
This spec defines how SDKs control what data is collected automatically from the runtime (device, requests, responses, user context). It replaces the single sendDefaultPii (or platform-equivalent) flag with a structured dataCollection configuration so users can enable or restrict collection by category and by field.
Previously, sendDefaultPii acted as a broad binary toggle that controlled a wide range of data types without offering granular control. The new dataCollection configuration collects rich context for debugging by default — including user identity and HTTP bodies — while giving users granular control to opt out of any category or field.
Related specs:
- Data Scrubbing — structuring data for scrubbing (spans, breadcrumbs), variable size limits
- Client — client lifecycle and event pipeline
- Configuration — top-level init options including
send_default_pii(deprecated in favor of this spec)
Collected data is grouped into three sensitivity levels. These levels form the organizing principle for dataCollection defaults and user configuration.
Non-identifying context used for debugging and performance. Examples include, but are not limited to:
- Device and environment context (OS, runtime, non-PII identifiers)
- Performance and error context (stack frames, breadcrumbs, span metadata)
- Framework/routing context where it does not contain PII or secrets
- Generative AI metadata (model name, token counts, tool names, etc.)
- Generative AI inputs and outputs (system instructions, prompt content, tool definitions, completion content)
For the full list of supported context types (device, OS, runtime, app, browser, GPU, culture, cloud resource, memory info, and more), see the Contexts Interface.
Personally Identifiable Information (PII) or user-linked data. Examples include, but are not limited to:
- Identity (name, email, user ID, username)
- Contact (email, phone number, address)
- IP address
- Cookies and headers that identify the user or session
- HTTP request data or database query parameters (TBD)
- Arguments passed to tasks within a queue
For context types that may carry PII fields (e.g. device_unique_identifier in Device Context, or fields in the User Interface), see the linked specs.
Credentials and secrets that must never be sent by default. Examples include, but are not limited to:
- Passwords, tokens, API keys, bearer tokens
- Header or cookie values matching known sensitive names (auth, token, secret, password, key, jwt, etc.)
For the canonical list of terms used to detect sensitive values at collection time, see the Sensitive Denylist in this spec.
All data-collection options reside under a single top-level key: dataCollection. Each option has a fixed default and is independent of all other options. Users MAY supply only the options they want to override; the SDK MUST apply the documented defaults for any omitted fields.
SDKs MUST support at least the userInfo option, key-value collection modes, HTTP header collection, body type collection, and Boolean option types defined in Option Types. SDKs MAY omit body types that do not apply to their platform (e.g., a client-only SDK MAY omit "incomingRequest" and "outgoingResponse" from the httpBodies array).
The three sensitivity levels determine whether data is collected by default:
- Technical Context Data: SDKs SHOULD collect this data automatically. This level is not gated by any
dataCollectionoption. - PII Data: SDKs SHOULD automatically populate user identity fields (
user.*) by default. Users can set theuserInfooption tofalseto opt out. SeedataCollectionOptions. - Sensitive Data: SDKs MUST never send sensitive values through automatic instrumentation. Values for keys matching the denylist MUST be replaced with
"[Filtered]"; key names are always retained. Users can usebeforeSend(or equivalent) to remove or redact keys if needed. See Sensitive Denylist.
SDK documentation MUST document the default value and behavior of each dataCollection option.
All SDK initialization code snippets (including documentation examples, onboarding flows, and CLI wizard output) MUST include a commented-out dataCollection override that disables userInfo and httpBodies. The comment MUST include a URL linking to the full dataCollection documentation matching the specific platform or guide.
init({
dsn: "...",
// To disable sending user data and HTTP bodies, uncomment the line below. For more info visit:
// https://docs.sentry.io/platforms/javascript/configuration/options/#dataCollection
// dataCollection: { userInfo: false, httpBodies: [] },
})
init({
dsn: "...",
// To disable sending user data and HTTP bodies, uncomment the line below. For more info visit:
// https://docs.sentry.io/platforms/javascript/configuration/options/#dataCollection
// dataCollection: { userInfo: false, httpBodies: [] },
})
For key-value data (HTTP headers, cookies, URL query params), key names are always included in the event. SDKs MUST apply a sensitive denylist to decide which values are sent in plaintext and which the SDK replaces with "[Filtered]". The denylist matches on key name. The SDK never removes or redacts keys themselves.
SDKs MUST perform a partial, case-insensitive match when comparing key names against the denylist. A key is treated as sensitive if any denylist term appears as a substring in the key name (e.g., the term auth matches Authorization and X-Auth-Token).
The following terms MUST be included in the sensitive denylist and applied to headers, cookie names, and query param keys. For cookies and URL query params that arrive as an unparsed string, see Cookies and URL Query Params.
["auth", "token", "secret", "password", "passwd", "pwd", "key", "jwt", "bearer", "sso", "saml", "csrf", "xsrf", "credentials", "session", "sid", "identity"]
Values for keys that match MUST be replaced with "[Filtered]".
The sensitive denylist covers credentials and secrets. Some headers additionally carry user-identifying information (IP address, user ID, origin host) without being credentials. If an application is subject to GDPR or similar privacy regulations, users can add these terms via a deny list for cookies, httpHeaders, and urlQueryParams.
The list of case-insensitive, partial-match terms SHOULD be documented in the user documentation of the respective SDK:
["forwarded", "-ip", "remote-", "via", "-user"]
Examples of headers matched by these terms: x-forwarded-for, x-real-ip, cf-connecting-ip, remote-addr, x-user-id.
init({
dataCollection: {
httpHeaders: {
request: { mode: "denyList", terms: ["forwarded", "-ip", "remote-", "via", "-user"] },
response: { mode: "denyList", terms: ["forwarded", "-ip", "remote-", "via", "-user"] },
},
cookies: { mode: "denyList", terms: ["forwarded", "-ip", "remote-", "via", "-user"] },
urlQueryParams: { mode: "denyList", terms: ["forwarded", "-ip", "remote-", "via", "-user"] },
},
})
init({
dataCollection: {
httpHeaders: {
request: { mode: "denyList", terms: ["forwarded", "-ip", "remote-", "via", "-user"] },
response: { mode: "denyList", terms: ["forwarded", "-ip", "remote-", "via", "-user"] },
},
cookies: { mode: "denyList", terms: ["forwarded", "-ip", "remote-", "via", "-user"] },
urlQueryParams: { mode: "denyList", terms: ["forwarded", "-ip", "remote-", "via", "-user"] },
},
})
URL strings in span descriptions follow the format defined in Structuring Data: METHOD scheme://host/path — query strings and fragments are excluded.
The urlQueryParams option controls query parameter filtering wherever query strings appear — including url.full, url.query, and request.query_string. url.path and the span description are unaffected since they never contain query strings. For general data scrubbing rules (variable size limits, structuring for server-side scrubbing), see Data Scrubbing.
Encoded query parameters MUST be stored exactly as they appear in the URL.
Example: Given a request to https://example.com/api/users?token=abc123&q=a%20b%26c&page=5:
| Attribute | urlQueryParams enabled | urlQueryParams off |
|---|---|---|
| Span description | GET https://example.com/api/users | same |
url.full | https://example.com/api/users?token=[Filtered]&q=a%20b%26c&page=5 | https://example.com/api/users |
url.path | /api/users | same |
url.query | token=[Filtered]&q=a%20b%26c&page=5 | not collected |
request.query_string | token=[Filtered]&q=a%20b%26c&page=5 | not collected |
Cookies and URL query params may arrive as a single unparsed string (e.g., Cookie: user_session=abc; theme=dark-mode) rather than pre-split key-value pairs. SDKs MAY handle both cases:
When the string can be parsed into individual key-value pairs, apply the denylist per-key.
For cookies: the rules and terms as specified in cookies in the dataCollection configuration apply to cookie names. The SDK replaces values for sensitive keys with "[Filtered]" while keeping non-sensitive values as-is. This selective filtering retains harmless contextual information for debugging while protecting sensitive fields.
For example, a Cookie header parsed into individual cookies:
http.request.header.cookie.user_session: "[Filtered]" // matches "session" in sensitive denylist
http.request.header.cookie.theme: "dark-mode" // not sensitive — value sent as-is
http.request.header.set_cookie.theme: "light-mode" // not sensitive — value sent as-is
http.request.header.cookie.user_session: "[Filtered]" // matches "session" in sensitive denylist
http.request.header.cookie.theme: "dark-mode" // not sensitive — value sent as-is
http.request.header.set_cookie.theme: "light-mode" // not sensitive — value sent as-is
For URL query parameters: the rules and terms as specified in urlQueryParams in the dataCollection configuration apply to query parameters. The SDK replaces values for sensitive keys with "[Filtered]" while keeping non-sensitive values as-is (see URLs).
When individual key-value pairs cannot be extracted (e.g., malformed or opaque cookie string), the entire Cookie or Set-Cookie header value MUST be replaced with "[Filtered]". This value is used as a fallback:
http.request.header.cookie: "[Filtered]" // fallback: cookie header could not be parsed
http.request.header.cookie: "[Filtered]" // fallback: cookie header could not be parsed
Unfiltered, raw cookie header values MUST NOT be sent. When in doubt, treat the entire cookie header as sensitive and use the fallback.
When bodies are collected via the httpBodies option (enabled by default; see Body Type Collection):
- Parseable as JSON or form data: SDKs MAY extract key-value pairs and apply the same denylist rules to keys. Values for matching keys MUST be replaced with
"[Filtered]". This allows selective scrubbing while retaining non-sensitive fields. - Not parseable (raw bodies): The body MUST NOT be attached to the event. When the SDK cannot parse the body into a key-value structure, the entire body MUST be replaced with
"[Filtered]".
No built-in option scrubs keys; users who need to hide header or cookie names MUST use beforeSend (or equivalent).
The global dataCollection object is the single source of truth for data collection. SDKs SHOULD NOT require users to configure data collection in multiple places.
However, some integrations collect data that warrants independent control. For example, a Replay integration that captures network requests, or when every AI integration should capture generative AI inputs and outputs case-by-case. These integrations MAY expose their own options for controlling which data they collect. Integrations are not required to use the same option names or structure as the global dataCollection object. They SHOULD use whatever is most natural for their API surface.
When an integration exposes data-collection options, the values set on the integration MUST take precedence over the corresponding global dataCollection values for the data that integration collects.
Session Replay is not gated by dataCollection (or its predecessor sendDefaultPii). It is a privacy-sensitive feature with its own opt-in privacy model — by default it masks all text, images, and user input — which is the opposite of the dataCollection opt-out model. Wiring the two together would flip privacy-sensitive defaults for the majority of existing Replay users and create confusion about which layer controls masking.
Because of this, SDKs MUST NOT change what Session Replay captures based on dataCollection. Replay's masking and network-capture behavior MUST continue to be controlled exclusively by the Replay integration's own privacy options. SDK documentation SHOULD explicitly state that dataCollection does not affect Session Replay so users are not surprised by the exception.
Data explicitly set by the user on the scope (user, request, response, tags, contexts, etc.) or on a span, log, or other telemetry is not gated by dataCollection. It MUST always be attached to outgoing telemetry. This also applies to data provided via beforeSend or event processors.
SDKs SHOULD only replace sensitive values with "[Filtered]" when the data is gathered automatically through instrumentation. If the user explicitly provides data (e.g., by setting a request object on the scope), the SDK MUST NOT modify it; the user is responsible for the data they attach.
Users can register callbacks (e.g., beforeSend, event processors) to remove or redact any data (including keys) before events are sent. This spec does not replace those hooks; they remain the primary mechanism for custom filtering and key removal.
dataCollection (and its predecessor sendDefaultPii) guards writing data to the scope through auto-instrumentation. It does not guard reading data from the scope when attaching it to outgoing telemetry (events, logs, metrics, etc.).
Concretely:
- Auto-instrumentation writes to scope — When SDK instrumentation automatically populates scope data (e.g., inferring
user.ip_addressfrom an HTTP request), the write MUST be gated by the relevantdataCollectionoption (e.g.,userInfo). If the option is disabled, the SDK MUST NOT write that data to the scope. - Reading from scope to attach to telemetry — When the SDK reads data already present on the scope to attach it as attributes on logs, metrics, or other telemetry, it MUST NOT re-apply
dataCollectiongating. The data was already accepted at write time. - User-set data — Data the user explicitly sets (e.g., via
Sentry.setUser(),scope.setTag(), or direct attribute assignment) is never gated bydataCollection. The user has made a deliberate choice to include that data.
This means if a user calls Sentry.setUser({ email: "jane@example.com" }), that email MUST appear on logs, metrics, and events regardless of dataCollection.userInfo or sendDefaultPii. The gate only applies to auto-instrumentation that would populate user fields without the user's explicit action.
Each option in dataCollection maps to a single category of automatically collected data. This spec defines the behavioral requirements for each option type. SDKs implement these behaviors using whatever types and patterns are idiomatic for their language.
Boolean Options — used where data cannot be meaningfully filtered at the key level. The SDK either collects the entire category or skips it.
| Value | Behavior |
|---|---|
true | Collect and attach this data category. |
false | Do not collect this data category. |
For key-value data (cookies, headers, URL query params), key names are always included in the event. SDKs MUST support the following collection modes to control which values are sent in plaintext vs. replaced with "[Filtered]":
| Mode | Behavior |
|---|---|
| Off | Do not collect this category at all — no keys or values are attached. |
| DenyList (default) | Collect all key names and values. Replace values for keys matching the built-in sensitive denylist with "[Filtered]". When additional terms are provided, they extend the built-in denylist. |
| AllowList | Collect all key names. Only keys in the provided terms list send their real value; all others are replaced with "[Filtered]". Sensitive denylist scrubbing still applies — keys matching a sensitive pattern are always scrubbed even if they appear in the allow list. |
DenyList and AllowList modes are mutually exclusive. The type SHOULD make it impossible to set both simultaneously.
Reference type:
struct KeyValueCollectionBehavior {
mode: "off" | "denyList" | "allowList" // default: "denyList"
terms?: string[] // deny or allow terms depending on mode; omit when mode is "off" or when
// using denyList mode with only the built-in denylist
}
struct KeyValueCollectionBehavior {
mode: "off" | "denyList" | "allowList" // default: "denyList"
terms?: string[] // deny or allow terms depending on mode; omit when mode is "off" or when
// using denyList mode with only the built-in denylist
}
| Example | Equivalent behavior |
|---|---|
{ mode: "denyList" } or omitted | Collect all. Built-in denylist scrubs sensitive values. |
{ mode: "off" } | Do not collect — no keys or values attached. |
{ mode: "denyList", terms: ["x-custom"] } | Collect all. Built-in denylist + "x-custom" scrub values. |
{ mode: "allowList", terms: ["x-request-id"] } | Only x-request-id sends its real value; all others filtered. |
SDKs MUST allow users to configure request and response header collection independently. Each direction supports the same key-value collection modes described above.
Reference type:
httpHeaders: {
request?: KeyValueCollectionBehavior // default: { mode: "denyList" }
response?: KeyValueCollectionBehavior // default: { mode: "denyList" }
}
httpHeaders: {
request?: KeyValueCollectionBehavior // default: { mode: "denyList" }
response?: KeyValueCollectionBehavior // default: { mode: "denyList" }
}
SDKs MAY additionally accept a single KeyValueCollectionBehavior for httpHeaders (applying to both directions) as a language-specific shorthand.
SDKs MUST support configuring body collection for specific body types. The option accepts an array of body type strings. An omitted array defaults to all body types valid for the platform; an empty array ([]) collects no bodies and is the explicit opt-out.
Valid body type values: "incomingRequest", "outgoingRequest", "incomingResponse", "outgoingResponse".
Body collection MAY not support allow/deny filtering. Unlike cookies or headers, body content has no predictable key structure for the SDK to filter at collection time. The entire body is either collected (and scrubbed based on the key if parseable as JSON or form data) or not. Body data can still be redacted in beforeSend or event processors if needed.
The stackFrameVariables option accepts a Boolean by default (true collects all local variables, false collects none). SDKs MUST also accept a KeyValueCollectionBehavior to filter which variables are sent by name. Filtering follows the same collection modes as Key-Value Collection Behavior, matching against variable names.
Filtering by variable name requires the developer to know the variable names as they appear after bundling. Minifiers and other build-time transforms frequently rename local variables (e.g., password becomes a), so allow/deny terms configured against source names may not match the names captured at runtime. Prefer the Boolean form unless you have verified the post-bundle variable names for your build.
Pass the dataCollection option to the SDK's init function. All fields are optional and omitted fields MUST use the documented default.
struct KeyValueCollectionBehavior {
mode: "off" | "denyList" | "allowList" // default: "denyList"
terms?: string[]
}
init({
dataCollection: {
userInfo?: boolean, // default: true
cookies?: KeyValueCollectionBehavior, // default: { mode: "denyList" }
httpHeaders?: {
request?: KeyValueCollectionBehavior, // default: { mode: "denyList" }
response?: KeyValueCollectionBehavior, // default: { mode: "denyList" }
},
httpBodies?: string[], // default: all valid body types
urlQueryParams?: KeyValueCollectionBehavior, // default: { mode: "denyList" }
graphQL?: {
document?: boolean, // default: true
variables?: boolean, // default: true
},
genAI?: {
inputs?: boolean, // default: true
outputs?: boolean, // default: true
},
databaseQueryData?: boolean, // default: true
queues?: boolean, // default: true
stackFrameVariables?: boolean | KeyValueCollectionBehavior, // default: true
frameContextLines?: integer, // default: 5 (see boolean fallback below)
},
})
struct KeyValueCollectionBehavior {
mode: "off" | "denyList" | "allowList" // default: "denyList"
terms?: string[]
}
init({
dataCollection: {
userInfo?: boolean, // default: true
cookies?: KeyValueCollectionBehavior, // default: { mode: "denyList" }
httpHeaders?: {
request?: KeyValueCollectionBehavior, // default: { mode: "denyList" }
response?: KeyValueCollectionBehavior, // default: { mode: "denyList" }
},
httpBodies?: string[], // default: all valid body types
urlQueryParams?: KeyValueCollectionBehavior, // default: { mode: "denyList" }
graphQL?: {
document?: boolean, // default: true
variables?: boolean, // default: true
},
genAI?: {
inputs?: boolean, // default: true
outputs?: boolean, // default: true
},
databaseQueryData?: boolean, // default: true
queues?: boolean, // default: true
stackFrameVariables?: boolean | KeyValueCollectionBehavior, // default: true
frameContextLines?: integer, // default: 5 (see boolean fallback below)
},
})
| Key | Option Type | Default | Since | Description |
|---|---|---|---|---|
userInfo | Boolean | true | 0.1.0 | Automatically populate user.* fields (user.id, user.email, user.username, user.ip_address) from auto-instrumentation (e.g., inferring user.ip_address from an incoming HTTP request, or deriving user identity from framework session/auth context). Does not gate data explicitly set via Sentry.setUser(), which is always attached (see User-Set Data and Scrubbing). Does not affect any other data category. Default changed to true in 0.2.0. |
cookies | Key-value collection | { mode: "denyList" } | 0.1.0 | Collect cookies. All key names are always included; the SDK scrubs values for keys matching the sensitive denylist or custom allow/deny terms. |
httpHeaders | { request?, response? } | Both { mode: "denyList" } | 0.1.0 | Collect HTTP headers. Configure request and response independently using key-value collection modes. All key names are always included. |
httpBodies | string[] (body types) | all valid body types | 0.1.0 | List of body types to collect. Omitted = all body types valid for the platform; empty array ([]) = off. Valid values: "incomingRequest", "outgoingRequest", "incomingResponse", "outgoingResponse". Default changed from [] (off) to all valid body types in 0.2.0. |
urlQueryParams | Key-value collection | { mode: "denyList" } | 0.8.0 | Collect URL query parameters. All key names are always included; the SDK scrubs values for keys matching the sensitive denylist or custom allow/deny terms. |
graphQL | { document?, variables? } | Both true | 0.5.0 | For document: Collect the GraphQL document. For variables: Collect the variables that are passed to GraphQL operations. |
genAI | { inputs?, outputs? } | Both true | 0.1.0 | For inputs: Include the content of generative AI inputs. This gates system instructions, prompt messages, tool definitions, and tool call arguments. For outputs: Include the content of generative AI outputs (e.g. completion text, tool call results). Metadata such as model name and token counts is always collected regardless of these settings. |
databaseQueryData | Boolean | true | 0.6.0 | Include data that's associated with database queries. This controls collection of bound query parameters, data payloads for write operations, and returned result data. Sanitized or parameterized DB statements ( db.query.text) are not controlled by this property. Structural metadata such as the database system, query summary, operation name, or the table being acted upon is also always collected. |
queues | Boolean | true | 0.7.0 | Include arguments passed to tasks within queues. |
stackFrameVariables | Boolean or key-value collection | true | 0.1.0 | Include local variable values captured within stack frames. Accepts a Boolean (true collects all variables, false collects none) or a KeyValueCollectionBehavior to filter which variables are sent by name (see Filtering Stack Frame Variables). Key-value collection added in 0.9.0. |
frameContextLines | Integer (Boolean fallback) | 5 (true) | 0.1.0 | Number of source code lines to include above and below each stack frame. Boolean fallback: Not all platforms support integer configuration values. SDKs MAY accept a boolean, where true is equivalent to the platform default (typically 5) and false is equivalent to 0 (no context lines). SDKs SHOULD prefer accepting an integer when their platform supports it. |
Omitting dataCollection entirely is equivalent to passing an empty object — the SDK applies all defaults:
init({ dsn: "..." });
init({ dsn: "..." });
Result: Cookies, headers, URL query params, HTTP bodies, generative AI inputs/outputs, stack frame variables, and user identity fields (user.*) are all collected. The sensitive denylist scrubs sensitive values.
Opt out of automatic population of user.* fields from instrumentation:
init({
dsn: "...",
dataCollection: { userInfo: false },
});
init({
dsn: "...",
dataCollection: { userInfo: false },
});
Result: The SDK no longer populates user.id, user.email, user.username, or user.ip_address from instrumentation sources. User data explicitly set via Sentry.setUser() is still attached. All other options use their defaults.
All valid body types are collected by default. Pass a narrower list to collect only specific body types:
init({
dsn: "...",
dataCollection: { httpBodies: ["incomingRequest"] },
});
init({
dsn: "...",
dataCollection: { httpBodies: ["incomingRequest"] },
});
To disable body collection entirely, pass an empty array:
init({
dsn: "...",
dataCollection: { httpBodies: [] },
});
init({
dsn: "...",
dataCollection: { httpBodies: [] },
});
All header key names are always present in events. This configuration sends real values only for the listed headers; every other header value is replaced with "[Filtered]":
init({
dsn: "...",
dataCollection: {
httpHeaders: { allow: ["x-request-id", "x-trace-id", "content-type"] },
},
});
init({
dsn: "...",
dataCollection: {
httpHeaders: { allow: ["x-request-id", "x-trace-id", "content-type"] },
},
});
Extend the sensitive denylist with GDPR-sensitive headers that may carry user-identifying information:
init({
dsn: "...",
dataCollection: {
httpHeaders: { deny: ["forwarded", "-ip", "remote-", "via", "-user"] },
cookies: { deny: ["forwarded", "-ip", "remote-", "via", "-user"] },
urlQueryParams: {
deny: ["forwarded", "-ip", "remote-", "via", "-user"],
},
},
});
init({
dsn: "...",
dataCollection: {
httpHeaders: { deny: ["forwarded", "-ip", "remote-", "via", "-user"] },
cookies: { deny: ["forwarded", "-ip", "remote-", "via", "-user"] },
urlQueryParams: {
deny: ["forwarded", "-ip", "remote-", "via", "-user"],
},
},
});
sendDefaultPii: true(legacy) → omitdataCollectionentirely; the new defaults already populateuser.*and collect HTTP bodies. Add overrides only to restrict collection.sendDefaultPii: false(legacy) → opt out of the categories the new defaults collect.
The new defaults collect more data than either legacy setting did. User identity, generative AI content, and HTTP request/response bodies are now on by default, and more HTTP headers and cookies are collected. This config restricts collection to roughly match the previous behavior of sendDefaultPii: false:
init({
dsn: "...",
dataCollection: {
userInfo: false,
httpBodies: [],
graphQL: {
document: false,
variables: false,
},
genAI: {
inputs: false,
outputs: false,
},
databaseQueryData: false,
queues: false,
httpHeaders: { deny: ["forwarded", "-ip", "remote-", "via", "-user"] },
cookies: { deny: ["forwarded", "-ip", "remote-", "via", "-user"] },
urlQueryParams: {
deny: ["forwarded", "-ip", "remote-", "via", "-user"],
},
},
});
init({
dsn: "...",
dataCollection: {
userInfo: false,
httpBodies: [],
graphQL: {
document: false,
variables: false,
},
genAI: {
inputs: false,
outputs: false,
},
databaseQueryData: false,
queues: false,
httpHeaders: { deny: ["forwarded", "-ip", "remote-", "via", "-user"] },
cookies: { deny: ["forwarded", "-ip", "remote-", "via", "-user"] },
urlQueryParams: {
deny: ["forwarded", "-ip", "remote-", "via", "-user"],
},
},
});
| Version | Date | Summary |
|---|---|---|
0.11.0 | 2026-07-30 | Require encoded URL query parameters to be stored exactly as they appear in the URL. |
0.10.0 | 2026-07-29 | Clarify that Session Replay is not gated by `dataCollection` or `sendDefaultPii` due to opposing defaults (opt-in vs. opt-out). |
0.9.1 | 2026-07-29 | Clarify that `genAI.inputs` gates system instructions in addition to prompt messages and tool call arguments/definitions. |
0.9.0 | 2026-07-21 | Allow `stackFrameVariables` to accept a `KeyValueCollectionBehavior` for filtering by variable name in addition to the Boolean default. |
0.8.0 | 2026-07-13 | Update name of `queryParams` to `urlQueryParams` to reduce ambiguity with other query types. |
0.7.0 | 2026-07-08 | Include configuration for queue/tasks data. Modify database config to accept a boolean value instead of a map of key/values. Update name of `graphql` to `graphQL` |
0.6.0 | 2026-06-29 | Include configuration for database queries. |
0.5.0 | 2026-06-26 | Include configuration options for controlling the inclusion of graphql documents and variables. |
0.4.0 | 2026-06-12 | Added documentation requirements for default behavior and setup snippet opt-out comment with link to full dataCollection docs. |
0.3.0 | 2026-06-05 | Promoted to candidate following the initial JavaScript SDK implementation. Version stays `0.x` until the contract is frozen at `stable`. |
0.2.0 | 2026-06-05 | Collect more data by default. `userInfo` now defaults to `true` and `httpBodies` now defaults to all valid body types. Both can be disabled to opt out. |
0.1.0 | 2025-03-05 | Initial spec; dataCollection config, three data sensitivity levels, cookies/headers denylist, replace sendDefaultPii. |
Our documentation is open source and available on GitHub. Your contributions are welcome, whether fixing a typo (drat!) or suggesting an update ("yeah, this would be better").