Documentation Index
Fetch the complete documentation index at: https://mintlify.com/pinchtab/pinchtab/llms.txt
Use this file to discover all available pages before exploring further.
Overview
Profiles are Chrome user data directories that store:
- Cookies and sessions
- Browser history
- Saved passwords
- Extensions
- Settings and preferences
- Local storage
Each profile is isolated and can be used across multiple instance launches.
List Profiles
curl http://localhost:9867/profiles | jq .
Query Parameters
Include temporary (auto-generated) profiles
Response
[
{
"id": "278be873adeb",
"name": "Pinchtab org",
"created": "2026-02-27T20:37:13.599Z",
"diskUsage": 534952089,
"source": "created",
"running": false,
"accountEmail": "admin@gi-ago.com",
"accountName": "Luigi Agosti",
"chromeProfileName": "Your Chrome",
"hasAccount": true,
"useWhen": "For gmail related to giago org",
"description": ""
}
]
Response Fields
Profile ID (hash format or name)
Human-readable profile name
ISO 8601 timestamp of profile creation
Source: created (manual), imported (from Chrome), temporary (auto-generated)
true if profile is currently in use by an instance
Chrome account email if signed in
Chrome account name if signed in
Internal Chrome profile name
true if profile has a Chrome account signed in
Description of when to use this profile (for AI agents)
Get Profile
Retrieve details for a single profile.
curl http://localhost:9867/profiles/278be873adeb | jq .
Response (200 OK)
{
"id": "278be873adeb",
"name": "Pinchtab org",
"created": "2026-02-27T20:37:13.599Z",
"diskUsage": 534952089,
"source": "created",
"running": false
}
Create Profile
Create a new browser profile.
curl -X POST http://localhost:9867/profiles \
-H "Content-Type: application/json" \
-d '{"name": "my-profile"}'
Request Body
Profile name (must be unique)
Guidance for when to use this profile (helpful for AI agents)
Response (201 Created)
{
"status": "created",
"name": "my-profile"
}
Update Profile
Update profile metadata.
curl -X PATCH http://localhost:9867/profiles/my-profile \
-H "Content-Type: application/json" \
-d '{
"description": "Updated description",
"useWhen": "Updated use case"
}'
Request Body
Response (200 OK)
{
"status": "updated",
"id": "my-profile",
"name": "my-profile"
}
Delete Profile
Permanently delete a profile and all its data.
curl -X DELETE http://localhost:9867/profiles/my-profile
Response (200 OK)
{
"status": "deleted",
"id": "my-profile",
"name": "my-profile"
}
Deletion is permanent and cannot be undone. All cookies, history, and settings will be lost.
Reset Profile
Clear profile data (cookies, cache, history) without deleting the profile.
POST /profiles/{id}/reset
curl -X POST http://localhost:9867/profiles/my-profile/reset
Response (200 OK)
{
"status": "reset",
"id": "my-profile",
"name": "my-profile"
}
What Gets Cleared
- Sessions
- Session Storage
- Cache
- Code Cache
- GPU Cache
- Service Workers
- Cookies
- History
- Visited Links
Profile directory structure remains intact. You can re-login after reset.
Import Profile
Import an existing Chrome profile from your system.
curl -X POST http://localhost:9867/profiles/import \
-H "Content-Type: application/json" \
-d '{
"name": "imported-chrome",
"sourcePath": "/Users/you/Library/Application Support/Google/Chrome/Default",
"description": "Imported from my Chrome browser",
"useWhen": "For existing Chrome accounts"
}'
Request Body
Name for the imported profile
Path to Chrome profile directory
Optional use case guidance
Common Chrome Profile Paths
macOS:
/Users/<username>/Library/Application Support/Google/Chrome/Default
/Users/<username>/Library/Application Support/Google/Chrome/Profile 1
Linux:
~/.config/google-chrome/Default
~/.config/google-chrome/Profile 1
~/.config/chromium/Default
Windows:
C:\Users\<username>\AppData\Local\Google\Chrome\User Data\Default
C:\Users\<username>\AppData\Local\Chromium\User Data\Default
Response (201 Created)
{
"status": "imported",
"name": "imported-chrome"
}
Get Profile Logs
Retrieve action history for a profile.
curl 'http://localhost:9867/profiles/my-profile/logs?limit=50' | jq .
Query Parameters
Maximum number of log entries to return
Response
[
{
"timestamp": "2026-03-01T05:12:45Z",
"action": "navigate",
"url": "https://example.com"
},
{
"timestamp": "2026-03-01T05:12:50Z",
"action": "click",
"selector": "e5"
},
{
"timestamp": "2026-03-01T05:12:55Z",
"action": "type",
"text": "search query"
}
]
Get Profile Analytics
Get usage statistics for a profile.
GET /profiles/{id}/analytics
curl http://localhost:9867/profiles/my-profile/analytics | jq .
Response
{
"totalActions": 256,
"averageActionDuration": 2.5,
"topActions": {
"navigate": 128,
"click": 98,
"type": 30
},
"lastUsed": "2026-03-01T05:12:50Z",
"commonHosts": [
"example.com",
"google.com",
"github.com"
],
"last24h": {
"actions": 50,
"uniqueHosts": 5
}
}
Complete Workflow Example
import requests
BASE = "http://localhost:9867"
# 1. Create profile
resp = requests.post(f"{BASE}/profiles", json={
"name": "test-profile",
"description": "Test profile for automation"
})
print(f"Created: {resp.json()}")
# 2. Update metadata
requests.patch(f"{BASE}/profiles/test-profile", json={
"useWhen": "For testing automation scripts"
})
# 3. Use profile in instance
inst = requests.post(f"{BASE}/instances/start", json={
"profileId": "test-profile",
"mode": "headed"
}).json()
print(f"Instance: {inst['id']}")
# ... do work ...
# 4. Stop instance
requests.post(f"{BASE}/instances/{inst['id']}/stop")
# 5. View analytics
analytics = requests.get(f"{BASE}/profiles/test-profile/analytics").json()
print(f"Total actions: {analytics['totalActions']}")
# 6. Reset profile (clear cookies/history)
requests.post(f"{BASE}/profiles/test-profile/reset")
# 7. Delete when done
# requests.delete(f"{BASE}/profiles/test-profile")
Best Practices
Profile Naming
✅ Good:
work-email
github-scraper
testing-v2
production-accounts
❌ Avoid:
- Generic names:
test, temp, profile
- Very long names (>50 chars)
- Special characters requiring URL encoding
Using Descriptions and UseWhen
Include metadata for team collaboration and AI agent selection:
{
"name": "github-automation",
"description": "For automated GitHub operations",
"useWhen": "When scheduled workflows need to access GitHub repos"
}
Profile Isolation
Each profile is completely isolated:
- Separate cookies and sessions
- Independent browser cache
- Isolated browser storage
- No data sharing between profiles
Use different profiles for:
- Different user accounts
- Different environments (dev/staging/prod)
- Different projects
- Security isolation
Error Handling
Profile Already Exists (400)
curl -X POST $BASE/profiles -d '{"name":"existing-profile"}'
Response:
{
"error": "profile \"existing-profile\" already exists",
"statusCode": 400
}
Profile Not Found (404)
curl $BASE/profiles/nonexistent
Response:
{
"error": "profile \"nonexistent\" not found",
"code": "ERR_PROFILE_NOT_FOUND",
"statusCode": 404
}
Invalid Source Path (400)
curl -X POST $BASE/profiles/import \
-d '{"name":"imp","sourcePath":"/invalid/path"}'
Response:
{
"error": "source path invalid: stat /invalid/path: no such file or directory",
"statusCode": 400
}
Next Steps
Instances API
Use profiles when starting instances
Tabs API
Manage tabs within instances