Before you submit — these must be correct
If any of these are wrong, your token may be accepted by our solver but rejected or scored poorly by the target site.
- Use the userAgent we return. Akamai's mobile BMP path correlates the UA with the deviceId and the sensor signature. Override it with your own UA string and the sensor is rejected on the very first replay.
- Send the EXACT packageName your app ships with (e.g. `com.target.app`, not just `app`). BMP's server-side validator scopes each sensor to the package; sending a mismatched name returns 4xx immediately.
- BMP SDK versions matter. Akamai retires older versions on rotation — pin `version` to whatever your app's bundle ships with, and watch for `429 / 403` returning suddenly when the customer's app upgrades.
- This is the mobile SDK variant. If you're scraping the website (browser-style), the X-acf-sensor-data header doesn't apply — use Akamai Web at /products/akamai-web instead.
Akamai Bot Manager — Mobile / BMP, solved in 5.0s.
Generate Akamai BMP sensor payloads for native Android apps. Returns sensors[] + deviceId + matching User-Agent for the X-acf-sensor-data header.
Akamai's Bot Manager Premier (BMP) ships as a native SDK that Android and iOS apps embed alongside Akamai-protected API calls. Each outbound request is signed with an `X-acf-sensor-data` header derived from a per-device sensor payload — the same algorithm family as the web `_abck` cookie, but emitted by the mobile SDK rather than a JS bundle. The sensor payload encodes device identity (`deviceId`), the host app's `packageName` and version, the BMP SDK version, and a stream of hardware signals (accelerometer, gyroscope, battery, locale, screen). Akamai validates the payload against its model and either lets the API call through or returns a 4xx with a re-challenge marker. Use this product whenever you're replaying a native mobile app's API call — not when you're scraping the website. For the web/desktop variant (bmak JS bundle, _abck cookie) see /products/akamai-web.
Quick Integration
import requests, time
API = "https://api.capzy.ai"
KEY = "capzy_your_key_here"
# Step 1: Create task
task = requests.post(f"{API}/createTask", json={
"clientKey": KEY,
"task": {
"type": "AntiAkamaiBMPTaskProxyLess",
"packageName": "com.target.app",
"version": "3.3.4",
"deviceId": "samsung-SM-A202F-fed1"
}
}).json()
task_id = task["taskId"]
print(f"Task created: {task_id}")
# Step 2: Poll for result
while True:
result = requests.post(f"{API}/getTaskResult", json={
"clientKey": KEY,
"taskId": task_id
}).json()
if result["status"] == "ready":
print("Solved!", result["solution"])
break
elif result["status"] == "failed":
print("Failed:", result.get("errorDescription"))
break
time.sleep(1)
Using the result
Each string in sensors[] is one X-acf-sensor-data header value. Send it with the returned useragent — the payload binds to that device fingerprint.
# Step 3 — send each sensor as the X-acf-sensor-data header on the app's API call
sol = result["solution"]
for sensor in sol["sensors"]:
requests.post("https://api.example.com/mobile/endpoint", headers={
"X-acf-sensor-data": sensor,
"User-Agent": sol["useragent"], # MUST match the device the sensor was minted for
})1. Send Payload
Dispatch your AntiAkamaiBMPTaskProxyLess to our processing cluster via the secure API endpoint.
2. Solving Engine
Capzy runs the real Akamai BMP runtime server-side and emits sensor payloads on demand. You send the app's `packageName` (e.g. `com.target.app`) and BMP SDK `version` (e.g. `3.4.6`); we return a `deviceId`, the matching `useragent` the BMP SDK would set on the request, and an array of one or more freshly-generated `sensors[]` blobs ready to drop into the `X-acf-sensor-data` header. Matching schema to the industry-standard CapSolver `AntiAkamaiBMPTask` — pointing your existing client at `https://api.capzy.ai` with `type: AntiAkamaiBMPTaskProxyLess` works without any other change. No proxy is required because BMP sensors are bound to `deviceId` + `packageName`, not IP. The Proxy variant exists only for API symmetry (so a single client can route both Web and BMP through identical task shapes).
3. Get Result
Poll getTaskResult for the validated token, then finalize your automated request.
Using your own proxy
Use AntiAkamaiBMPTask instead of AntiAkamaiBMPTaskProxyLess to route the solve through your own proxy — useful when the target site checks that the solving IP matches the submitting IP.
import requests, time
API = "https://api.capzy.ai"
KEY = "capzy_your_key_here"
# Step 1: Create task
task = requests.post(f"{API}/createTask", json={
"clientKey": KEY,
"task": {
"type": "AntiAkamaiBMPTask",
"packageName": "com.target.app",
"version": "3.3.4",
"deviceId": "samsung-SM-A202F-fed1",
"proxyType": "http",
"proxyAddress": "123.45.67.89",
"proxyPort": "8080",
"proxyLogin": "user",
"proxyPassword": "pass"
}
}).json()
task_id = task["taskId"]
print(f"Task created: {task_id}")
# Step 2: Poll for result
while True:
result = requests.post(f"{API}/getTaskResult", json={
"clientKey": KEY,
"taskId": task_id
}).json()
if result["status"] == "ready":
print("Solved!", result["solution"])
break
elif result["status"] == "failed":
print("Failed:", result.get("errorDescription"))
break
time.sleep(1)
Additional proxy parameters
proxyTypetypestringreqyesProxy protocol: http, https, socks4, or socks5proxyAddresstypestringreqyesProxy IP address or hostnameproxyPorttypenumberreqyesProxy port numberproxyLogintypestringreqnoProxy username (if auth required)proxyPasswordtypestringreqnoProxy password (if auth required)userAgenttypestringreqnoUser-Agent string to use. Must match the UA you use when submitting the tokenTask Parameters
API SpectypetypestringreqyesAntiAkamaiBMPTaskProxyLess (no proxy needed) or AntiAkamaiBMPTask (proxy param accepted for API symmetry — the sensor itself doesn't use it)packageNametypestringreqyesNative app's package identifier. Android: reverse-domain like `com.target.app`. iOS: the bundle identifier (e.g. `com.target.app`). Must match what the real app ships with — Akamai validates package against the sensor.versiontypestringreqyesAkamai BMP SDK version embedded in the app. Supported: 2.1.2, 2.2.2, 3.1.0, 3.2.3, 3.3.0, 3.3.1, 3.3.4, 4.2.1 (default 3.3.4). Find it in the APK by greping for `akamai-bmp` or in your app's dependency tree. Pin to whatever the live app ships — see the Devices section for the full supported version + device list.deviceIdtypestringreqnoPin the device the sensor is minted from. Pass the SAME value across every call in a session to get sensors from one consistent device (Akamai scores the device identity over the session — a device that changes between requests is flagged). Format is `<brand>-<model>-<id>`, e.g. `samsung-SM-A202F-fed1`; take the model from the Devices list below to pin a specific handset. Omit it and we generate a fresh random device per call.counttypenumberreqnoNumber of sensor payloads to generate in one call. Defaults to 1. Use 2-3 if you need to replay multiple requests off the same task without re-solving each time (each sensor is single-use; once Akamai sees it, it's burned). All sensors in one call share the same device — pass a `deviceId` to keep it stable across calls too.metadatatypeobjectreqnoOptional pass-through map for advanced callers — e.g. locale or screen-size hints. Most callers leave it empty and let us generate plausible values. To pin the device, use the top-level `deviceId` field instead.Response Shape
deviceIdtypestringThe device the sensors were minted from, as `<brand>-<model>-<id>` (e.g. `samsung-SM-A202F-fed1`). If you passed a `deviceId` in the request, this echoes it; otherwise it's the random device we picked. Reuse this exact value on your next call to keep the same device across the session.useragenttypestringExact User-Agent the BMP SDK sets on the request. Pin this onto your replay HTTP client — Akamai cross-checks UA against the sensor signature.sensorstypearrayArray of base64-encoded sensor payload strings, one per requested `count`. Each one is single-use: take element [0], set it as the `X-acf-sensor-data` header value on your next request, then pop it off the list. When the array is empty, solve again.versiontypestringEcho of the BMP SDK version the payload was generated against. Useful for logging / version-drift detection.Example response
{
"errorId": 0,
"status": "ready",
"solution": {
"deviceId": "samsung-SM-A202F-fed1",
"useragent": "Dalvik/2.1.0 (Linux; U; Android 9; SM-A202F Build/TQ3A.230901.001)",
"sensors": [
"<base64 sensor payload — single-use>",
"<base64 sensor payload — single-use>"
],
"version": "3.3.4"
}
}Error response
{
"errorId": 1,
"errorCode": "ERROR_CAPTCHA_UNSOLVABLE",
"errorDescription": "Solver gave up."
}Supported devices & BMP versions
Every solve mints its sensor from a genuine Android device fingerprint (model, screen, hardware sensors, build). Search for your app’s target handset below to confirm coverage and preview the exact User-Agent we pair with it — the API returns that UA with every solve, and you must send it on the same request as the sensor. Click any UA to copy it.
Akamai BMP SDK versions
Loading device list
Features
Pricing & Stats
Start solving akamai bot manager — mobile / bmp.
$0.10 in free credits — no card. ~250 free solves to test before you spend.