# Folders

## List folders

> Distinct, non-empty folder tags across persistent profiles.

```json
{"openapi":"3.0.3","info":{"title":"ShardX Launcher — Automation API","version":"0.1.0"},"tags":[{"name":"Folders"}],"servers":[{"url":"http://127.0.0.1:40325","description":"Local launcher (default port; change in Settings)"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Permanent JWT from Settings → Automation API."}},"responses":{"Unauthorized":{"description":"Missing or invalid Bearer token."}}},"paths":{"/folders":{"get":{"tags":["Folders"],"summary":"List folders","description":"Distinct, non-empty folder tags across persistent profiles.","responses":{"200":{"description":"Folder names.","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}}}}
```

## Delete a folder

> Deletes the folder tag. With \`delete\_profiles=true\` the profiles in\
> it are deleted too; otherwise they're unfiled (moved to "All").<br>

```json
{"openapi":"3.0.3","info":{"title":"ShardX Launcher — Automation API","version":"0.1.0"},"tags":[{"name":"Folders"}],"servers":[{"url":"http://127.0.0.1:40325","description":"Local launcher (default port; change in Settings)"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Permanent JWT from Settings → Automation API."}},"responses":{"Unauthorized":{"description":"Missing or invalid Bearer token."}}},"paths":{"/folders/{folder}":{"delete":{"tags":["Folders"],"summary":"Delete a folder","description":"Deletes the folder tag. With `delete_profiles=true` the profiles in\nit are deleted too; otherwise they're unfiled (moved to \"All\").\n","parameters":[{"name":"folder","in":"path","required":true,"schema":{"type":"string"}},{"name":"delete_profiles","in":"query","required":false,"description":"Delete the profiles in the folder (default false = unfile).","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Deleted.","content":{"application/json":{"schema":{"type":"object","properties":{"deleted_folder":{"type":"string"},"delete_profiles":{"type":"boolean"},"profiles":{"type":"integer","description":"Profiles affected."}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}}}}
```

## Rename a folder

> Retags every profile in the folder. Returns the count.

```json
{"openapi":"3.0.3","info":{"title":"ShardX Launcher — Automation API","version":"0.1.0"},"tags":[{"name":"Folders"}],"servers":[{"url":"http://127.0.0.1:40325","description":"Local launcher (default port; change in Settings)"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Permanent JWT from Settings → Automation API."}},"responses":{"Unauthorized":{"description":"Missing or invalid Bearer token."}}},"paths":{"/folders/{folder}":{"patch":{"tags":["Folders"],"summary":"Rename a folder","description":"Retags every profile in the folder. Returns the count.","parameters":[{"name":"folder","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"New folder name."}}}}}},"responses":{"200":{"description":"Renamed.","content":{"application/json":{"schema":{"type":"object","properties":{"renamed_to":{"type":"string"},"profiles":{"type":"integer","description":"Profiles retagged."}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}}}}
```

## Create a profile in a folder

> Same as \`POST /profiles\`, but the folder comes from the path\
> (overriding any \`folder\` in the body).<br>

```json
{"openapi":"3.0.3","info":{"title":"ShardX Launcher — Automation API","version":"0.1.0"},"tags":[{"name":"Folders"}],"servers":[{"url":"http://127.0.0.1:40325","description":"Local launcher (default port; change in Settings)"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Permanent JWT from Settings → Automation API."}},"schemas":{"CreateProfileRequest":{"type":"object","required":["fingerprint"],"properties":{"name":{"type":"string"},"notes":{"type":"string"},"proxy_id":{"type":"string","description":"Bind a proxy already in the store (by id)."},"proxy":{"type":"string","description":"Attach a proxy by string (`host:port:user:pass` or\n`scheme://user:pass@host:port`). On a **persistent** profile it is\nadded to the proxy store (deduped by endpoint) and full-tested\n(UDP + geo), then bound by id — so it appears in the proxy list\nand QUIC/WebRTC gating has a cached result. On a **temporary**\nprofile it is attached inline (not stored). Ignored if `proxy_id`\nis set.\n"},"folder":{"type":"string","description":"Folder tag (ignored on /folders/{folder}/profiles, which wins)."},"fingerprint":{"allOf":[{"$ref":"#/components/schemas/Fingerprint"}],"description":"Stored verbatim. Get one from /fingerprint/new and edit as needed."}}},"Fingerprint":{"type":"object","description":"Native FingerprintConfig. Documented sub-objects are the common\nones; the object is open and stored verbatim by the create\nendpoints, so any field present here is round-tripped.\n","additionalProperties":true,"properties":{"name":{"type":"string"},"notes":{"type":"string"},"seed":{"type":"integer","description":"0 = overrides-only mode (the common case)."},"navigator":{"type":"object","additionalProperties":true,"properties":{"user_agent":{"type":"string"},"platform":{"type":"string"},"hardware_concurrency":{"type":"integer"},"device_memory":{"type":"integer","enum":[8,16,32]},"language":{"type":"string"},"do_not_track":{"type":"boolean"}}},"screen":{"type":"object","additionalProperties":true,"properties":{"width":{"type":"integer"},"height":{"type":"integer"},"avail_width":{"type":"integer"},"avail_height":{"type":"integer"},"color_depth":{"type":"integer"},"device_pixel_ratio":{"type":"number"},"color_gamut":{"type":"string","enum":["","srgb","p3","rec2020"]}}},"client_hints":{"type":"object","description":"Sec-CH-UA family (browser.vision calls this `hints`).","additionalProperties":true,"properties":{"platform":{"type":"string"},"platform_version":{"type":"string"},"architecture":{"type":"string"},"bitness":{"type":"string"},"mobile":{"type":"boolean"}}},"webgl":{"type":"object","additionalProperties":true,"properties":{"unmasked_vendor":{"type":"string"},"unmasked_renderer":{"type":"string"}}},"webgpu":{"type":"object","additionalProperties":true},"webrtc":{"type":"string","description":"WebRTC handling mode.","enum":["auto","tcp_only","block"]},"noise":{"$ref":"#/components/schemas/NoisePrefs"},"network":{"type":"object","properties":{"blocked_ports":{"type":"array","items":{"type":"integer"},"description":"Local-network port-scan defense (ports_protection)."}}},"timezone":{"type":"string","description":"IANA name, or \"auto\" to resolve from the bound proxy at launch."}}},"NoisePrefs":{"type":"object","description":"Per-vector anti-fingerprint noise. Each block is `{enabled, seed}`\n(+ feature-specific knobs). `enabled:false` = pass-through.\n","properties":{"canvas":{"$ref":"#/components/schemas/NoiseBlock"},"webgl":{"allOf":[{"$ref":"#/components/schemas/NoiseBlock"}],"properties":{"intensity":{"type":"number"}}},"audio":{"allOf":[{"$ref":"#/components/schemas/NoiseBlock"}],"properties":{"intensity":{"type":"number"}}},"client_rects":{"allOf":[{"$ref":"#/components/schemas/NoiseBlock"}],"properties":{"max_offset":{"type":"number"}}},"sensors":{"$ref":"#/components/schemas/NoiseBlock"},"fonts":{"allOf":[{"$ref":"#/components/schemas/NoiseBlock"}],"description":"`enabled:true` hides a small deterministic per-profile subset of\nnon-essential fonts (real host fonts otherwise pass through).\n"}}},"NoiseBlock":{"type":"object","properties":{"enabled":{"type":"boolean"},"seed":{"type":"integer","description":"Per-profile entropy; 0 = derive automatically."}}},"ProfileMeta":{"type":"object","description":"Launcher-facing profile metadata (returned by create).","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"notes":{"type":"string"},"proxy_id":{"type":"string","nullable":true},"last_launched_at":{"type":"string","nullable":true,"description":"ISO-8601 or null."},"created_at":{"type":"string","nullable":true},"pinned":{"type":"boolean"},"folder":{"type":"string"}}},"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}},"responses":{"Unauthorized":{"description":"Missing or invalid Bearer token."}}},"paths":{"/folders/{folder}/profiles":{"post":{"tags":["Folders"],"summary":"Create a profile in a folder","description":"Same as `POST /profiles`, but the folder comes from the path\n(overriding any `folder` in the body).\n","parameters":[{"name":"folder","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProfileRequest"}}}},"responses":{"200":{"description":"Created profile metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileMeta"}}}},"400":{"description":"Missing/!object `fingerprint`, or an unparseable proxy string.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}}}}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.proxyshard.com/proxyshard/shardx-launcher-api/folders.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
