Pulsar is a generic HTTP web_fetch API on sgapps.io. Externaltools call sgapps.io, which forwards the request to a device from thecaller's own android-bridge fleet, and returns the first agent's answer.
sgapps.io is orchestrator, not fetcher. Every HTTP request leaves the Internet from one of the caller's Android devices, not from sgapps.io. This is what makes Pulsar an over-NAT proxy mesh with billing-per-request semantics.
┌─────────────┐ POST /pulsar/api/fetch ┌───────────────────┐
│ Any HTTP │ ─────────────────────────────▶│ sgapps.io │
│ client │ ◀─── {jobId, retryAfterMs}────│ services/pulsar │
└─────────────┘ └─────────┬─────────┘
│ enqueue
▼
androidBridge.pulsarJobs
▲
┌───────────────────────────────────────────────────────┴─────────┐
│ Agent carrier (one of): │
│ - Android device · AB Desktop · preset "pulsar/web-fetch" │
│ - Android device · AB Desktop · homepage = /pulsar/agent/ui │
│ - Operator PC · standalone browser (Chrome/Chromium/Firefox) │
│ │
│ - loads /pulsar/agent/ui (constant URL — no token) │
│ - identifies itself by `bid` (AB buildIdentifier or │
│ `browser-<hex>` from localStorage.pulsar.identity) │
│ - polls /pulsar/agent/api/claim │
│ - executes fetch() with the agreed timeouts + headers │
│ - POSTs /pulsar/agent/api/callback │
└─────────────────────────────────────────────────────────────────┘X is dispatched ONLY
to devices that have X in their owners[] array (android-bridge
model). No cross-tenant leakage by construction.≤ 1 MiB (reject with 413 above).≤ 2 MiB default; cropped at the agent and re-
cropped defensively on the server with result.cropped: true.androidBridge.accountStats under the owner's _id
(pulsarJobsTotal, pulsarBytesInTotal, pulsarBytesOutTotal,
…) and (M8.c) pulsarUsageDaily per {userId, date}. Soney
charges against the wallet are emitted by a separate biller
(M10/M11) that reads these counters — pulsar itself touches no
money state.