Akamai SBSD sensor data API
Akamai SBSD uses many sophisticated techniques to identify and block automated traffic. Our API takes care of heavy lifting for you, leaving you to focus on your use case instead of worrying about bot detection. It's often used in conjunction with Akamai Web V3.
We do not support illicit use of our API, and we will not hesitate to block any users who abuse it. We are committed to providing a safe and secure experience for all of our users, and we will take action against anyone who violates our terms of service. Unblocking may only be possible after ID KYC verification and/or valid justification.
Getting started
To confirm whether a website uses Akamai Web SBSD, you have to check for the presence of the bm_so/sbsd_o cookie (later called just bm_so for simplicity). It's what governs the authenticity of the session.
In order to obtain a valid bm_so cookie, you have to send a POST request to the SBSD endpoint.
The flow is different depending on SBSD variant.
Thankfully variants can be easily distinguished by presence of t parameter in the script URL, which is present in challenge flow and absent in non-challenge flow.
Normal flow appears on normal unblocked responses, whereas challenge flow appears on blocked responses, which contain no real page content.
Example of challenge flow response:
<!DOCTYPE html>
<html lang="en">
<body><script type="text/javascript" src="/oh9-FCgd0/yhU7kLks/Ff0U2kh_/4s/Xz9OG03zOm9L/Hkg8dEgB/bGR/NdH5kJmR8?v=78225c20-0424-cb9d-3fba-9216b7e617d0&t=939508737"></script>
<script>
(function() {
var chlgeId = '';
var scripts = document.getElementsByTagName('script');
for (var i = 0; i < scripts.length; i++) {
if (scripts[i].src && scripts[i].src.match(/t=([^]*)/)) {
chlgeId = scripts[i].src.match(/t=([^]*)/)[1];
}
}
var proxied = window.XMLHttpRequest.prototype.send;
window.XMLHttpRequest.prototype.send = function() {
var pointer = this
var intervalId = window.setInterval(function() {
if (pointer.readyState === 4 && pointer.responseURL && pointer.responseURL.indexOf('t=' + chlgeId) > -1) {
if (window.self === window.top) {
location.reload(true);
}
clearInterval(intervalId);
}
}, 1);
return proxied.apply(this, [].slice.call(arguments));
};
})();
</script>
</html>
There are only 2 distinct flows:
- challenge flow (with
tparameter). Use it if you face a challenge response - normal flow (without
tparameter). Use it if you face a normal response
1. Challenge flow (with t parameter)
Please visit challenge flow page for more information.
2. Normal flow (without t parameter)
Please visit normal flow page for more information.