Probes
Deliver bounded diagnostic checkpoints already instrumented in your application.
Probes deliver bounded checkpoints that application code already records with the SDK's probe method. Instrument and deploy the label and safe data first. Remote activation can then ship future matching observations independently, subject to capture policy, tier, expiry, sampling and delivery limits.
Use probes when an incident needs a specific technical observation, such as the stage of a media decode, an observed session state, a job dependency result or a cache hit/miss. New checkpoints require an application change and deployment. Activation does not inject code or collect arbitrary local variables or heap dumps.
How Probes Work
API, CLI, or MCP
Activate
Create a probe with a label pattern, service filter, environment filter, and TTL.
Store
DebugBundle stores the activation and returns the current directive state.
Distribute
SDKs receive probe directives through config polling and ingestion responses.
Collect
A future call to an existing matching probe label records the instrumented data.
Bundle
Probe data appears in context.probe_data when related incidents are bundled.
- Activate — You create a probe via API, CLI, or MCP with a label pattern, service filter, and TTL.
- Distribute — Backend SDKs poll
GET /v1/sdk/configwith ETags; browser and mobile SDKs use a bounded startup/lifecycle config check plusprobe_directivespiggybacked on successfulPOST /v1/eventsresponses. - Collect — When instrumented code executes a matching probe, the SDK may emit
a standalone
probe_eventwhen policy permits, while retaining its documented always-on buffering and error-flush behaviour. - Enrich — Enriched data arrives with subsequent events and is included in the
context.probe_datasection of bundles. - Expire — The probe automatically deactivates after its TTL expires.
If a project downgrades to Free, saved remote probe activations remain visible in the management surfaces so owners can see what will resume after upgrading again. They do not continue shipping while the lower tier is active.
Probe Configuration
| Parameter | Description | Default |
|---|---|---|
label_pattern | Pattern matching instrumented probe labels (e.g., auth.*, payment.checkout) | — (required) |
service | Scope to a specific service name | All services |
environment | Scope to a specific environment | All environments |
ttl_seconds | Passive remote activation lifetime, max 3600 seconds | — (required) |
trigger_ttl_seconds | Trigger token validity window | Same as ttl_seconds |
Label Pattern Matching
| Pattern | Matches |
|---|---|
* | All instrumented probe labels |
auth.* | auth.login, auth.token.expired, etc. |
payment.checkout | Exactly payment.checkout |
Probe Data in Bundles
Probe-collected data appears in the context.probe_data section of the bundle:
{
"context": {
"probe_data": {
"version": 1,
"items": [
{
"label": "auth.session.checkpoint",
"data": {
"stage": "refresh",
"has_session": false,
"result": "session_missing",
"attempt": 1
},
"timestamp": "2026-03-24T11:05:00Z",
"activation_id": "11111111-1111-4111-8111-111111111111"
}
]
}
}
}Bounded checkpoint recipes
Choose fixed labels, allowlisted technical states, booleans, counts or coarse buckets. Record observations the application actually checked. Keep names, customer or job identifiers, tokens, cookies, cache keys, media URLs, form values and raw payloads out of checkpoint data.
| Checkpoint | Example safe data | Question it can answer |
|---|---|---|
media.preview.checkpoint | stage: "decode", input_kind: "uploaded", attempt: 1 | Which instrumented processing stage ran? |
auth.session.checkpoint | stage: "refresh", has_session: false, result: "session_missing" | What session condition did the application observe? |
job.dependency.checkpoint | dependency: "media_store", attempt: 2, result: "timeout" | Which named dependency step failed? |
cache.preview.checkpoint | result: "miss", age_bucket: "stale" | Did this checkpoint observe a hit, miss or stale result? |
A successful HTTP status or a completed attempt alone does not establish semantic recovery. The application must check the required state explicitly.
Built-in evidence and probe instrumentation
Built-in collectors populate ordinary error, runtime or device evidence according to the installed SDK and its settings. Probe activation delivers the data supplied by instrumented checkpoints. Check the exact installed SDK and wrapper versions before relying on a collector.
| SDK | Available built-in evidence to check |
|---|---|
| Node.js | Node/process facts and retained JavaScript error stacks. |
| Browser | Browser/device facts and enabled breadcrumbs or native browser error metadata. |
| Python | Python/process facts and available native tracebacks. |
| PHP | PHP/runtime facts and available Throwable or shutdown error information. |
| WordPress | Evidence from the exact bundled PHP and Browser SDK versions. |
| Java | JVM/process facts and retained Java exception traces. |
| Go | Go runtime facts and retained panic/capture stacks; ordinary Go errors do not contain a throw stack. |
| Ruby | Ruby/process facts and available Ruby backtraces. |
| .NET | Managed runtime/process facts and available managed exception traces. |
| Android | App/device facts and supported, enabled exception, crash or ANR records. |
| Swift/iOS | App/device facts and supported error/crash records; Swift Error has no universal throw stack or cause accessor. |
| React Native | JavaScript engine/device facts and supported native-bridge records, preserving the authored JavaScript identity. |
When probe data is empty
An empty section means this bundle contains no matching retained checkpoint observation for its selected sample/window. It does not prove that every SDK received an activation, that no matching label exists, or that the checkpoint ran. Verify the deployed instrumentation/version, label and service/environment scope, expiry, capture policy, sampling and delivery receipts before drawing a conclusion. Activation cannot recover measurements that were never retained.
Limits
| Constraint | Limit |
|---|---|
| Max concurrent remote activations per project | 5 |
| Passive probe activation TTL | 1 hour max |
| Probe directive refresh interval | Backend default 60 seconds; browser zero-polling; mobile bounded lifecycle refresh |
| Trigger token validity | Configurable up to 24 hours |
Trigger Token
When you activate a probe, the API returns a trigger_token. This token is shown
exactly once at creation time — store it immediately.
The trigger token lets SDKs activate matching probes for a specific request or session
without waiting for passive directive refresh. SDKs validate dbundle_probe_... tokens
locally with the trigger_token_key from GET /v1/sdk/config, check expiry, and silently
ignore invalid tokens.
Managing Probes
| Interface | Reference |
|---|---|
| Web app | Project Probes tab |
| API | Probes API |
| CLI | CLI Cloud Workflow |
| MCP | MCP Workflows |
Next Steps
- Probes API — Activate, list, and deactivate probes
- Bundles — How probe data enriches bundles
- Universal SDK Interface — SDK probe support