Docs REST API
The local REST API, every route
Everything the Mosaic window does, a script on the same computer can do: make profiles, give them proxies, start them and drive them. This reference is built from the one the app ships, so it lists what your copy answers.
- Base URL
http://127.0.0.1:7317/api/v1- Routes
- 194
- MCP tools
- 168
- Plan
- Pro
Authentication
Mosaic runs the API inside the app, on 127.0.0.1, so only programs on the same computer can reach it. Make a key on the API screen in Mosaic and send it with every request, in either header:
Authorization: Bearer msc_…
X-API-Key: msc_…
The secret is shown once and stored as a hash, so a lost key cannot be read back: revoke it and make another. GET /health is the one route that needs no key.
Which plan answers
The API is part of Pro. On Free, a request with a valid key gets a 402 with { "error", "feature": "api" }, while a wrong key is still a 401, so a typo never looks like a billing problem. A limit reached inside a route, such as a sixth profile on Free, is also a 402 that names its feature.
Why a web page cannot call it
A request carrying a Sec-Fetch-Site header other than same-origin came from a browser, and it gets a 403 before the route is read. Otherwise any site you visit could ask /health and learn that this computer runs an anti-detect browser. Scripts, curl, Puppeteer and Playwright do not send that header and are not affected.
Conventions
- Bodies are JSON unless a route says otherwise. Ids are UUIDs, times are ISO 8601 in UTC.
PATCHchanges the fields you send and leaves the rest alone. An unknown field is refused by name, not dropped.- Deleting a profile or a project moves it to the trash. Nothing is destroyed until it is purged, after 30 days or through the trash routes.
- An error is
{ "error": "…" }with a 4xx or 5xx status. A 4xx sentence is written for you; a 500 is a bug of ours.
Attaching Playwright or Puppeteer
POST /profiles/:id/start returns a wsEndpoint. Connect to it and use the context that is already there, because a new context starts with none of the profile’s cookies:
const started = await fetch(`${BASE}/profiles/${id}/start`, {
method: 'POST', headers: { Authorization: `Bearer ${KEY}` }
}).then((r) => r.json())
const browser = await chromium.connectOverCDP(started.wsEndpoint)
const context = browser.contexts()[0]
The port is 7317 on a new install and can be changed in Settings; the API screen in Mosaic shows the address this copy listens on. An assistant that speaks MCP has its own door: the MCP tools.
Profiles
Make profiles, run them, draw and repair their fingerprints, and organise them into projects and tags.
Profiles 16
- GET
/profilesList profiles - POST
/profilesCreate a profile - GET
/profiles/:idRead one profile - PATCH
/profiles/:idUpdate a profile - DELETE
/profiles/:idMove a profile to the trash - POST
/profiles/:id/duplicateDuplicate a profile - POST
/profiles/:id/proxy/saveSave a profile’s proxy to the library - POST
/profiles/:id/shortcutPut a profile on the desktop - POST
/profiles/bulk/moveMove profiles between projects - POST
/profiles/bulk/tagsAdd or remove tags in bulk - POST
/profiles/bulk/editApply one change to many profiles - POST
/profiles/:id/clear-cacheClear a profile’s cache, keep its logins - POST
/profiles/bulk/clear-cacheClear several profiles’ caches - POST
/profiles/bulk/deleteMove many profiles to the trash - POST
/profiles/bulk/startStart several profiles - POST
/profiles/bulk/stopStop several profiles
Running a profile 8
- POST
/running/arrangeLay the running windows out on screen - POST
/running/typeType the same text into every running profile - POST
/running/navigateSend every running profile to a URL - POST
/profiles/:id/startStart a profile - POST
/profiles/:id/stopStop a profile - GET
/profiles/:id/statusRead live status - GET
/runningList every running profile - POST
/running/stop-allStop everything
Fingerprints 7
- POST
/fingerprints/generateGenerate a fingerprint - POST
/profiles/:id/fingerprint/regenerateRegenerate a profile’s identity - POST
/profiles/:id/fingerprint/validateCheck a profile’s identity for contradictions - GET
/fingerprints/devicesList the real devices a profile can claim - POST
/fingerprints/auditCheck a fingerprint that has not been saved - POST
/profiles/:id/auditRun a detection audit - GET
/seedGet a fresh seed
Proxies
Saved proxies, and the provider accounts that mint a fresh exit per profile.
Proxy providers 10
- GET
/providersList providers - POST
/providersAdd a provider - POST
/providers/parseRead a line without saving it - GET
/providers/vendorsEvery seller this app recognises - GET
/providers/placesWhere an exit can be asked to be - GET
/providers/:idRead one provider - PATCH
/providers/:idRename, re-note, or replace the line - DELETE
/providers/:idDelete a provider - POST
/providers/:id/checkCheck a provider - POST
/providers/:id/mintMint a proxy without attaching it
Proxies 24
- GET
/proxiesList saved proxies - POST
/proxiesSave a proxy - GET
/proxies/checkingWhich proxies are being checked - GET
/proxies/:idRead one proxy - PATCH
/proxies/:idUpdate a proxy - DELETE
/proxies/:idDelete a proxy - POST
/proxies/:id/checkCheck a saved proxy - POST
/proxies/:id/reputationScan a proxy’s reputation - POST
/proxies/parseRead a proxy list without saving - POST
/proxies/importImport a proxy list - GET
/proxies/exportExport proxies as text - POST
/proxies/checkCheck several proxies - POST
/proxies/:id/rotateRotate a proxy through its change-IP link - POST
/proxies/rotateRotate several proxies - POST
/proxies/assignAttach proxies to profiles - POST
/proxies/scopeMove proxies between projects - GET
/proxies/providers/listList known providers - POST
/proxy/checkCheck a proxy without saving it - POST
/profiles/:id/match-exitMatch the identity to the proxy exit - POST
/profiles/bulk/match-exitMatch many identities to their exits - POST
/profiles/:id/repair-hardwareMove the hardware onto a real machine - POST
/profiles/bulk/repair-hardwareRepair hardware across many profiles - POST
/profiles/:id/proxy/checkCheck a profile’s own proxy - POST
/profiles/:id/leak-testRun a leak test
A profile’s data
Everything one profile carries: its cookies, its saved logins and 2FA codes, its bookmarks and its downloads.
Cookies 3
Credentials 11
- GET
/profiles/:id/credentialsList a profile’s saved logins - POST
/profiles/:id/credentialsSave a login - PATCH
/profiles/:id/credentials/:credentialIdChange a saved login - DELETE
/profiles/:id/credentials/:credentialIdDelete a saved login - GET
/profiles/:id/browser/loginsRead the browser’s own saved logins - POST
/profiles/:id/browser/loginsSave a login into the browser itself - DELETE
/profiles/:id/browser/loginsRemove one saved login from the browser - GET
/profiles/:id/browser/bookmarksRead the browser’s own bookmarks - GET
/profiles/:id/browser/historyRead the domains this profile has visited - GET
/profiles/:id/credentials/:credentialId/totpGenerate a two-factor code - POST
/profiles/:id/credentials/:credentialId/fillType a login into the running profile
Content and transfer
Extensions, presets, and moving whole profiles in and out of Mosaic.
Extensions and templates 9
- GET
/extensionsList the extension library - POST
/extensionsRegister an extension - PATCH
/extensions/:idUpdate an extension - DELETE
/extensions/:idRemove from the library - GET
/templatesList presets - POST
/templatesAuthor a preset - PATCH
/templates/:idChange a preset - POST
/templates/from-profileSave a profile as a preset - DELETE
/templates/:idDelete a preset
Automation
Drive a live page the way a person would — tabs, clicks, reading the DOM, and typing with human timing.
Tabs 11
- GET
/profiles/:id/tabsList open tabs - POST
/profiles/:id/tabsOpen a tab - DELETE
/profiles/:id/tabs/:tabIdClose a tab - POST
/profiles/:id/tabs/navigateNavigate a tab - GET
/profiles/:id/tabs/readRead a page - GET
/profiles/:id/tabs/screenshotScreenshot a tab - POST
/profiles/:id/tabs/evaluateRun script in a tab - POST
/profiles/:id/tabs/clickClick a selector - POST
/profiles/:id/tabs/watch-networkRecord requests for a window - GET
/profiles/:id/tabs/storageRead site storage - POST
/profiles/:id/tabs/storageWrite site storage
Page control 28
- GET
/profiles/:id/page/snapshotSnapshot the page - GET
/profiles/:id/page/findFind elements - GET
/profiles/:id/page/domRead the HTML - GET
/profiles/:id/page/screenshotScreenshot the page or an element - POST
/profiles/:id/page/clickClick - POST
/profiles/:id/page/hoverHover - POST
/profiles/:id/page/typeType - POST
/profiles/:id/page/fillClear and fill a field - POST
/profiles/:id/page/pressPress a key - POST
/profiles/:id/page/selectChoose in a select - POST
/profiles/:id/page/scrollScroll - POST
/profiles/:id/page/dragDrag - POST
/profiles/:id/page/uploadAttach files - POST
/profiles/:id/page/navigateNavigate - POST
/profiles/:id/page/reloadReload - POST
/profiles/:id/page/historyBack or forward - POST
/profiles/:id/page/waitWait for the page - POST
/profiles/:id/page/evaluateRun script - GET
/profiles/:id/page/consoleRead the console - POST
/profiles/:id/page/console-modeCapture page console calls - POST
/profiles/:id/page/network/startStart the request log - GET
/profiles/:id/page/networkRead the request log - POST
/profiles/:id/page/network/stopStop the request log - POST
/profiles/:id/page/network/bodyRead a response body - GET
/profiles/:id/page/dialogsRead dialogs - POST
/profiles/:id/page/dialogsSet the dialog policy - GET
/page/attachmentsList page attachments - POST
/profiles/:id/page/detachRelease an attachment
Preparing and testing
Warm a profile up before it meets the site that matters, and run it past the public detectors.
Warm-up 12
- GET
/warmup/presetsList warm-up presets - POST
/profiles/:id/warmup/planPreview the site list - POST
/profiles/:id/warmupWarm a profile up - POST
/profiles/:id/warmup/cancelStop a warm-up - GET
/warmup/runningList warm-ups in progress - GET
/warmup/plansList saved plans - GET
/warmup/plans/:idRead one plan - POST
/warmup/plansCreate a plan - PATCH
/warmup/plans/:idChange a plan - DELETE
/warmup/plans/:idDelete a plan - POST
/warmup/runWarm many profiles with one plan - POST
/warmup/cancelStop a batch
Housekeeping
The trash, and the library backups.
Trash 8
- GET
/trashList trashed items - POST
/trash/profiles/:id/restoreRestore a profile - DELETE
/trash/profiles/:idPurge a profile - POST
/trash/projects/:id/restoreRestore a project - DELETE
/trash/projects/:idPurge a project - POST
/trash/warmup/plans/:id/restoreRestore a warm-up plan - DELETE
/trash/warmup/plans/:idPurge a warm-up plan - POST
/trash/emptyEmpty the trash
Backups 4
System
Settings, engines, updates, keys and the health of the running app.
Application 16
- GET
/updatesIs there a newer Mosaic - POST
/updates/downloadFetch and verify a newer version - POST
/updates/applyRestart into the downloaded version - GET
/overviewWhat is wrong with this library - GET
/appVersion, platform and where the data lives - POST
/mcp/restartRestart the MCP server - GET
/healthHealth check - GET
/eventsStream profile status changes - GET
/activityWhat the API is doing right now - GET
/enginesList browser engines - GET
/engines/availableWhat the engine manifest offers - POST
/engines/installInstall the engine - GET
/accountThe plan this install is on - DELETE
/accountDelete the account, for good - GET
/settingsRead settings - PATCH
/settingsUpdate settings
More
Support 6
- POST
/support/ticketsFile a support request - GET
/support/ticketsList my support requests - GET
/support/tickets/:idRead one support request - POST
/support/tickets/:id/repliesReply to a support request - GET
/support/tickets/:id/screenshots/:screenshotIdRead one screenshot - GET
/support/diagnosticsPreview the diagnostics
Run the API on your own profiles
The REST API and the MCP server are part of Pro: $49 a month, with the first 14 days free. Free has every browser feature and no API key.
Mosaic is a desktop app
Email yourself the link and open it on your computer.