Install
$ agentstack add skill-pencil20388-eng-browser-automation-skills-adspower ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ● Network access Used
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
AdsPower Local API Automation Skill
Automate AdsPower antidetect browser operations through its Local API. This skill handles profile creation, browser control, proxy management, cookie operations, and fingerprint verification.
Prerequisites
- AdsPower installed and running locally (paid plan with API access)
- API Key generated (AdsPower → Automation → API → Generate)
- Python 3.8+ with
requestsinstalled
API Basics
Base URL: http://local.adspower.net:50325
All requests require the Authorization header:
Authorization: Bearer YOUR_API_KEY
Success response: {"code": 0, "msg": "success", "data": {...}} Error response: {"code": -1, "msg": "error description"}
Core Operations
1. Check API Status
curl -s -H "Authorization: Bearer $API_KEY" \
"http://local.adspower.net:50325/api/v1/status"
2. Create a Profile
import requests
resp = requests.post(
"http://local.adspower.net:50325/api/v1/user/create",
headers={"Authorization": f"Bearer {API_KEY}"},
json={
"name": "profile_001",
"group_id": "0",
"fingerprint_config": {
"automatic_timezone": "1",
"language": ["en-US", "en"],
},
},
).json()
profile_id = resp["data"]["id"]
3. Open a Browser Profile
resp = requests.get(
f"http://local.adspower.net:50325/api/v1/browser/start?user_id={profile_id}",
headers={"Authorization": f"Bearer {API_KEY}"},
timeout=30, # 30s timeout for slow proxies
).json()
# Connection info for automation frameworks:
webdriver_path = resp["data"]["webdriver"]
selenium_address = resp["data"]["ws"]["selenium"] # For Selenium
puppeteer_ws = resp["data"]["ws"]["puppeteer"] # For Playwright
4. Close a Browser Profile
requests.get(
f"http://local.adspower.net:50325/api/v1/browser/stop?user_id={profile_id}",
headers={"Authorization": f"Bearer {API_KEY}"},
)
5. Connect Selenium
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
service = Service(executable_path=webdriver_path)
options = Options()
options.add_experimental_option("debuggerAddress", selenium_address)
driver = webdriver.Chrome(service=service, options=options)
driver.get("https://www.browserscan.net/")
6. Connect Playwright
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp(puppeteer_ws)
context = browser.contexts[0]
page = context.pages[0] if context.pages else context.new_page()
page.goto("https://www.browserscan.net/")
7. Update Proxy
requests.post(
"http://local.adspower.net:50325/api/v1/user/update",
headers={"Authorization": f"Bearer {API_KEY}"},
json={
"user_id": profile_id,
"user_proxy_config": {
"proxy_soft": "other",
"proxy_type": "http", # http | https | socks5
"proxy_host": "1.2.3.4",
"proxy_port": "8080", # Must be string
"proxy_user": "username",
"proxy_password": "password",
},
},
).json()
8. Query Profiles
resp = requests.get(
"http://local.adspower.net:50325/api/v1/user/list",
headers={"Authorization": f"Bearer {API_KEY}"},
params={"page": 1, "page_size": 100, "group_name": "My Campaign"},
).json()
profiles = resp["data"]["list"]
9. Create a Group
resp = requests.post(
"http://local.adspower.net:50325/api/v1/group/create",
headers={"Authorization": f"Bearer {API_KEY}"},
json={"group_name": "My Campaign"},
).json()
group_id = resp["data"]["group_id"]
Rate Limits
| Profile count | Max frequency | |---|---| | 0–200 | 2 req/sec | | 200–5000 | 5 req/sec | | > 5000 | 10 req/sec |
Profile creation is always limited to 1 req/sec. Add time.sleep(1.1) between batch operations.
Common Errors
| Error | Cause | Fix | |---|---|---| | Connection refused | AdsPower not running | Start AdsPower, check API status | | Invalid API key | Wrong or expired key | Regenerate in Automation → API | | Error 100044 | Browser start timeout | Check proxy, clear cache, increase timeout | | Error 100001 | Browser failed to start | Repair profile, update AdsPower | | Too many requests | Rate limit exceeded | Add sleep between API calls | | Profile not found | Wrong user_id | Query /api/v1/user/list to get correct IDs |
Important Notes
proxy_portmust be a string, not an integeruser_idis the internal ID from creation, not the profile name or UI number- The API port (default 50325) can change between sessions — verify in AdsPower settings
- Always close browsers via API after automation to prevent resource leaks
- Use
resp["data"]["ws"]["selenium"]for Selenium,resp["data"]["ws"]["puppeteer"]for Playwright
Resources
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: pencil20388-eng
- Source: pencil20388-eng/browser-automation-skills
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.