Local API reference

Configure the Local API, authenticate requests, inspect responses and use the verified v1, v2 and v3 routes.

15 min read

On this page

Open MCP & Local API from the top navigation. Its status strip shows whether the server is running, the actual base address and whether a token is required. It serves only this computer’s local browser store.

Running API address and token status
Copy the address this server is actually using.

Configure the server

In Server, set Enable Local API, Require API token, Port and API token, then Save. The default port is 50326; the setting accepts 1024–65535. A port change restarts the server. An empty token field keeps the stored token.

Local API server settings
Save server settings in place; a port change restarts the server.

Use the address displayed by the app. A fallback port means scripts using the requested port may reach another process. Restart reconciles the server with saved settings after you clear the conflict.

With the desktop closed, cloutctl system serve can run the Local API. Command line covers its shared queue and sync loop.

Authentication

Token authentication is on by default. Requests can send X-API-Key or Authorization: Bearer; api_key in a query is also accepted. Prefer a header so the token does not become part of a URL.

The desktop token box does not reveal the stored value. Set a token you keep securely, or inspect local settings through cloutctl system settings when appropriate. That command can print sensitive local settings; keep its output private.

/status, /health, /api/v1/status, /docs and /openapi.json are public on this loopback server. Turning authentication off lets local applications call the remaining routes without a token.

A first request

The following examples assume the displayed base address is the default. Set CLOUT_TOKEN in your environment to your own API token; the documentation supplies no credential.

curl http://127.0.0.1:50326/status
curl -H "Authorization: Bearer $CLOUT_TOKEN"   -H 'Content-Type: application/json'   -d '{"page":1,"limit":10}'   http://127.0.0.1:50326/api/v2/browser-profile/list

/status returns {"code":0,"msg":"success"} without a data member. Most operations return code, msg and data. Check code: an operation failure normally returns HTTP 200 with code: -1. Invalid authentication returns HTTP 401 with code: -401 and “Invalid or missing API key”.

JSON body and query handling are route-specific. On v2 and v3 calls, a query value overrides a body field with the same name. v1 writes read their body directly. v2 writes use POST. v3 reads accept GET or POST; v3 writes use POST. Paths are case-insensitive and trailing-slash-insensitive for compatibility.

List and address profiles

POST /api/v2/browser-profile/list supports profile_id, profile_no, group_id, pagination and sorting. Results have data.list, page, limit and page_size; do not require a total field. A short page is the stopping condition when paginating.

Use IDs returned by the list. For one profile, supply profile_id or the register’s profile_no. Do not guess an ID from a Creator’s display name.

Create, update, start and stop

POST routeMain inputsResult or effect
/api/v2/browser-profile/createname, optional group_id, remark, user_proxy_config, fingerprint_configNew profile_id and profile_no
/api/v2/browser-profile/updateTarget plus changed fieldsApplies the supplied profile changes
/api/v2/browser-profile/startTarget, optional headless, delete_cache, launch_argsLaunches or returns the existing browser endpoint
/api/v2/browser-profile/stopTargetStops that profile through the normal session-capture path
/api/v2/browser-profile/stop-allNo targetStops running profiles and reports outcomes

A literal proxy uses user_proxy_config with proxy_soft, proxy_type, proxy_host, proxy_port, proxy_user and proxy_password. For a custom gateway, proxy_soft is other. The example below deliberately has no username or password:

{
  "name": "Creator A · X",
  "user_proxy_config": {
    "proxy_soft": "other",
    "proxy_type": "socks5",
    "proxy_host": "203.0.113.10",
    "proxy_port": "1080"
  }
}

delete_cache on start requests cache clearing at close. It is separate from replacing session cookies. Default visible launch is headless: false.

A successful v2 start exposes data.ws.puppeteer, the CDP WebSocket, and browser connection information. Connect automation to the returned endpoint rather than starting a second browser with a new identity.

import { chromium } from 'playwright';

const response = await fetch(`${baseUrl}/api/v2/browser-profile/start`, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    Authorization: `Bearer ${token}`,
  },
  body: JSON.stringify({ profile_id: profileId }),
});
const reply = await response.json();
if (reply.code !== 0) throw new Error(reply.msg);
const browser = await chromium.connectOverCDP(reply.data.ws.puppeteer);

baseUrl, token and profileId in this example are values obtained by your integration. Stop through the API when finished so the normal capture and cleanup path runs.

Profile creation fields

v1 and v2 use a compatibility mapper. Top-level fields include name, remark, domain_name, platform, username, password, fakey, cookie, ipchecker, ip, country, category_id, sys_app_cate_id, group_id, open_urls, tabs and launch_args. group_id must exist. user_proxy_config is a nested object; proxyid selects a saved proxy when no nested object was supplied. Keep credential-bearing bodies and responses out of logs.

fingerprint_config is an object with these verified input fields:

FieldMapping or values
ua, user_agentUser agent; user_agent wins when both are supplied
automatic_timezone, timezoneAutomatic maps to proxy time; false chooses custom. A timezone without the switch selects custom
webrtcdisabled / disable, proxy, local, disables udp / disable_non_proxied_udp map to disabled, replace, local and proxy-UDP modes
locationask requests permission; block blocks location
location_switchTrue selects IP-derived position; false selects custom
latitude, longitude, accuracyCustom location; mapper fallback accuracy is 100 m
language_switch, languageIP-derived or custom language; language accepts a list or string
page_language_switch, page_languageLanguage-derived or custom browser display language; native does not set an override
screen_resolutionnone uses this computer, random generates a size, another value sets custom; underscores become x
fontsall keeps default fonts; other entries are font families to hide
canvas, webgl_image, audio, audio_context, media_devices, client_rects, speech_voices, speech_switchNoise toggles; 0, real, disabled, false mean off. Later aliases win: audio_context and speech_switch
webgl0 uses this computer; other values select custom
webgl_vendor, webgl_rendererGraphics strings
webgl_config.unmasked_vendor, webgl_config.unmasked_rendererNested graphics overrides
webgl_config.webgpu.webgpu_switch0 disabled, 1 based on WebGL, 2 this computer
hardware_concurrency, device_memoryCustom CPU cores and RAM; parsed as integers
media_devices_num.audioinput_num, videoinput_num, audiooutput_numMicrophone, camera and speaker counts in the media_devices_num object
do_not_tracktrue means on, false off; other values use the default
scan_port_type, allow_scan_portsPort-scan setting and exception list
device_name_switch, device_nameSwitch 0 uses the real device name; otherwise custom
mac_address_config.model, mac_address_config.addressModel 0 uses the real MAC; otherwise custom
browser_kernel_config.versionNumeric engine-major pin
gpu1 enables hardware acceleration, 2 disables it
tls_switch, tlsTLS-feature toggle and cipher blacklist

These names belong to the HTTP compatibility vocabulary. They differ from the flat field flags in cloutctl. Avoid sending both aliases unless you intend the documented precedence. On updates, supply only the changes you reviewed; read the resulting record and verify its next launch.

Profile and catalogue reads

MethodRouteUse
GET/api/v2/browser-profile/activeRuntime status for a target profile
GET/api/v2/browser-profile/cookiesThe target’s cookie jar; treat the result as a credential
GET/api/v2/browser-profile/kernelsEngines installed on this host
GET/api/v2/category/listCompatibility category 0, Other; use v1 group/list for profile groups
POST/api/v2/browser-tags/listTags
POST/api/v2/proxy-list/listCompatibility proxy book

Tag create, update and delete use POST on the same prefix. Proxy-list create, update and delete also use POST. Deletion and cookie reads deserve the same deliberate handling as the corresponding desktop actions.

v1 compatibility

v1 supports existing AdsPower integrations: browser start, stop and active; user list, create, update and delete; and group list, create, update and delete. v2 is the clearer choice for a new profile integration. The route tables below list the installed contract without changing the envelopes existing consumers read.

v3 features

v3 adds folders, templates, extensions, saved proxies, provider templates, proxy pools, bulk actions, tasks, cookie robot, engine preparation, window arrangement, bandwidth and limits. The route index below is organised by resource.

Bulk delete, stop and clear-cache return succeeded, failed and items. Each item has id, ok and, on failure, error. Folder, tag and extension bulk calls return a touched-profile count instead; read the particular operation’s response. Proxy pools are available to scripts rather than as a desktop pool page.

Tasks and cookie robot are real operations on browsers. Create or inspect the task definition before calling run. Cookie robot defaults are readable at /api/v3/cookie-robot/defaults; its start route does not offer a headless option.

Local API documentation and OpenAPI route list use the default address. Substitute the address shown by your installation. They enumerate methods and paths; they do not constitute a full request-field schema.

v1 route index

v1 calls address one profile with user_id or id; start and stop also accept serial_number. List and group reads accept page and page_size. Several compatible v1 actions accept GET, but POST keeps action inputs out of URLs.

MethodRouteInputs and behavior
GET/api/v1/user/listgroup_id, user_id, serial_number, user_sort; list identifiers can be arrays or comma-separated strings
GET or POST/api/v1/user/detailuser_id or id; full stored profile record
POST/api/v1/user/createProfile creation fields, including name, group_id, user_proxy_config, fingerprint_config; returns id, user_id, serial_number
POST/api/v1/user/updateuser_id or id, changed creation fields, optional regenerate_fingerprint
POST/api/v1/user/deleteuser_ids or one user_id / id
POST/api/v1/user/regroupuser_ids or user_id, required group_id
POST/api/v1/user/delete-cacheFleet-wide; refuses if any browser is running
POST/api/v1/user/clear-cacheAlias for fleet-wide delete-cache
GET or POST/api/v1/browser/startTarget, wait_seconds (default 20), launch_args, headless, clear_cache_after_closing
GET or POST/api/v1/browser/stopTarget; idle is already stopped
GET or POST/api/v1/browser/activeuser_id or id; runtime status
GET or POST/api/v1/browser/local-activeRunning local profiles in data.list
POST/api/v1/browser/cloud-activeuser_ids; running matches in a bare data array, with account: "local"
GET/api/v1/group/listOptional substring group_name
POST/api/v1/group/creategroup_name or name, optional remark; returns an existing case-insensitive name instead of duplicating it
POST/api/v1/group/updategroup_id, group_name or name, optional remark; supply the name explicitly
POST/api/v1/group/deletegroup_id, optional merge_into (default "0"); moves profiles before deleting the group
GET or POST/api/v1/application/listCompatibility category list

The reserved Ungrouped group "0" cannot be renamed or deleted. A v1 group is separate from a v3 folder. Full profile records and cookie reads can contain session or connection credentials; keep their responses private.

Remaining v2 operations

The profile lifecycle and catalogue tables above cover the main routes. These additional operations are implemented:

MethodRouteInputs and behavior
POST/api/v2/browser-profile/deleteprofile_id list; deletes through the profile service
POST/api/v2/browser-profile/delete-cacheprofile_id list, type list; profiles must be stopped
POST/api/v2/browser-profile/uaprofile_id or profile_no list; reports the resolved user agent
POST/api/v2/browser-profile/new-fingerprintprofile_id or profile_no list; rebuilds identities in place, refuses running targets
POST/api/v2/browser-profile/download-kernelkernel_type, kernel_version; confirms an installed engine and refuses a missing one; it does not download
POST/api/v2/browser-tags/createtags array of records or a top-level array; name, optional color
POST/api/v2/browser-tags/updateRecords with id and changed name, color
POST/api/v2/browser-tags/deleteids or id
POST/api/v2/proxy-list/createProxy object or array; at most the first 500 entries are taken
POST/api/v2/proxy-list/updateOne record with proxy_id and changed fields
POST/api/v2/proxy-list/deleteproxy_id list

/api/v2/browser-profile/share refuses in this local launcher. Workspace access is managed through Team. /api/v2/browser-profile/update-patch is a compatibility response, not an app updater; use Check for updates in the desktop.

v3 route and field index

Every read in these tables accepts GET or POST. Every write accepts POST. Inputs name the fields read by the handler; IDs refer to records returned by the matching list. Send arrays and objects in a JSON body. Omitted update fields generally keep their values; exceptions are noted below.

Folders

RouteOperationInputs
/api/v3/folders/listReadflat
/api/v3/folders/getReadfolder_id
/api/v3/folders/membershipReadNone
/api/v3/folders/createWritename, parent_id, color, position
/api/v3/folders/updateWritefolder_id, name, color, position, parent_id
/api/v3/folders/deleteWritefolder_ids
/api/v3/folders/assignWriteprofile_id, folder_ids, mode

Kernels

RouteOperationInputs
/api/v3/kernels/prepareWriteprofile_ids
/api/v3/kernels/statusReadrun_id

Templates

RouteOperationInputs
/api/v3/templates/listReadNone
/api/v3/templates/getReadtemplate_id
/api/v3/templates/createWriteconfig, name, remark
/api/v3/templates/updateWritetemplate_id, name, remark, config
/api/v3/templates/deleteWritetemplate_ids
/api/v3/templates/from-profileWriteprofile_id, name, remark
/api/v3/templates/applyWritetemplate_id, count, start_index, config, name, group_id

Extensions

RouteOperationInputs
/api/v3/extensions/listReadNone
/api/v3/extensions/getReadextension_id
/api/v3/extensions/for-profileReadprofile_id
/api/v3/extensions/defaultsReadNone
/api/v3/extensions/createWritename, source, location, version, remark
/api/v3/extensions/updateWriteextension_id, name, location, source, version, remark
/api/v3/extensions/deleteWriteextension_ids
/api/v3/extensions/attachWriteprofile_id, extension_ids, enabled
/api/v3/extensions/detachWriteprofile_id, extension_ids
/api/v3/extensions/set-enabledWriteprofile_id, extension_ids, enabled
/api/v3/extensions/set-for-profileWriteprofile_id, extension_ids, enabled
/api/v3/extensions/set-defaultWriteextension_id, on

Proxies

RouteOperationInputs
/api/v3/proxies/listReadNone
/api/v3/proxies/getReadproxy_id
/api/v3/proxies/checksReadNone
/api/v3/proxies/usageReadNone
/api/v3/proxies/defaultReadNone
/api/v3/proxies/checkWriteproxy_id
/api/v3/proxies/createWriteproxy object, proxies array or top-level array
/api/v3/proxies/updateWriteproxy_id, proxy
/api/v3/proxies/deleteWriteproxy_ids
/api/v3/proxies/set-defaultWriteproxy_id
/api/v3/proxies/rotate-sessionsWriteprofile_ids
/api/v3/proxies/save-from-profileWriteprofile_id, title

Proxy templates

RouteOperationInputs
/api/v3/proxy-templates/listReadNone
/api/v3/proxy-templates/getReadtemplate_id
/api/v3/proxy-templates/previewReadproxy_id
/api/v3/proxy-templates/createWriteproxy_id, name, country, city, duration, sticky, remark
/api/v3/proxy-templates/updateWritetemplate_id, name, proxy_id, country, city, duration, sticky, remark
/api/v3/proxy-templates/deleteWritetemplate_id

Proxy pools

RouteOperationInputs
/api/v3/proxy-pools/listReadNone
/api/v3/proxy-pools/getReadpool_id
/api/v3/proxy-pools/membersReadpool_id
/api/v3/proxy-pools/healthReadpool_id
/api/v3/proxy-pools/for-profileReadprofile_id
/api/v3/proxy-pools/peekReadpool_id
/api/v3/proxy-pools/createWritename, rotation, remark, proxy_ids
/api/v3/proxy-pools/updateWritepool_id, name, rotation, remark
/api/v3/proxy-pools/deleteWritepool_ids
/api/v3/proxy-pools/assign-proxiesWritepool_id, proxy_ids, mode (set, add, remove; default set)
/api/v3/proxy-pools/add-memberWritepool_id, proxy_id, position
/api/v3/proxy-pools/set-member-enabledWritepool_id, proxy_id, enabled
/api/v3/proxy-pools/assignWriteprofile_ids, pool_id
/api/v3/proxy-pools/rotateWriteprofile_id, pool_id

Referral

RouteOperationInputs
/api/v3/referral/summaryReadNone
/api/v3/referral/listReadcode
/api/v3/referral/codesReadNone
/api/v3/referral/attributionReadNone
/api/v3/referral/captureWritecode
/api/v3/referral/clearWriteNone

Bulk

RouteOperationInputs
/api/v3/bulk/moveWriteprofile_ids, group_id
/api/v3/bulk/folderWriteprofile_ids, folder_ids, mode
/api/v3/bulk/tagWriteprofile_ids, tag_ids, mode
/api/v3/bulk/extensionWriteprofile_ids, extension_ids, mode, enabled
/api/v3/bulk/deleteWriteprofile_ids
/api/v3/bulk/stopWriteprofile_ids
/api/v3/bulk/clear-cacheWriteprofile_ids, types

Tasks

RouteOperationInputs
/api/v3/tasks/listReadNone
/api/v3/tasks/getReadtask_id
/api/v3/tasks/runsReadtask_id, limit
/api/v3/tasks/run-statusReadrun_id
/api/v3/tasks/createWritename, steps
/api/v3/tasks/updateWritetask_id, name, steps
/api/v3/tasks/deleteWritetask_id
/api/v3/tasks/runWritetask_id, profile_ids, user_ids, concurrency, keep_open
/api/v3/tasks/cancelWriterun_id
RouteOperationInputs
/api/v3/cookie-robot/defaultsReadNone
/api/v3/cookie-robot/startWriteprofile_ids, sites, plan, order, load_timeout_ms, settle_ms, scroll_passes, wheel_notches, scroll_pause_ms, dwell_ms, jitter, site_budget_ms
/api/v3/cookie-robot/runReadrun_id
/api/v3/cookie-robot/cancelWriterun_id

Entitlements

RouteOperationInputs
/api/v3/entitlements/limitsReadNone

Arrange

RouteOperationInputs
/api/v3/arrange/layoutReadNone
/api/v3/arrange/planReadprofile_ids, layout, screen, width, height, x, y, page
/api/v3/arrange/set-layoutWritelayout, screen, or flat layout and screen fields
/api/v3/arrange/applyWriteprofile_ids, layout, screen, width, height, x, y, page

Bandwidth

RouteOperationInputs
/api/v3/bandwidth/fleetReadwindow_seconds
/api/v3/bandwidth/profilesReadwindow_seconds
/api/v3/bandwidth/profileReadprofile_id, window_seconds

Data shapes and update rules

  • Folder list returns list; get returns folder, ancestors, children and profile_ids. folders/list uses flat to choose a flat list. Folder assignment takes set, add or remove; its default is set. Deleting folder_ids deletes the subtree and unfiles profiles; it does not delete the profiles.
  • Templates take config, a profile-creation object. They strip seeds and credentials. apply defaults count to 1, accepts name, group_id and configuration overrides, and returns the created profiles. start_index resumes within the original count; preserve that count and read the created results before retrying.
  • Extension rows take name, source, location, optional version and remark. These routes register library metadata and attachments; they do not upload a local extension archive for you. Attachment operations use profile_id, extension_ids and enabled. set-for-profile replaces the profile’s attachment set. set-default uses on for future profiles.
  • Saved proxy create accepts one object, a proxies array, or a top-level array. Use proxy_type, proxy_host, proxy_port, proxy_user, proxy_password and title for a connection. Update replaces the saved blob from proxy or the request fields; it does not merge individual old fields. List and get results can contain credentials. Keep responses private.
  • proxies/set-default requires proxy_id; explicit null clears it. save-from-profile creates a saved entry from the target’s existing connection. rotate-sessions changes provider sessions and reports per-profile outcomes; it refuses running profiles.
  • Proxy templates compose a credential from a saved proxy_id, country, city, duration and sticky. Empty strings and omitted optional strings keep their old values on update. Send a non-empty replacement to change one. Preview returns provider capabilities and placeholders, without actual credential values.
  • Proxy pools hold saved proxy IDs. rotation is round_robin (default) or random. Assigning a pool to profiles changes their launch egress. peek reads the next member; rotate also advances the cursor. Delete unassigns profiles and returns unassigned_profiles. If an account deletion fails, that pool remains and appears in failed. Publish and assignment responses can contain cloud.error even when the local operation succeeded. Read health before rotating a pool whose members may be unavailable.
  • Bulk folder, tag and extension operations take mode: set, add or remove. Folder defaults to set; tag and extension default to add. Delete, stop and clear-cache report per-profile outcomes. An empty cache types list means everything.
  • Kernel prepare takes non-empty profile_ids and starts preparation; status takes its returned run_id. This prepares SunBrowser requirements; Kameleo’s Chroma installation is separate.
  • Bandwidth uses window_seconds, not a calendar period. Read the returned window and saved.note; these fleet measurements are a lower bound and differ from the account dashboard’s all-time roll-up.
  • Referral routes record attribution and codes. They do not implement a paid reward or a payout.

Tasks are available through HTTP and the CLI. Save a definition, run it against returned profile IDs, and poll tasks/run-status using run_id. A start response means the profiles were admitted; it does not mean the work finished. keep_open leaves task browsers open when requested. Cancellation stops further admission and signals work in flight. Deleting a task definition keeps historical run records.

Task steps is an array of these objects:

kindFieldsBehavior
gotourl, timeoutMsOpens an HTTP or HTTPS URL
waitForSelectorselector, timeoutMsWaits for the selector
waitmsPauses
clickselector, timeoutMsClicks the matching element
typeselector, value, perKeyMs, timeoutMs, submitTypes text or a stored credential reference
scrollbyScrolls by the given amount
readTextselector, variable, timeoutMsRecords matched text under a variable
screenshotlabelCaptures the page
stopIfselector, when, outcome, timeoutMs, messageStops or fails when an element is present or absent

A literal type value is {"from":"text","text":"Example"}. A credential reference uses from: "credential", site, field (username, password or totp) and optional label. The reference resolves within each profile; the raw two-factor seed is not a task field. Use selectors you have inspected on the target page.

Definitions allow up to 200 steps. The default step timeout is 30,000 ms, with a maximum of 300,000 ms. A wait is at most 300,000 ms. Default typing delay is 30 ms per key. stopIf.when is present or absent; outcome is stop or fail. stop records success when the condition was the intended endpoint.

Cookie robot is a separate browsing run. Read cookie-robot/defaults, then send profile_ids and, optionally, sites and plan fields to start. Plan values are clamped. The response includes unknown_profile_ids and rejected_sites; inspect them before assuming the entire request ran. Poll cookie-robot/run, then cancel through cookie-robot/cancel if needed. It runs visible browsers and provides no headless field.

Write refusals

A read-only licence refuses API writes too. Profile creation and countable v3 resources consult account limits. Profile starts still pass engine, proxy, sync and queue checks.

Check the envelope and report the refusal before retrying. A changing identity, deleting data or rerunning a task is not made safe by treating every code: -1 as a network failure.

Response and failure reference

ConditionHTTP statusEnvelope or result
Invalid or missing authentication401code: -401, msg: "Invalid or missing API key"
Unknown route or wrong GET/POST variant200code: -1, msg starts with Unknown route and includes the path
Method other than GET or POST501code: -1, msg starts with Unsupported method and includes the verb
Malformed POST JSON or a handler refusalUsually 200code: -1; read msg
v3 resource entitlement denial200code: -402; data names key, limit, used, requested
Partially completed creation200code: -1; progress includes created, requested, remaining, next_index; preserve the original count and resume only the remaining work
OPTIONS preflight204Empty body; allowed methods are GET, POST and OPTIONS

The body reader takes at most 5,000,000 bytes. A larger JSON document can be truncated and fail parsing; split large requests instead of relying on HTTP success. Header precedence is X-API-Key, then Authorization, then the api_key query value. The Bearer prefix is case-sensitive.

Response fields to preserve

v2 active uses Active or Inactive in status. Its connection fields include ws.selenium, ws.puppeteer, debug_port and webdriver; debug_port is a string and webdriver can be empty. Start returns the connection fields without the active-status label. v2 cookie reads return cookies as a JSON-encoded string, including "[]" for an absent jar; parse that string separately from the response envelope.

List defaults are page 1 and limit 10, capped at 100. Profile sorting uses sort_type and sort_order. Bulk v2 delete, delete-cache, user-agent and fingerprint operations take at most the first 100 targets. Tag mutations and proxy creation take at most the first 500 records. Read the returned records and counts rather than assuming a longer submitted list was processed.

proxies/rotate-sessions returns rotated and failed. Proxy usage is a sanitised connection grouping, while proxy list and get can expose stored connection secrets. An empty string or the string "null", as well as explicit null, clears the default proxy.

Arrangement accepts a nested layout or flat mode, gap, minWidth, minHeight, plus a nested screen or flat x, y, width, height. Page numbering starts at 0. Omitted profile IDs select running profiles; a plan is a read, apply moves windows, and set-layout changes the remembered choice. Read arrange/layout for capabilities before choosing dimensions.

cookie-robot/defaults is a GET or POST read without inputs. run can report found: false for an unknown run. Entitlement, launch, proxy and stopped-profile checks remain in force even for locally authenticated scripts.