adspower — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited adspower (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Automate AdsPower antidetect browser operations through its Local API. This skill handles profile creation, browser control, proxy management, cookie operations, and fingerprint verification.
requests installedBase URL: http://local.adspower.net:50325
All requests require the Authorization header:
Authorization: Bearer YOUR_API_KEYSuccess response: {"code": 0, "msg": "success", "data": {...}} Error response: {"code": -1, "msg": "error description"}
curl -s -H "Authorization: Bearer $API_KEY" \
"http://local.adspower.net:50325/api/v1/status"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"]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 Playwrightrequests.get(
f"http://local.adspower.net:50325/api/v1/browser/stop?user_id={profile_id}",
headers={"Authorization": f"Bearer {API_KEY}"},
)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/")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/")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()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"]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"]| 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.
| 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 |
proxy_port must be a string, not an integeruser_id is the internal ID from creation, not the profile name or UI numberresp["data"]["ws"]["selenium"] for Selenium, resp["data"]["ws"]["puppeteer"] for Playwright~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.