Profiles
Profiles are browser user data directories. They hold cookies, local storage, history, and other durable browser state.
In PinchTab:
- profiles exist even when no instance is running
- one profile can have at most one active managed instance at a time
- profile IDs and names are both useful, but some endpoints require the profile ID specifically
List Profiles
curl http://localhost:9867/profiles# Response: JSON array (see below)
# CLI Alternative (human-readable by default)
pinchtab profiles
# Output: prof_278be873 work
pinchtab profiles --json # Full JSON response pinchtab profiles is the simplest way to see available profiles from the CLI.
Response shape:
[
{
"id": "prof_278be873",
"name": "work",
"created": "2026-02-27T20:37:13.599055326Z",
"diskUsage": 534952089,
"sizeMB": 510.17,
"running": false,
"source": "created",
"useWhen": "Use for work accounts",
"description": ""
}
]
Notes:
GET /profilesexcludes temporary auto-generated instance profiles by default- use
GET /profiles?all=trueto include temporary profiles
Get One Profile
curl http://localhost:9867/profiles/prof_278be873curl http://localhost:9867/profiles/prof_278be873 {
"id": "prof_278be873",
"name": "work",
"path": "/path/to/profiles/work",
"pathExists": true,
"created": "2026-02-27T20:37:13.599055326Z",
"diskUsage": 534952089,
"sizeMB": 510.17,
"source": "created",
"chromeProfileName": "Your Chrome",
"accountEmail": "admin@pinchtab.com",
"accountName": "Luigi",
"hasAccount": true,
"useWhen": "Use for work accounts",
"description": ""
} GET /profiles/{id} accepts either the profile ID or the profile name.
Create A Profile
curl -X POST http://localhost:9867/profiles \ -H "Content-Type: application/json" \ -d '{"name":"scraping-profile","description":"Used for scraping","useWhen":"Use for ecommerce scraping"}'
curl -X POST http://localhost:9867/profiles \ -H "Content-Type: application/json" \ -d '{"name":"scraping-profile","description":"Used for scraping","useWhen":"Use for ecommerce scraping"}'
{
"status": "created",
"id": "prof_0f32ae81",
"name": "scraping-profile"
} Notes:
- there is no
pinchtab profile createCLI command - both
POST /profilesandPOST /profiles/creatework for creating profiles
Update A Profile
curl -X PATCH http://localhost:9867/profiles/prof_278be873 \ -H "Content-Type: application/json" \ -d '{"description":"Updated description","useWhen":"Updated usage note"}'
curl -X PATCH http://localhost:9867/profiles/prof_278be873 \ -H "Content-Type: application/json" \ -d '{"description":"Updated description","useWhen":"Updated usage note"}'
{
"status": "updated",
"id": "prof_278be873",
"name": "work"
} You can also rename the profile:
curl -X PATCH http://localhost:9867/profiles/prof_278be873 \ -H "Content-Type: application/json" \ -d '{"name":"work-renamed"}'
curl -X PATCH http://localhost:9867/profiles/prof_278be873 \ -H "Content-Type: application/json" \ -d '{"name":"work-renamed"}'
Important:
PATCH /profiles/{id}requires the profile ID- using the profile name in that path returns an error
- a rename changes the generated profile ID because IDs are derived from the name
Delete A Profile
curl -X DELETE http://localhost:9867/profiles/prof_278be873curl -X DELETE http://localhost:9867/profiles/prof_278be873 {
"status": "deleted",
"id": "prof_278be873",
"name": "work"
} DELETE /profiles/{id} also requires the profile ID.
Start Or Stop By Profile
Start the active instance for a profile:
curl -X POST http://localhost:9867/profiles/prof_278be873/start \ -H "Content-Type: application/json" \ -d '{"headless":true}'
curl -X POST http://localhost:9867/profiles/prof_278be873/start \ -H "Content-Type: application/json" \ -d '{"headless":true}'
{
"id": "inst_ea2e747f",
"profileId": "prof_278be873",
"profileName": "work",
"port": "9868",
"mode": "headless",
"headless": true,
"status": "starting"
} Stop the active instance for a profile:
curl -X POST http://localhost:9867/profiles/prof_278be873/stopcurl -X POST http://localhost:9867/profiles/prof_278be873/stop {
"status": "stopped",
"id": "prof_278be873",
"name": "work"
} For these orchestrator routes, the path can be a profile ID or profile name. The returned instance object now includes both mode and headless.
Check Whether A Profile Has A Running Instance
curl http://localhost:9867/profiles/prof_278be873/instancecurl http://localhost:9867/profiles/prof_278be873/instance {
"name": "work",
"running": true,
"status": "running",
"port": "9868",
"id": "inst_ea2e747f"
} Additional Profile Operations
Reset A Profile
curl -X POST http://localhost:9867/profiles/prof_278be873/resetcurl -X POST http://localhost:9867/profiles/prof_278be873/reset This route requires the profile ID.
Import A Profile
curl -X POST http://localhost:9867/profiles/import \ -H "Content-Type: application/json" \ -d '{"name":"imported-profile","sourcePath":"/path/to/existing/profile"}'
curl -X POST http://localhost:9867/profiles/import \ -H "Content-Type: application/json" \ -d '{"name":"imported-profile","sourcePath":"/path/to/existing/profile"}'
Get Logs
curl http://localhost:9867/profiles/prof_278be873/logscurl 'http://localhost:9867/profiles/work/logs?limit=50'
curl http://localhost:9867/profiles/prof_278be873/logscurl 'http://localhost:9867/profiles/work/logs?limit=50'
logs accepts either the profile ID or the profile name. Results are derived from the activity store for that profile.
Get Analytics
curl http://localhost:9867/profiles/prof_278be873/analyticscurl http://localhost:9867/profiles/work/analytics
curl http://localhost:9867/profiles/prof_278be873/analyticscurl http://localhost:9867/profiles/work/analytics
analytics also accepts either the profile ID or the profile name. It is computed from the same activity data used by /api/activity.