Skip to main content
Both modules start the same way: one call, once, early, on the main thread. Each returns immediately.
enabled is the privacy opt in and it defaults to false. Collection is off until you turn it on, so ask the person using your app first, and pass their answer here rather than a literal true.

Where the SDK key comes from

1

Open Settings, SDK

In the console, Settings, then Project, then SDK (/settings/project/sdk).
2

Create a key

Keys are created there and shown once: only the hash is stored, so losing one means creating another, not recovering it.
3

Put it in the build, not the repository

It belongs in the app’s build configuration or a secret store. A revoked key is refused for any app still sending it.
The key is write only. It grants no read access and carries no user identity, and it is sent as the X-Orbit-Key header. There is no Authorization header anywhere on the ingest surface.

The ingest URL

ingestURL is the origin, with no path: the SDK appends /v1/ingest/vitals, /v1/ingest/events and /v1/ingest/policy itself. For the hosted console that is https://platform.parsaa.app/api/orbit.

CaptureConfiguration

The three fields that need two switches

replayEnabled and revenueEnabled are gated twice: your app opts in locally, and the project’s capture policy allows the surface in Settings, Telemetry. Neither side can turn one on alone, and the same is true in reverse: three lines of replay integration can sit in a build that never records a frame. appGroupIdentifier is the one that changes identity. Set it and the app and its extensions share one queue and one installation id, so a widget tap and the session it leads to are the same person.
logMessagesEnabled is a second opt in, and it deserves its own decision. os_log redaction protects a line from other processes; a process reading its own entries gets the private interpolations back in the clear, with no marker to test for. Turning it on is your statement that your error and fault lines carry nothing about a person.

VitalsConfiguration

The rest of the lifecycle

Attributes are scalars, by the compiler

Capture.track and Capture.setUser take strings, integers, doubles and booleans. A nested object, an array or a Data blob cannot be passed at all: it is a compile-time guarantee rather than a runtime check, so there is no shape of call that accidentally ships a payload.

Sending is still the server’s call

enabled says the SDK may send. Whether it does is the project’s capture policy, fetched from GET /v1/ingest/policy at start() and on a cadence after it. When that request fails, returns a non-2xx status or does not parse, the SDK falls back to capture disabled: nothing leaves the device without a server yes. See Capture policy.

What the SDK collects

What is automatic and what your app has to call.

Capture policy

The eight surfaces, sampling, targets, workflows and the kill switch.