No RUM events yet. Embed the rum.js snippet in your app.

<!-- One-line auto-init (endpoint inferred from script host) -->
<script src="http://YOUR_SOBS_HOST/static/rum.js?app=my-app"></script>

<!-- Feature-complete setup -->
<script src="http://YOUR_SOBS_HOST/static/rum.js"
        data-sobs-app="shop-web"
        data-sobs-endpoint="http://YOUR_SOBS_HOST/v1/rum"
        data-sobs-client-token-url="/internal/sobs/rum-client-token"></script>

<script>
  SOBS.init({
    endpoint: 'http://YOUR_SOBS_HOST/v1/rum',
    appName: 'shop-web',
    clientAuthTokenUrl: '/internal/sobs/rum-client-token',
    trackSPA: true,

    // Trace correlation + propagation
    traceparent: window.__TRACEPARENT__ || '',
    tracePropagationOrigins: ['https://api.example.com'],

    // Breadcrumb sizing
    consoleBufferSize: 20,
    breadcrumbBufferSize: 40,

    // Replay + optional screenshot capture for error events
    replay: {
      enabled: true,
      scriptUrl: 'https://cdn.jsdelivr.net/npm/rrweb@latest/dist/record/rrweb-record.min.js',
      maxEvents: 500,
      screenshot: {
        enabled: true,
        scriptUrl: 'https://cdn.jsdelivr.net/npm/html2canvas@1.4.1/dist/html2canvas.min.js',
        mimeType: 'image/jpeg',
        quality: 0.75,
        maxEdge: 1400
      },
      upload: async function (envelope) {
        const resp = await fetch('api/replay/upload', {
          method: 'POST',
          headers: { 'Content-Type': 'application/json' },
          body: JSON.stringify(envelope)
        });
        if (!resp.ok) throw new Error('Replay upload failed');
        // Expected: { replay: { id, url, provider }, artifact: { type, id, url } }
        return resp.json();
      }
    }
  });

  // Manual APIs (auto window.onerror/unhandledrejection are already enabled)
  SOBS.addBreadcrumb('checkout', 'Clicked Place Order', { step: 'payment' });
  SOBS.track('feature-flag', { flag: 'new-checkout', variant: 'B' });

  SOBS.setVisualContext({
    replay: { id: 'replay-123', url: 'https://example.com/replays/replay-123', provider: 'rrweb' },
    artifact: { type: 'screenshot', id: 'shot-123', url: 'https://example.com/artifacts/shot-123.png' },
    ttlMs: 15000,
    consumeOnce: true
  });

  try {
    throw new Error('Checkout confirmation failed');
  } catch (err) {
    SOBS.captureException(err, { errorSource: 'checkout-flow' });
  }

  // Additional helpers:
  // SOBS.setTraceParent('00-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-bbbbbbbbbbbbbbbb-01');
  // SOBS.setTraceContext('<trace-id-32-hex>', '<span-id-16-hex>');
  // SOBS.setReplayContext({ id: 'replay-123', url: 'https://.../replay-123', provider: 'rrweb' }, { ttlMs: 15000 });
  // SOBS.setArtifactContext({ type: 'screenshot', id: 'shot-123', url: 'https://.../shot-123.png' }, { ttlMs: 15000 });
  // SOBS.clearVisualContext();
  // SOBS.enableReplay({ enabled: true, scriptUrl: 'https://cdn.../rrweb-record.min.js' });
  // SOBS.disableReplay();
  // SOBS.setReplayUpload(async (envelope) => ({ replay: { id: 'r1', url: 'https://...', provider: 'rrweb' } }));
  // SOBS.setClientAuthToken('<short-lived-rum-token>');
</script>