What Org Launcher Calls
Every request the app makes, and which API version it asks for
If your security team wants to know what this app talks to, this page is the answer.
Org Launcher never asks for a Salesforce password and never stores one. It uses the login the Salesforce CLI already holds on your Mac. When a feature needs to call Salesforce directly, the app asks the CLI for that login. The token it gets back is kept in memory while the app runs, and is never written to disk, never written to a log, and never sent anywhere except the org it came from.
Three features never handle a token at all — Storage and Limits, Setup Audit Trail, and Inspect Changes. They ask the Salesforce CLI to do the work and read back the result.
Which API version
One version is used for everything the app calls directly, and your org
chooses it, not the app. It is the version the Salesforce CLI reports for that
org. If the CLI does not report one, the app uses 62.0. Paths are built as
<your instance>/services/data/v<version>/…
Three things sit outside that rule: paging links come back from Salesforce already formed, so the app follows them exactly as given; retrieving metadata for Inspect Changes is pinned to 62.0; and the Salesforce Trust status service has its own version, v1, which has nothing to do with your org.
Anything run through the Salesforce CLI passes no version at all, so the CLI picks its own. Those rows are marked CLI below.
Opening and managing orgs
| What it does | Call | API version |
|---|---|---|
| List the orgs authorized on your Mac | sf org list --all --json | CLI |
| Read the login held for an org | sf org display --target-org <org> --verbose --json | CLI |
| Read the token when a newer CLI hides it | sf org auth show-access-token --target-org <org> --json | CLI |
| Open an org, Setup, or Object Manager | sf org open --target-org <org> --url-only --json | CLI |
| Add an org or reconnect one | sf org login web | CLI |
| Remove an org from this Mac | sf org logout --target-org <org> --no-prompt | CLI |
Opening an org gets a one-time login link and hands it to your browser. The app makes no request to that link itself.
Storage, limits, and Trust status
| What it does | Call | API version |
|---|---|---|
| Read storage and API limits | sf org list limits --target-org <org> --json | CLI |
| Check for active incidents | GET api.status.salesforce.com/v1/incidents/active | v1 |
| Check one instance's status | GET api.status.salesforce.com/v1/instances/<instance>/status | v1 |
The Trust requests carry no login, no token and no org id. Only the instance name travels, in the address. They can be switched off in Settings.
Inspect Changes
| What it does | Call | API version |
|---|---|---|
| List the metadata types in an org | sf org list metadata-types --target-org <org> --json | CLI |
| List components of one type | sf org list metadata --metadata-type <Type> --target-org <org> | CLI |
| Retrieve components to compare or extract | sf project retrieve start --metadata <Type:Name> | 62.0 |
| Open a component in the org | sf org open --path /<componentId> --url-only --json | CLI |
Release Updates
| What it does | Call | API version |
|---|---|---|
| Read the release updates in an org | GET /tooling/query?q=SELECT … FROM ReleaseUpdate | Your org's |
The only call in the app that uses the Tooling API — release updates are not in the ordinary data API, so there is no other way to read them. One request per org, and reading changes nothing: the app never activates a release update, because doing that changes how an org behaves. That decision stays in Salesforce Setup.
Email Domains
| What it does | Call | API version |
|---|---|---|
| Read the org's authorized email domains | GET /tooling/query?q=SELECT … FROM AuthorizedEmailDomain | Your org's |
| Read the org's DKIM keys | GET /query?q=SELECT … FROM EmailDomainKey | Your org's |
| Check the DKIM record really is published | DNS lookup of <selector>._domainkey.<domain>, following one CNAME | off by default |
| Compare it with the key Salesforce signs with | DNS lookup of the address Salesforce hosts the key at | off by default |
| Check SPF | DNS lookup of a TXT record on the domain | off by default |
| Check DMARC | DNS lookup of a TXT record on _dmarc.<domain> | off by default |
Salesforce reports whether it considers a domain verified. It cannot report whether the DNS record behind it is still published, so the app can check that itself. Those DNS lookups are switched off until you turn them on — they are the only requests the app makes that go neither to Salesforce nor to this site. They go to whichever DNS resolver your Mac uses, they reveal which domains are being checked, and they read only public records. A lookup that does not answer is reported as “could not check”, never as a fault, because a slow or filtered DNS server would otherwise look identical to a misconfigured client.
Setup Audit Trail
| What it does | Call | API version |
|---|---|---|
| Read the audit trail | sf data query -q "SELECT Action, Section, CreatedDate, CreatedBy.Name, Display FROM SetupAuditTrail …" | CLI |
One query, up to 2,000 rows, limited to the last 7, 30 or 90 days. Searching and filtering happen on your Mac.
Query Records
| What it does | Call | API version |
|---|---|---|
| Run your query | GET /query?q=<your SOQL> | Your org's |
| Get the next page | GET <the link Salesforce returned> | From Salesforce |
| List the objects you can query | GET /sobjects/ | Your org's |
| Read one object's fields and related lists | GET /sobjects/<Object>/describe | Your org's |
| Roughly how many records each object holds | GET /limits/recordCount | Your org's |
| See which fields an object actually uses | GET /query?q=SELECT FIELDS(ALL) FROM <Object> ORDER BY LastModifiedDate DESC LIMIT 200 | Your org's |
One round trip per 2,000 records. Copy, CSV export and Excel export all work on data already downloaded.
Choosing an object reads that object's fields and related lists once, then looks at up to 200 of its most recently changed records to see which fields your org fills in. That is one extra read-only query, and only when you pick an object — a query that arrives another way is not sampled unless you ask for it. Nothing is written, and the records are counted in memory and never saved. The record counts are the ones Salesforce reports itself; they are approximate and are used only to decide which objects to show you first.
Data Import
| What it does | Call | API version |
|---|---|---|
| List objects | GET /sobjects/ | Your org's |
| Read an object's fields | GET /sobjects/<Object>/describe | Your org's |
| Insert | POST /composite/sobjects | Your org's |
| Update | PATCH /composite/sobjects | Your org's |
| Upsert by external id | PATCH /composite/sobjects/<Object>/<ExternalIdField> | Your org's |
| Delete | DELETE /composite/sobjects?ids=…&allOrNone=false | Your org's |
| Back up records before changing them | GET /query?q=SELECT Id, <fields> FROM <Object> WHERE Id IN (…) | Your org's |
Up to 200 records per call, always with
allOrNone off, so one bad row never rolls back the rest and every row gets
its own result. Updates and deletes read the existing records first and write a backup
file to your Mac before anything changes.
Find Duplicates
| What it does | Call | API version |
|---|---|---|
| Estimate how many records there are | GET /limits/recordCount?sObjects=<Object> | Your org's |
| Test and count your filter | GET /query?q=SELECT COUNT() FROM <Object> WHERE (…) | Your org's |
| Start the download | POST /jobs/query (Bulk API 2.0) | Your org's |
| Watch its progress | GET /jobs/query/<jobId> | Your org's |
| Collect the records | GET /jobs/query/<jobId>/results?maxRecords=<n> | Your org's |
| Clean up the finished job | DELETE /jobs/query/<jobId> | Your org's |
| Read the fields on a linked record | GET /sobjects/<Linked Object>/describe | Your org's |
| Fill in the extra fields you chose | GET /query?q=SELECT Id, <extra fields> FROM <Object> WHERE Id IN (…) | Your org's |
| Count related records | GET /queryAll?q=SELECT <parent>, COUNT(Id) FROM <Child> … | Your org's |
| Check nothing changed since the snapshot | GET /query?q=SELECT Id, LastModifiedDate FROM <Object> WHERE Id IN (…) | Your org's |
| Merge | POST /services/Soap/u/<version> with SOAPAction: merge | Your org's |
| Tag duplicates or fill empty fields | PATCH /composite/sobjects | Your org's |
| Delete duplicates | DELETE /composite/sobjects?ids=…&allOrNone=false | Your org's |
A match field can live on a record the chosen one points at — a contact's account name, for example. Salesforce's Bulk query accepts that directly, so it simply joins the list of fields asked for and comes back as another column; no extra request is made for it. The only extra call is one describe, to list the fields that linked record has, and it happens when you open that link on screen rather than up front. Comparing more than one kind of record runs one Bulk job per kind, one after another, each with its own paging cursor so an interrupted download resumes in the right place in the right job.
Leads that have already been converted are
left out unless you ask for them, by adding IsConverted = false to that
download's filter. It is added only to the query for a kind of record that has the field
— asking a Contact for it is a query error, not an empty answer — and any
filter you typed yourself is wrapped in brackets before it, so an OR in your
filter still means what you wrote.
Records arrive in pages of up to 50,000 and are saved to your Mac as they come, so an interrupted download resumes exactly where it stopped. The matching itself happens entirely on your Mac — no record is sent back to Salesforce to be compared. That includes checking a large group a second time to see whether it is really one group of duplicates or a chain of near-misses, and holding a group back when it holds more different-looking records than your limit: both read nothing new and call nothing, and changing either compares again using the copy already on your Mac. Merging exists only in the SOAP API, so that is the one place the app uses it; merges are sent one at a time to stay clear of record locks. Salesforce can merge Accounts, Contacts, Leads and Cases; anything else is deleted to the Recycle Bin instead.
The app itself
| What it does | Call | API version |
|---|---|---|
| Check for a new version | GET www.dewwow.com/org-launcher/appcast.json | — |
| Count launches | POST www.dewwow.com/org-launcher/ping | — |
Both can be switched off in Settings. What the launch counter does and does not send is set out in the privacy policy.
Every host contacted
| What it does | Call | API version |
|---|---|---|
| All Salesforce data, Bulk and merge calls | your org's own instance | with the CLI's token |
| Trust status only | api.status.salesforce.com | no login sent |
| Update check and launch count | www.dewwow.com | no account |
| DNS records for email domains | your Mac's DNS resolver | off by default |
Opened in your browser rather than
requested by the app: your org's login link, the Salesforce Trust page, these pages, and
the Salesforce CLI setup guide. login.salesforce.com and
test.salesforce.com are reached by the Salesforce CLI and your browser when
you add or reconnect an org — the app itself does not call them.
What never leaves your Mac
- The login token, held in memory only.
- All duplicate matching, over a local copy of the records.
- Reading and writing spreadsheets, and every CSV and Excel export.
- Comparing metadata between two orgs.
- Your saved org list, limits readings, query history and saved queries.
- Backup files written before an import changes anything.
Accurate for version 1.1.4. If you find something on this page that does not match what the app does, please tell us.
Questions?
Email ejbantz@dewwow.com and include the version number from Org Launcher > About Org Launcher.
Overview · Release notes · Privacy · What it calls
DewWow LLC · Wisconsin’s Odoo Partner · dewwow.com
Salesforce and related marks are trademarks of Salesforce, Inc. Org Launcher is an independent product and is not affiliated with, endorsed by, or sponsored by Salesforce, Inc.