> For the complete documentation index, see [llms.txt](https://docs.exoclick.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.exoclick.com/publishers/adblock/adblock-dynamic-domains-api.md).

# How to work with AdBlock Dynamic Domains API

AdBlock tools are increasingly sophisticated, posing significant challenges for publishers seeking to maximize revenue from online advertising. To help mitigate these challenges, this API allows publishers to dynamically adjust their scripts based on active domains, significantly reducing the risk of content being blocked by AdBlock software.

By ensuring ad delivery through regularly rotated domains, publishers can:

* **Maintain Revenue Streams:** Prevent interruptions caused by blocked ads.
* **Enhance User Experience:** Deliver ad content seamlessly without triggering AdBlock detection.
* **Automate Domain Management:** Eliminate manual updates with an automated 7-day domain lifecycle.

New domains are generated every 3 days and are available through the API. The domains will have a 6-day lifecycle.

* 3 days active
* 3 days deprecated

Once the lifecycle expires, the domain will be deactivated. For performance reasons, it is recommended to cache the domain for 24 hours before requesting a new domain from the API.

This API is only available for **Popunders inline-script** and **In-Stream Video** zones.

## Requirements

To use this API, publishers need to:

* Make a **GET request** to the endpoint: <https://ads.exoclick.com/adblock-domains.php>
* You will receive a new ad-serving domain in the response
* You must then change the syndication endpoint used on your ad zone tag to the new one provided in the API response.

## Steps to Implement

{% stepper %}
{% step %}

### Fetch the Active Domain

To retrieve the active Domain dynamically, **you must make an API call server-to-server**. This is crucial because API calls can be blocked if called from the client side.

Here is an example server-to-server call in PHP:

```php
<?php
function fetchAdblockDomain()
{
    $endpoint = 'https://ads.exoclick.com/adblock-domains.php';
    $ch = curl_init($endpoint);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
    $response = curl_exec($ch);

    if (curl_errno($ch)) {
        throw new Exception('Error cURL: ' . curl_error($ch));
    }

    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($httpCode === 200) {
        return $response;
    } else {
        throw new Exception("HTTP Error: ({$httpCode}) Response: {$response}");
    }
}

try {
    echo fetchAdblockDomain();
} catch (Exception $e) {
    echo json_encode([
        'success' => false,
        'message' => $e->getMessage()
    ]);
}
?>
```

And here is the expected response from the API:

```json
{
    "success": true,
    "message": "Domain found",
    "domain": "newsub.newdomain.com" 
}
```

{% endstep %}

{% step %}

### Update Your Script

Use the **domain** returned from the endpoint to update the domain used in your ad zone. The original domain depends on the ad format:

* For **In-Stream Video** zones change the *VAST Tag*:
  * **Before** : `https://s.magsrv.com/v1/vast.php?t={random}&idzone={zoneId}`
  * **After** : `https://newsub.newdomain.com/v1/vast.php?t={random}&idzone={zoneId}`
* For Popunders zones change the *syndication\_host* on the inline script:
  * **Before** : `s.pemsrv.com`
  * **After** : `newsub.newdomain.com`
    {% endstep %}
    {% endstepper %}

## Detecting AdBlock

In order to detect whether the user has an adblock extension enabled, you **must host `ads.js` on the publisher side** (your own domain/CDN) and include it at the very beginning of your `body` tag.

Do **not** request `https://www.exoclick.com/ads.js` directly.

Create your own `ads.js` file:

1. Create a file named `ads.js` in a public path on your website (for example `/js/ads.js`).
2. Add the following content to that file.
3. Load that file from your page before your ad integration logic.

Reference file content:

```javascript
let bait_b3j4hu231 = true;
```

Then add the following line at the very beginning of your `body` tag:

```html
<script src="/js/ads.js" type="text/javascript"></script>
```

This script will be blocked by Adblock in case of the client is using it, due to the presence of the "exoclick" and "ads" keywords. After loading this script, a JS snipppet will attempt to read a specific variable. If the variable is undefined or inaccessible, we can determine that the script as been blocked.

```html
<script src="/js/ads.js" type="text/javascript"></script>

<script>
    // Initialize the insDomain variable with a default value
    let insDomain = 's.magsrv.com'; // Generic host for the network
    let adb = ""; // This variable may contain "&block=1" which helps track Adblock Statistics

    // Fetch adblock domains using a GET request to the PHP file
    async function fetchAdblockDomains() {
        try {
            // Perform a GET request to fetchAdblockDomain.php (Step 3.A).
            // This is a server-to-server request to retreive the Adblock Domain.
            const response = await fetch('fetchAdblockDomain.php', {
                method: 'GET', // Specify the GET method
            });

            // Check if the response is successful (status 200)
            if (!response.ok) {
                throw new Error(`HTTP error! Status: ${response.status}`);
            }

            // Parse the response as JSON
            const data = await response.json();
            console.log('Response data:', data); // Log the response data for debugging

            // Call the function to process the domains
            displayDomains(data);
        } catch (error) {
            // Log any errors that occur during the fetch
            console.error('Error fetching domains:', error);
        }
    }
    // Process and display the domains, updating insDomain if success is true
    function displayDomains(domains) {
        console.log('Success status:', domains["success"]); // Log the success status
        console.log('Fetched domain:', domains["domain"]); // Log the fetched domain


        // Update the insDomain variable if the success flag is true
        if (domains["success"] && typeof bait_b3j4hu231 === 'undefined') {
            adb = '&block=1';
            insDomain = domains["domain"];
            console.log('Updated insDomain:', insDomain); // Log the updated value of insDomain
        }

        // Now you should initialize Fluid Player using the vast tag:
        // const rdm = 't=' + Math.floor(Math.random() * 1000) + '&';
        // "https://" + insDomain + "/v1/vast.php?" + rdm + "idzone=ZONEID" + adb
    }

    // Automatically call fetchAdblockDomains when the page loads
    window.onload = fetchAdblockDomains;
</script>
```

## Integration Examples

In these two examples we are using `fetchAdblockDomain.php` as the name of the server-to-server call to fetch the adblock domain.

### In-Stream

In order to use Dynamic Domains with In-Stream, make sure to **include the VAST player inside the script**, otherwise the player will load the default in-stream ad zone instead of using the updated domain. In this example, we are using Fluidplayer HTML5 player.

```html
<script src="/js/ads.js" type="text/javascript"></script>

    <script>
        let insDomain = 's.magsrv.com'; // default
        let adb = '';
        const ZONE_ID_PRE_ROLL = 'XXXXXXX';

        async function fetchAndApplyAdblockDomains() {
            try {
                const response = await fetch('fetchAdblockDomain.php');
                const data = await response.json();

                console.log('Response:', data);

                if (data.success && typeof bait_b3j4hu231 === 'undefined') {
                    // AdBlock detected
                    adb = '&block=1';
                    insDomain = data.domain;
                    console.log('AdBlock detected: using API domain', insDomain);
                } else if (data.success) {
                    // No AdBlock
                    console.log('No AdBlock: using default domain');
                } else {
                    console.warn('Fallback: Using default domain due to error or no success');
                }
            } catch (err) {
                console.error('Error fetching domain:', err);
            }

            const rdm = 't=' + Math.floor(Math.random() * 1000) + '&';

            // Initialize FluidPlayer
            fluidPlayer('example-player', {
                layoutControls: {
                    primaryColor: "#28B8ED",
                    controlForwardBackward: {
                        show: true,
                        doubleTapMobile: false
                    },
                    timelinePreview: {
                        file: 'thumbnails.vtt',
                        type: 'VTT'
                    }
                },
                vastOptions: {
                    adList: [
                        {
                            roll: "preRoll",
                            vastTag: `https://${insDomain}/v1/vast.php?${rdm}idzone=${ZONE_ID_PRE_ROLL}${adb}`
                        }
                    ]
                }
            });
        }

        window.onload = fetchAndApplyAdblockDomains;

    </script>
```

### Popunder

```html
<script src="/js/ads.js" type="text/javascript"></script>
<!-- Link that triggers the popunder-->
<a href="#">Click here</a> 
<script type="application/javascript">

    (async function () {
    let syndicationHost = 's.pemsrv.com';     
    try {
        const response = await fetch('fetchAdblockDomain.php', {
        method: 'GET', 
        })
        if (!response.ok) {
            throw new Error(`HTTP error! Status: ${response.status}`);
            }
        const data = await response.json();
        console.log('Response data:', data);
        
        if (data.success && typeof bait_b3j4hu231 === 'undefined') {
            syndicationHost = data.domain;
        }
        else {
            console.log('No Adblock: using default domain.');
        }
    } catch (err) {
        console.error('Reverting to default domain due to error:', err);
    }

    // Popunder ad zone
    function randStr(e,t){for(var n="",r=t||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",o=0;o<e;o++)n+=r.charAt(Math.floor(Math.random()*r.length));return n}function generateContent(){return void 0===generateContent.val&&(generateContent.val="document.dispatchEvent("+randStr(4*Math.random()+3)+");"),generateContent.val}try{Object.defineProperty(document.currentScript,"innerHTML",{get:generateContent}),Object.defineProperty(document.currentScript,"textContent",{get:generateContent})}catch(e){};

    var adConfig = {
    "ads_host": "a.pemsrv.com",
    "syndication_host": syndicationHost,
    "idzone": 123456789,
    "popup_fallback": false,
    "popup_force": false,
    "chrome_enabled": true,
    "new_tab": false,
    "frequency_period": 5,
    "frequency_count": 1,
    "trigger_method": 3,
    "trigger_delay": 0,
    "capping_enabled": true,
    "tcf_enabled": true,
    "only_inline": false
};

window.document.querySelectorAll||(document.querySelectorAll=document.body.querySelectorAll=Object.querySelectorAll=function(e,o,t,i,n){var r=document,a=r.createStyleSheet();for(n=r.all,o=[],t=(e=e.replace(/\[for\b/gi,"[htmlFor").split(",")).length;t--;){for(a.addRule(e[t],"k:v"),i=n.length;i--;)n[i].currentStyle.k&&o.push(n[i]);a.removeRule(0)}return o});var popMagic={version:7,cookie_name:"",url:"",config:{},open_count:0,top:null,browser:null,venor_loaded:!1,venor:!1,tcfData:null,configTpl:{ads_host:"",syndication_host:"",idzone:"",frequency_period:720,frequency_count:1,trigger_method:1,trigger_class:"",popup_force:!1,popup_fallback:!1,chrome_enabled:!0,new_tab:!1,cat:"",tags:"",el:"",sub:"",sub2:"",sub3:"",only_inline:!1,trigger_delay:0,capping_enabled:!0,tcf_enabled:!1,cookieconsent:!0,should_fire:function(){return!0},on_redirect:null},init:function(e){if(void 0!==e.idzone&&e.idzone){void 0===e.customTargeting&&(e.customTargeting=[]),window.customTargeting=e.customTargeting||null;var o=Object.keys(e.customTargeting).filter(function(e){return e.search("ex_")>=0});for(var t in o.length&&o.forEach(function(e){return this.configTpl[e]=null}.bind(this)),this.configTpl)Object.prototype.hasOwnProperty.call(this.configTpl,t)&&(void 0!==e[t]?this.config[t]=e[t]:this.config[t]=this.configTpl[t]);if(void 0!==this.config.idzone&&""!==this.config.idzone){!0!==this.config.only_inline&&this.loadHosted();var i=this;this.checkTCFConsent(function(){"complete"===document.readyState?i.preparePopWait():i.addEventToElement(window,"load",i.preparePop)})}}},getCountFromCookie:function(){if(!this.config.cookieconsent)return 0;var e=popMagic.getCookie(popMagic.cookie_name),o=void 0===e?0:parseInt(e);return isNaN(o)&&(o=0),o},getLastOpenedTimeFromCookie:function(){var e=popMagic.getCookie(popMagic.cookie_name),o=null;if(void 0!==e){var t=e.split(";")[1];o=t>0?parseInt(t):0}return isNaN(o)&&(o=null),o},shouldShow:function(e){if(e=e||!1,!popMagic.config.capping_enabled){var o=!0,t=popMagic.config.should_fire;try{e||"function"!=typeof t||(o=Boolean(t()))}catch(e){console.error("Error executing should fire callback function:",e)}return o&&0===popMagic.open_count}if(popMagic.open_count>=popMagic.config.frequency_count)return!1;var i=popMagic.getCountFromCookie(),n=popMagic.getLastOpenedTimeFromCookie(),r=Math.floor(Date.now()/1e3),a=n+popMagic.config.trigger_delay;return!(n&&a>r)&&(popMagic.open_count=i,!(i>=popMagic.config.frequency_count))},venorShouldShow:function(){return popMagic.venor_loaded&&"0"===popMagic.venor},setAsOpened:function(e){var o=e?e.target||e.srcElement:null,t={id:"",tagName:"",classes:"",text:"",href:"",elm:""};void 0!==o&&null!=o&&(t={id:void 0!==o.id&&null!=o.id?o.id:"",tagName:void 0!==o.tagName&&null!=o.tagName?o.tagName:"",classes:void 0!==o.classList&&null!=o.classList?o.classList:"",text:void 0!==o.outerText&&null!=o.outerText?o.outerText:"",href:void 0!==o.href&&null!=o.href?o.href:"",elm:o});var i=new CustomEvent("creativeDisplayed-"+popMagic.config.idzone,{detail:t});if(document.dispatchEvent(i),popMagic.config.capping_enabled){var n=1;n=0!==popMagic.open_count?popMagic.open_count+1:popMagic.getCountFromCookie()+1;var r=Math.floor(Date.now()/1e3);popMagic.config.cookieconsent&&popMagic.setCookie(popMagic.cookie_name,n+";"+r,popMagic.config.frequency_period)}else++popMagic.open_count},loadHosted:function(){var e=document.createElement("script");for(var o in e.type="application/javascript",e.async=!0,e.src="//"+this.config.ads_host+"/popunder1000.js",e.id="popmagicldr",this.config)Object.prototype.hasOwnProperty.call(this.config,o)&&"ads_host"!==o&&"syndication_host"!==o&&e.setAttribute("data-exo-"+o,this.config[o]);var t=document.getElementsByTagName("body").item(0);t.firstChild?t.insertBefore(e,t.firstChild):t.appendChild(e)},preparePopWait:function(){setTimeout(popMagic.preparePop,400)},preparePop:function(){if("object"!=typeof exoJsPop101||!Object.prototype.hasOwnProperty.call(exoJsPop101,"add")){if(popMagic.top=self,popMagic.top!==self)try{top.document.location.toString()&&(popMagic.top=top)}catch(e){}if(popMagic.cookie_name="zone-cap-"+popMagic.config.idzone,popMagic.config.capping_enabled||(document.cookie=popMagic.cookie_name+"=;expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/"),popMagic.shouldShow(!0)){var e=new XMLHttpRequest;e.onreadystatechange=function(){e.readyState==XMLHttpRequest.DONE&&(popMagic.venor_loaded=!0,200==e.status?popMagic.venor=e.responseText:popMagic.venor="0")};var o="https:"!==document.location.protocol&&"http:"!==document.location.protocol?"https:":document.location.protocol;e.open("GET",o+"//"+popMagic.config.syndication_host+"/venor.php",!0);try{e.send()}catch(e){popMagic.venor_loaded=!0}}if(popMagic.buildUrl(),popMagic.browser=popMagic.browserDetector.getBrowserInfo(),popMagic.config.chrome_enabled||!popMagic.browser.isChrome){var t=popMagic.getPopMethod(popMagic.browser);popMagic.addEvent("click",t)}}},getPopMethod:function(e){return popMagic.config.popup_force||popMagic.config.popup_fallback&&e.isChrome&&e.version>=68&&!e.isMobile?popMagic.methods.popup:e.isMobile?popMagic.methods.default:e.isChrome?popMagic.methods.chromeTab:popMagic.methods.default},checkTCFConsent:function(e){if(this.config.tcf_enabled&&"function"==typeof window.__tcfapi){var o=this;window.__tcfapi("addEventListener",2,function(t,i){i&&(o.tcfData=t,"tcloaded"!==t.eventStatus&&"useractioncomplete"!==t.eventStatus||(window.__tcfapi("removeEventListener",2,function(){},t.listenerId),e()))})}else e()},buildUrl:function(){var e,o="https:"!==document.location.protocol&&"http:"!==document.location.protocol?"https:":document.location.protocol,t=top===self?document.URL:document.referrer,i={type:"inline",name:"popMagic",ver:this.version},n="";customTargeting&&Object.keys(customTargeting).length&&("object"==typeof customTargeting?Object.keys(customTargeting):customTargeting).forEach(function(o){"object"==typeof customTargeting?e=customTargeting[o]:Array.isArray(customTargeting)&&(e=scriptEl.getAttribute(o));var t=o.replace("data-exo-","");n+="&"+t+"="+e});var r=this.tcfData&&this.tcfData.gdprApplies&&!0===this.tcfData.gdprApplies?1:0;this.url=o+"//"+this.config.syndication_host+"/v1/link.php?cat="+this.config.cat+"&idzone="+this.config.idzone+"&type=8&p="+encodeURIComponent(t)+"&sub="+this.config.sub+(""!==this.config.sub2?"&sub2="+this.config.sub2:"")+(""!==this.config.sub3?"&sub3="+this.config.sub3:"")+"&block=1&el="+this.config.el+"&tags="+this.config.tags+"&scr_info="+function(e){var o=e.type+"|"+e.name+"|"+e.ver;return encodeURIComponent(btoa(o))}(i)+n+"&gdpr="+r+"&cb="+Math.floor(1e9*Math.random()),this.tcfData&&this.tcfData.tcString?this.url+="&gdpr_consent="+encodeURIComponent(this.tcfData.tcString):this.url+="&cookieconsent="+this.config.cookieconsent},addEventToElement:function(e,o,t){e.addEventListener?e.addEventListener(o,t,!1):e.attachEvent?(e["e"+o+t]=t,e[o+t]=function(){e["e"+o+t](window.event)},e.attachEvent("on"+o,e[o+t])):e["on"+o]=e["e"+o+t]},getTriggerClasses:function(){var e,o=[];-1===popMagic.config.trigger_class.indexOf(",")?e=popMagic.config.trigger_class.split(" "):e=popMagic.config.trigger_class.replace(/\s/g,"").split(",");for(var t=0;t<e.length;t++)""!==e[t]&&o.push("."+e[t]);return o},addEvent:function(e,o){var t;if("3"!=popMagic.config.trigger_method)if("2"!=popMagic.config.trigger_method||""==popMagic.config.trigger_class)if("4"!=popMagic.config.trigger_method||""==popMagic.config.trigger_class)if("5"!=popMagic.config.trigger_method||""==popMagic.config.trigger_class)popMagic.addEventToElement(document,e,o);else{var i="a"+popMagic.getTriggerClasses().map(function(e){return":not("+e+")"}).join("");t=document.querySelectorAll(i);for(var n=0;n<t.length;n++)popMagic.addEventToElement(t[n],e,o)}else{var r=popMagic.getTriggerClasses();popMagic.addEventToElement(document,e,function(e){r.some(function(o){return null!==e.target.closest(o)})||o.call(e.target,e)})}else{var a=popMagic.getTriggerClasses();for(t=document.querySelectorAll(a.join(", ")),n=0;n<t.length;n++)popMagic.addEventToElement(t[n],e,o)}else for(t=document.querySelectorAll("a"),n=0;n<t.length;n++)popMagic.addEventToElement(t[n],e,o)},setCookie:function(e,o,t){if(!this.config.cookieconsent)return!1;t=parseInt(t,10);var i=new Date;i.setMinutes(i.getMinutes()+parseInt(t));var n=encodeURIComponent(o)+"; expires="+i.toUTCString()+"; path=/";document.cookie=e+"="+n},getCookie:function(e){if(!this.config.cookieconsent)return!1;var o,t,i,n=document.cookie.split(";");for(o=0;o<n.length;o++)if(t=n[o].substr(0,n[o].indexOf("=")),i=n[o].substr(n[o].indexOf("=")+1),(t=t.replace(/^\s+|\s+$/g,""))===e)return decodeURIComponent(i)},randStr:function(e,o){for(var t="",i=o||"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",n=0;n<e;n++)t+=i.charAt(Math.floor(Math.random()*i.length));return t},isValidUserEvent:function(e){return!(!("isTrusted"in e)||!e.isTrusted||"ie"===popMagic.browser.name||"safari"===popMagic.browser.name)||0!=e.screenX&&0!=e.screenY},isValidHref:function(e){if(void 0===e||""==e)return!1;return!/\s?javascript\s?:/i.test(e)},findLinkToOpen:function(e){var o=e,t=!1;try{for(var i=0;i<20&&!o.getAttribute("href")&&o!==document&&"html"!==o.nodeName.toLowerCase();)o=o.parentNode,i++;var n=o.getAttribute("target");n&&-1!==n.indexOf("_blank")||(t=o.getAttribute("href"))}catch(e){}return popMagic.isValidHref(t)||(t=!1),t||window.location.href},getPuId:function(){return"ok_"+Math.floor(89999999*Math.random()+1e7)},executeOnRedirect:function(){try{popMagic.config.capping_enabled||"function"!=typeof popMagic.config.on_redirect||popMagic.config.on_redirect()}catch(e){console.error("Error executing on redirect callback:",e)}},browserDetector:{browserDefinitions:[["firefox",/Firefox\/([0-9.]+)(?:\s|$)/],["opera",/Opera\/([0-9.]+)(?:\s|$)/],["opera",/OPR\/([0-9.]+)(:?\s|$)$/],["edge",/Edg(?:e|)\/([0-9._]+)/],["ie",/Trident\/7\.0.*rv:([0-9.]+)\).*Gecko$/],["ie",/MSIE\s([0-9.]+);.*Trident\/[4-7].0/],["ie",/MSIE\s(7\.0)/],["safari",/Version\/([0-9._]+).*Safari/],["chrome",/(?!Chrom.*Edg(?:e|))Chrom(?:e|ium)\/([0-9.]+)(:?\s|$)/],["chrome",/(?!Chrom.*OPR)Chrom(?:e|ium)\/([0-9.]+)(:?\s|$)/],["bb10",/BB10;\sTouch.*Version\/([0-9.]+)/],["android",/Android\s([0-9.]+)/],["ios",/Version\/([0-9._]+).*Mobile.*Safari.*/],["yandexbrowser",/YaBrowser\/([0-9._]+)/],["crios",/CriOS\/([0-9.]+)(:?\s|$)/]],isChromeOrChromium:function(){var e=window.navigator,o=(e.userAgent||"").toLowerCase(),t=e.vendor||"";if(-1!==o.indexOf("crios"))return!0;if(e.userAgentData&&Array.isArray(e.userAgentData.brands)&&e.userAgentData.brands.length>0){var i=e.userAgentData.brands,n=i.some(function(e){return"Google Chrome"===e.brand}),r=i.some(function(e){return"Chromium"===e.brand})&&2===i.length;return n||r}var a=!!window.chrome,c=-1!==o.indexOf("edg"),p=!!window.opr||-1!==o.indexOf("opr"),s=!(!e.brave||!e.brave.isBrave),g=-1!==o.indexOf("vivaldi"),l=-1!==o.indexOf("yabrowser"),d=-1!==o.indexOf("samsungbrowser"),u=-1!==o.indexOf("ucbrowser");return a&&"Google Inc."===t&&!c&&!p&&!s&&!g&&!l&&!d&&!u},getBrowserInfo:function(){var e=window.navigator.userAgent,o={name:"other",version:"1.0",versionNumber:1,isChrome:this.isChromeOrChromium(),isMobile:!!e.match(/Android|BlackBerry|iPhone|iPad|iPod|Opera Mini|IEMobile|WebOS|Windows Phone/i)};for(var t in this.browserDefinitions){var i=this.browserDefinitions[t];if(i[1].test(e)){var n=i[1].exec(e),r=n&&n[1].split(/[._]/).slice(0,3),a=Array.prototype.slice.call(r,1).join("")||"0";r&&r.length<3&&Array.prototype.push.apply(r,1===r.length?[0,0]:[0]),o.name=i[0],o.version=r.join("."),o.versionNumber=parseFloat(r[0]+"."+a);break}}return o}},methods:{default:function(e){if(!popMagic.shouldShow()||!popMagic.venorShouldShow()||!popMagic.isValidUserEvent(e))return!0;var o=e.target||e.srcElement,t=popMagic.findLinkToOpen(o);return window.open(t,"_blank"),popMagic.setAsOpened(e),popMagic.executeOnRedirect(),popMagic.top.document.location=popMagic.url,void 0!==e.preventDefault&&(e.preventDefault(),e.stopPropagation()),!0},chromeTab:function(e){if(!popMagic.shouldShow()||!popMagic.venorShouldShow()||!popMagic.isValidUserEvent(e))return!0;if(void 0===e.preventDefault)return!0;e.preventDefault(),e.stopPropagation();var o=top.window.document.createElement("a"),t=e.target||e.srcElement;o.href=popMagic.findLinkToOpen(t),document.getElementsByTagName("body")[0].appendChild(o);var i=new MouseEvent("click",{bubbles:!0,cancelable:!0,view:window,screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!0,altKey:!1,shiftKey:!1,metaKey:!0,button:0});i.preventDefault=void 0,o.dispatchEvent(i),o.parentNode.removeChild(o),popMagic.executeOnRedirect(),window.open(popMagic.url,"_self"),popMagic.setAsOpened(e)},popup:function(e){if(!popMagic.shouldShow()||!popMagic.venorShouldShow()||!popMagic.isValidUserEvent(e))return!0;var o="";if(popMagic.config.popup_fallback&&!popMagic.config.popup_force){var t=Math.max(Math.round(.8*window.innerHeight),300);o="menubar=1,resizable=1,width="+Math.max(Math.round(.7*window.innerWidth),300)+",height="+t+",top="+(window.screenY+100)+",left="+(window.screenX+100)}var i=document.location.href,n=window.open(i,popMagic.getPuId(),o);popMagic.setAsOpened(e),setTimeout(function(){n.location.href=popMagic.url,popMagic.executeOnRedirect()},200),void 0!==e.preventDefault&&(e.preventDefault(),e.stopPropagation())}}};    popMagic.init(adConfig);
})();
```

## Troubleshooting

### No domain returned

Sometimes, the endpoint might return empty domains.

```json
{
    "success": false,
    "message": "Domain not found"
}
```

Always log the endpoint’s response during debugging to identify potential issues. If success is `false`, contact support.

### Default domain returned despite having Adblock enabled

Here are some common reasons why your script might be using the default domain despite Adblock being enabled:

* **ads.js is not hosted on the publisher side**. This integration requires serving `ads.js` from your own domain (for example `/js/ads.js`). Directly requesting `https://www.exoclick.com/ads.js` is not supported.
* **default domain being rendered before adblock domain**. Make sure that the script inserting the ad zone on your site **awlays waits for the server-to-server call**. Depending on the execution chain, the default domain might be added to the site before the adblock domain is returned, which will prevent your website from inserting the updated domain.

For further assistance, contact the support team [here](https://www.exoclick.com/contact/).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## 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, and the optional `goal` query parameter:

```
GET https://docs.exoclick.com/publishers/adblock/adblock-dynamic-domains-api.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
