{"_id":"@adxensor/publisher-sdk","_rev":"6-d79d96e9b0b27d33be231360dff20e83","name":"@adxensor/publisher-sdk","dist-tags":{"latest":"1.0.5"},"versions":{"1.0.0":{"name":"@adxensor/publisher-sdk","version":"1.0.0","license":"UNLICENSED","_id":"@adxensor/publisher-sdk@1.0.0","maintainers":[{"name":"azizvorrez","email":"azizvorrez8@gmail.com"}],"dist":{"shasum":"98eb40dbb9b646cb928b952ecbe22179f580a707","tarball":"https://registry.npmjs.org/@adxensor/publisher-sdk/-/publisher-sdk-1.0.0.tgz","fileCount":26,"integrity":"sha512-BiaY7m+oetXDj4gdtP1bxmJo3W6CTR+2NR+xZ/ZVQMHF5YK6CdRoTCxNy2GF21GHTeTZ8Z3XZix9A5Z/0IrVGw==","signatures":[{"sig":"MEQCIFrvtaErz5KMH0hyNIxu5jSoZ0rO/e0jE6WJulToOVA5AiBsusJp97BFnQujs1QNEzFlFWaagLEbBg87eiEfJM/iaA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":144146},"main":"./dist/npm/cjs/index.cjs","type":"module","types":"./dist/npm/types/index.d.ts","module":"./dist/npm/esm/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/npm/types/index.d.ts","import":"./dist/npm/esm/index.js","require":"./dist/npm/cjs/index.cjs"}},"gitHead":"be07d84f3ccf98c2e7cdcaf5abb1d1c661072727","private":false,"scripts":{"build":"npm run build:cdn && npm run build:npm","clean":"rm -rf dist","build:cdn":"node scripts/build-cdn.mjs","build:npm":"node scripts/build-npm.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"azizvorrez","email":"azizvorrez8@gmail.com"},"_npmVersion":"10.8.2","description":"AdXensor publisher SDK — CDN tag and npm package for ad serving, impression, click, and view tracking","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.21.0","typescript":"^5.4.0"},"_npmOperationalInternal":{"tmp":"tmp/publisher-sdk_1.0.0_1774797496218_0.1931114141221293","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@adxensor/publisher-sdk","version":"1.0.1","keywords":["adxensor","advertising","ad-network","publisher","ads","banner","tracking","impression","click","viewability","cdn","monetization","display-advertising","adtech","africa"],"author":{"url":"https://adxensor.com","name":"AdXensor"},"license":"UNLICENSED","_id":"@adxensor/publisher-sdk@1.0.1","maintainers":[{"name":"azizvorrez","email":"azizvorrez8@gmail.com"}],"homepage":"https://docs.adxensor.com/publisher-sdk","bugs":{"url":"https://gitlab.com/adxensor/adxensor-publisher-sdk/-/issues","email":"support@adxensor.com"},"dist":{"shasum":"079663b339b9d21ca12258644d0c0a13601360cd","tarball":"https://registry.npmjs.org/@adxensor/publisher-sdk/-/publisher-sdk-1.0.1.tgz","fileCount":28,"integrity":"sha512-HMDb2s29YLvNDmn/xQ/eyzkvLI146/Lb110J3uGw8QUWjuRt1y3oiLPv2t/cT1n2UIYdCSs2G77YzHUh07Be2g==","signatures":[{"sig":"MEQCIGp8lGPW1Hya9z9GucXw8Jt86LHA7szSAgCk8Hr1dzdAAiBTxgQaBLuWeWL6FL7iK23PazljFX/2b6HEGk3nYlL4gg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":154039},"main":"./dist/npm/cjs/index.cjs","type":"module","types":"./dist/npm/types/index.d.ts","module":"./dist/npm/esm/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/npm/types/index.d.ts","import":"./dist/npm/esm/index.js","require":"./dist/npm/cjs/index.cjs"}},"gitHead":"cc28eae95aa5bb009b103220e8f5d3a904acffcd","private":false,"scripts":{"build":"npm run build:cdn && npm run build:npm","clean":"rm -rf dist","build:cdn":"node scripts/build-cdn.mjs","build:npm":"node scripts/build-npm.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"azizvorrez","email":"azizvorrez8@gmail.com"},"repository":{"url":"git+https://gitlab.com/adxensor/adxensor-publisher-sdk.git","type":"git"},"_npmVersion":"10.8.2","description":"AdXensor publisher SDK — serve ads, track impressions, clicks, views and pageviews directly from any website or web app.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.21.0","typescript":"^5.4.0"},"_npmOperationalInternal":{"tmp":"tmp/publisher-sdk_1.0.1_1774798363269_0.3258045583372218","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@adxensor/publisher-sdk","version":"1.0.2","keywords":["adxensor","advertising","ad-network","publisher","ads","banner","tracking","impression","click","viewability","cdn","monetization","display-advertising","adtech","africa"],"author":{"url":"https://adxensor.com","name":"AdXensor"},"license":"UNLICENSED","_id":"@adxensor/publisher-sdk@1.0.2","maintainers":[{"name":"azizvorrez","email":"azizvorrez8@gmail.com"}],"homepage":"https://docs.adxensor.com/publisher-sdk","bugs":{"url":"https://gitlab.com/adxensor/adxensor-publisher-sdk/-/issues","email":"support@adxensor.com"},"dist":{"shasum":"6f24641fb72037070b4823eb1d1a78eda9a5afae","tarball":"https://registry.npmjs.org/@adxensor/publisher-sdk/-/publisher-sdk-1.0.2.tgz","fileCount":28,"integrity":"sha512-o5xm7+PBPcx9dBANRlIilXY9G8UZbMcSgmhl5Tb73KU5W8Aw41PtsdmSQsNWRVxPtpvi8shLwFMOVpq2Lc093g==","signatures":[{"sig":"MEQCIDQqwt3tDlpiHnCmcYxE9+O0GCBl1mGTu6X9xL6PhhIHAiBWF4AZO6vePKE7P7gmnary2J8TFHILJXQH89sXD/n52g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":154039},"main":"./dist/npm/cjs/index.cjs","type":"module","types":"./dist/npm/types/index.d.ts","module":"./dist/npm/esm/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/npm/types/index.d.ts","import":"./dist/npm/esm/index.js","require":"./dist/npm/cjs/index.cjs"}},"gitHead":"35aa9f626adc047f787e9b92f557b7a5ac015d71","private":false,"scripts":{"build":"npm run build:cdn && npm run build:npm","clean":"rm -rf dist","build:cdn":"node scripts/build-cdn.mjs","build:npm":"node scripts/build-npm.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"azizvorrez","email":"azizvorrez8@gmail.com"},"repository":{"url":"git+https://gitlab.com/adxensor/adxensor-publisher-sdk.git","type":"git"},"_npmVersion":"10.8.2","description":"AdXensor publisher SDK — serve ads, track impressions, clicks, views and pageviews directly from any website or web app.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.21.0","typescript":"^5.4.0"},"_npmOperationalInternal":{"tmp":"tmp/publisher-sdk_1.0.2_1774798666273_0.37598761382122814","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@adxensor/publisher-sdk","version":"1.0.3","keywords":["adxensor","advertising","ad-network","publisher","ads","banner","tracking","impression","click","viewability","cdn","monetization","display-advertising","adtech","africa"],"author":{"url":"https://adxensor.com","name":"AdXensor"},"license":"UNLICENSED","_id":"@adxensor/publisher-sdk@1.0.3","maintainers":[{"name":"azizvorrez","email":"azizvorrez8@gmail.com"}],"homepage":"https://docs.adxensor.com/publisher-sdk","bugs":{"url":"https://gitlab.com/adxensor/adxensor-publisher-sdk/-/issues","email":"support@adxensor.com"},"dist":{"shasum":"3775e8ad42204a5b5be7a194fa8ef51061b7b0b2","tarball":"https://registry.npmjs.org/@adxensor/publisher-sdk/-/publisher-sdk-1.0.3.tgz","fileCount":28,"integrity":"sha512-fXoA29FElPVnc3owPGZ8nHqMenxAv7o8kMh1qxx73XcAVGbAidDraJXWGa3k9C27AZXDU35VKVxLFedxaZDdEA==","signatures":[{"sig":"MEUCIAeGHgAm7dGQ8OoQPGBoqD8kpYYidQu+Cdw7Q5WmfCwYAiEAp6ax2q52vszXcG/lJIeCTueJWK+I6uFI+5Q/NGAkxPQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":156937},"main":"./dist/npm/cjs/index.cjs","type":"module","types":"./dist/npm/types/index.d.ts","module":"./dist/npm/esm/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/npm/types/index.d.ts","import":"./dist/npm/esm/index.js","require":"./dist/npm/cjs/index.cjs"}},"gitHead":"d5fdd378f91fc767d21e23c14c9e75e208a4f80b","private":false,"scripts":{"build":"npm run build:cdn && npm run build:npm","clean":"rm -rf dist","build:cdn":"node scripts/build-cdn.mjs","build:npm":"node scripts/build-npm.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"azizvorrez","email":"azizvorrez8@gmail.com"},"repository":{"url":"git+https://gitlab.com/adxensor/adxensor-publisher-sdk.git","type":"git"},"_npmVersion":"10.8.2","description":"AdXensor publisher SDK — serve ads, track impressions, clicks, views and pageviews directly from any website or web app.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.21.0","typescript":"^5.4.0"},"_npmOperationalInternal":{"tmp":"tmp/publisher-sdk_1.0.3_1774999055761_0.49356951225841605","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@adxensor/publisher-sdk","version":"1.0.4","keywords":["adxensor","advertising","ad-network","publisher","ads","banner","tracking","impression","click","viewability","cdn","monetization","display-advertising","adtech","africa"],"author":{"url":"https://adxensor.com","name":"AdXensor"},"license":"UNLICENSED","_id":"@adxensor/publisher-sdk@1.0.4","maintainers":[{"name":"azizvorrez","email":"azizvorrez8@gmail.com"}],"homepage":"https://docs.adxensor.com/publisher-sdk","bugs":{"url":"https://gitlab.com/adxensor/adxensor-publisher-sdk/-/issues","email":"support@adxensor.com"},"dist":{"shasum":"97bd7431ac61a7e98fab6b49ef6f74183f134083","tarball":"https://registry.npmjs.org/@adxensor/publisher-sdk/-/publisher-sdk-1.0.4.tgz","fileCount":28,"integrity":"sha512-22K96is1xfVAq42q7QlBfQgun+ajtjNUWCfXQk5tWXManFkrFWXW0L4T+jrhEJtwfYAKgjXc6GKCSXOzE1I1Mw==","signatures":[{"sig":"MEUCIQCYRdlMTjao2qTrDk8Vxg4UX9YBCG5dImCoCEM6hr23sgIgfHbiMODAybpOPGG8TQDa0wQaZyeoxK/5/ZLOscUQRa8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":156939},"main":"./dist/npm/cjs/index.cjs","type":"module","types":"./dist/npm/types/index.d.ts","module":"./dist/npm/esm/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/npm/types/index.d.ts","import":"./dist/npm/esm/index.js","require":"./dist/npm/cjs/index.cjs"}},"gitHead":"5a17149f06ac07475e45de5770a7655d53d24ab4","private":false,"scripts":{"build":"npm run build:cdn && npm run build:npm","clean":"rm -rf dist","build:cdn":"node scripts/build-cdn.mjs","build:npm":"node scripts/build-npm.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"azizvorrez","email":"azizvorrez8@gmail.com"},"repository":{"url":"git+https://gitlab.com/adxensor/adxensor-publisher-sdk.git","type":"git"},"_npmVersion":"10.8.2","description":"AdXensor publisher SDK — serve ads, track impressions, clicks, views and pageviews directly from any website or web app.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.21.0","typescript":"^5.4.0"},"_npmOperationalInternal":{"tmp":"tmp/publisher-sdk_1.0.4_1775001341345_0.44957498995243994","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@adxensor/publisher-sdk","version":"1.0.5","description":"AdXensor publisher SDK — serve ads, track impressions, clicks, views and pageviews directly from any website or web app.","license":"UNLICENSED","private":false,"type":"module","main":"./dist/npm/cjs/index.cjs","module":"./dist/npm/esm/index.js","types":"./dist/npm/types/index.d.ts","exports":{".":{"import":"./dist/npm/esm/index.js","require":"./dist/npm/cjs/index.cjs","types":"./dist/npm/types/index.d.ts"}},"scripts":{"build":"npm run build:cdn && npm run build:npm","build:cdn":"node scripts/build-cdn.mjs","build:npm":"node scripts/build-npm.mjs","typecheck":"tsc --noEmit","clean":"rm -rf dist"},"keywords":["adxensor","advertising","ad-network","publisher","ads","banner","tracking","impression","click","viewability","cdn","monetization","display-advertising","adtech","africa"],"author":{"name":"AdXensor","url":"https://adxensor.com"},"repository":{"type":"git","url":"git+https://gitlab.com/adxensor/adxensor-publisher-sdk.git"},"bugs":{"url":"https://gitlab.com/adxensor/adxensor-publisher-sdk/-/issues","email":"support@adxensor.com"},"homepage":"https://docs.adxensor.com/publisher-sdk","devDependencies":{"esbuild":"^0.21.0","typescript":"^5.4.0"},"engines":{"node":">=18"},"sideEffects":false,"_id":"@adxensor/publisher-sdk@1.0.5","gitHead":"b580bfc5dd6bcf0d7d8c90159997ae30e87f58d5","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-nP1s9Tj8YhEsw1EUtVzZIXfnaEbjKGt2gDNPJM9jrup51c/PRd0xp+UxyqzYbahiEYQZKJ4upLFg/UaLVSXJFg==","shasum":"c3bbf96e27682ba8875b1769fa2be8c299f1a5b3","tarball":"https://registry.npmjs.org/@adxensor/publisher-sdk/-/publisher-sdk-1.0.5.tgz","fileCount":28,"unpackedSize":156939,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIEuNT9AnCx/j8d3EWnYdD5GyJdvTv1Rp6YsO9DEcmksyAiEA1RmM0BybBy9R1epnACU2BKEwMKCwuo1ElntpgpEcl6g="}]},"_npmUser":{"name":"azizvorrez","email":"azizvorrez8@gmail.com"},"directories":{},"maintainers":[{"name":"azizvorrez","email":"azizvorrez8@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/publisher-sdk_1.0.5_1775209412389_0.8949803406811185"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-29T15:18:16.165Z","modified":"2026-04-03T09:43:32.657Z","1.0.0":"2026-03-29T15:18:16.419Z","1.0.1":"2026-03-29T15:32:43.495Z","1.0.2":"2026-03-29T15:37:46.425Z","1.0.3":"2026-03-31T23:17:36.025Z","1.0.4":"2026-03-31T23:55:41.492Z","1.0.5":"2026-04-03T09:43:32.526Z"},"bugs":{"url":"https://gitlab.com/adxensor/adxensor-publisher-sdk/-/issues","email":"support@adxensor.com"},"author":{"name":"AdXensor","url":"https://adxensor.com"},"license":"UNLICENSED","homepage":"https://docs.adxensor.com/publisher-sdk","keywords":["adxensor","advertising","ad-network","publisher","ads","banner","tracking","impression","click","viewability","cdn","monetization","display-advertising","adtech","africa"],"repository":{"type":"git","url":"git+https://gitlab.com/adxensor/adxensor-publisher-sdk.git"},"description":"AdXensor publisher SDK — serve ads, track impressions, clicks, views and pageviews directly from any website or web app.","maintainers":[{"name":"azizvorrez","email":"azizvorrez8@gmail.com"}],"readme":"# @adxensor/publisher-sdk\n\n**AdXensor Publisher SDK** — Serve ads, track impressions, clicks, views and pageviews directly from any website or web app.\nWorks as a CDN `<script>` snippet **or** as an npm package. Zero runtime dependencies.\n\n[![npm version](https://img.shields.io/npm/v/@adxensor/publisher-sdk.svg)](https://www.npmjs.com/package/@adxensor/publisher-sdk)\n[![License](https://img.shields.io/badge/license-UNLICENSED-red.svg)](https://adxensor.com)\n\n---\n\n## Table of Contents\n\n- [How it works](#how-it-works)\n- [CDN snippet (recommended)](#cdn-snippet-recommended)\n- [npm package](#npm-package)\n- [Ad slot attributes](#ad-slot-attributes)\n- [Supported formats](#supported-formats)\n- [Events tracked](#events-tracked)\n- [Advanced usage](#advanced-usage)\n- [TypeScript](#typescript)\n- [Requirements](#requirements)\n- [Support](#support)\n\n---\n\n## How it works\n\n```\nPublisher website                  AdXensor (core.adxensor.com)\n────────────────────────────────────────────────────────────────\n1. Page loads tag.js          →    Fires pageview event\n2. SDK finds <ins> slots       →    GET /v1/ad?zone=SIZE&site=ID\n3. Renders creative            ←    Returns image URL + click URL\n4. Ad enters viewport (50%)   →    POST /v1/events/impression\n5. Visible ≥ 1 second          →    POST /v1/events/view\n6. User clicks ad              →    POST /v1/events/click\n                                    Redirect → Advertiser URL\n```\n\nCountry, browser and OS are resolved **server-side** from the visitor's IP and User-Agent — the SDK never reads or stores personal data.\n\n---\n\n## CDN snippet (recommended)\n\nPaste once in your `<head>`, then place `<ins>` tags wherever you want ads.\n\n### 1. Load the SDK\n\n```html\n<script async\n  src=\"https://cdn.adxensor.com/tag.js\"\n  data-ad-client=\"pub-XXXXXXXX\">\n</script>\n```\n\nReplace `pub-XXXXXXXX` with your **Site ID** from the AdXensor publisher dashboard.\n\n### 2. Place an ad slot\n\n```html\n<ins class=\"adxensor\"\n     style=\"display:block\"\n     data-ad-slot=\"header-banner\"\n     data-ad-format=\"728x90\">\n</ins>\n```\n\nThat's it. The SDK automatically fills every `<ins class=\"adxensor\">` on the page.\n\n---\n\n### AdSense-style push (fill one slot at a time)\n\nIf you prefer to control when each slot loads — identical to Google AdSense:\n\n```html\n<ins class=\"adxensor\"\n     style=\"display:block\"\n     data-ad-slot=\"sidebar\"\n     data-ad-format=\"300x250\">\n</ins>\n<script>\n  (window.adxensor = window.adxensor || []).push({});\n</script>\n```\n\n### Pre-load queue (calls before the script is ready)\n\n```html\n<script>\n  window.adxensor = window.adxensor || [];\n  window.adxensor.push({});   // queued, executed once tag.js is ready\n</script>\n<!-- tag.js can be anywhere on the page -->\n<script async src=\"https://cdn.adxensor.com/tag.js\" data-ad-client=\"pub-XXXXXXXX\"></script>\n```\n\n---\n\n### CDN script attributes\n\n| Attribute | Required | Description |\n|---|---|---|\n| `data-ad-client` | ✅ | Your Site ID from the publisher dashboard |\n| `data-api-key` | — | Optional publisher API key for authenticated sites |\n| `data-lazy-load` | — | Set to `\"false\"` to disable lazy loading |\n| `data-debug` | — | Enables verbose console logs |\n\n---\n\n## npm package\n\nInstall if you use a bundler (Vite, webpack, Next.js, etc.).\n\n```bash\nnpm install @adxensor/publisher-sdk\n```\n\n### Basic setup\n\n```typescript\nimport { AdXensor } from '@adxensor/publisher-sdk';\n\nconst adx = new AdXensor({\n  siteId:   'pub-XXXXXXXX',  // your Site ID\n  apiKey:   'YOUR_API_KEY',  // optional\n  lazyLoad: true,            // default: true\n  debug:    false,\n});\n\nadx.init(); // fires pageview + fills all <ins class=\"adxensor\"> slots\n```\n\n### Fill a specific slot programmatically\n\n```typescript\n// By CSS selector\nadx.defineSlot('#my-banner', { format: '300x250' });\n\n// On a specific element\nconst el = document.getElementById('my-banner') as HTMLElement;\nadx.fill(el, { format: '728x90' });\n```\n\n### Singleton (one instance per page)\n\n```typescript\nimport { AdXensor } from '@adxensor/publisher-sdk';\n\n// Always returns the same instance\nconst adx = AdXensor.getInstance({ siteId: 'pub-XXXXXXXX' });\nadx.init();\n```\n\n### React / Next.js example\n\n```tsx\n'use client';\nimport { useEffect } from 'react';\nimport { AdXensor } from '@adxensor/publisher-sdk';\n\nexport function AdSlot({ slot, format }: { slot: string; format: string }) {\n  useEffect(() => {\n    const adx = AdXensor.getInstance({ siteId: 'pub-XXXXXXXX' });\n    adx.defineSlot(`[data-ad-slot=\"${slot}\"]`, { format });\n  }, [slot, format]);\n\n  return (\n    <ins\n      className=\"adxensor\"\n      style={{ display: 'block' }}\n      data-ad-slot={slot}\n      data-ad-format={format}\n    />\n  );\n}\n```\n\n---\n\n## Ad slot attributes\n\n| Attribute | Description | Example |\n|---|---|---|\n| `class=\"adxensor\"` | **Required.** Identifies the element as an ad slot | — |\n| `style=\"display:block\"` | **Required.** Prevents collapsed slots | — |\n| `data-ad-slot` | Slot name (used for reporting) | `\"header-banner\"` |\n| `data-ad-format` | Ad size. Defaults to `auto` | `\"728x90\"` |\n| `data-ad-lazy` | Presence enables lazy loading for this slot | — |\n\n---\n\n## Supported formats\n\n| Format | Size | Placement |\n|---|---|---|\n| `728x90` | 728 × 90 | Leaderboard — top/bottom of page |\n| `970x90` | 970 × 90 | Super leaderboard |\n| `970x250` | 970 × 250 | Billboard |\n| `300x250` | 300 × 250 | Medium rectangle — sidebar / in-feed |\n| `300x600` | 300 × 600 | Half page — sidebar |\n| `160x600` | 160 × 600 | Wide skyscraper |\n| `320x50` | 320 × 50 | Mobile banner |\n| `320x100` | 320 × 100 | Large mobile banner |\n| `468x60` | 468 × 60 | Full banner |\n| `auto` | dynamic | Best fit for device + container width |\n\n---\n\n## Events tracked\n\nAll events are fired automatically. No manual instrumentation needed.\n\n| Event | Trigger | Deduplication |\n|---|---|---|\n| **pageview** | Page load | Once per page load |\n| **impression** | Ad rendered | Once per ad × session |\n| **view** | Ad ≥ 50% visible for ≥ 1 second (IAB MRC) | Once per ad × session |\n| **click** | User clicks the ad | 500 ms debounce |\n\nEvents are sent via `navigator.sendBeacon` (non-blocking, survives page unload). Falls back to `fetch` with `keepalive: true`.\n\n---\n\n## Advanced usage\n\n### Access lower-level APIs\n\n```typescript\nimport { AdXensorApi, Tracker, getSessionId } from '@adxensor/publisher-sdk';\n\nconst api = new AdXensorApi('https://core.adxensor.com/v1', 'YOUR_API_KEY');\nconst sessionId = getSessionId();\nconst tracker = new Tracker(api, 'pub-XXXXXXXX', sessionId);\n\n// Manual event firing\ntracker.pageview();\ntracker.impression('adId', 'slotId', 'impressionToken');\ntracker.view('adId', 'slotId');\ntracker.click('adId', 'slotId', 'clickToken');\n```\n\n### Destroy and reset (SPA route changes)\n\n```typescript\nadx.destroy();        // stop DOM observer, clear timers\nAdXensor.reset();     // destroy + clear the singleton\n```\n\n---\n\n## TypeScript\n\nThe SDK is written in TypeScript and ships full type declarations.\n\n```typescript\nimport type {\n  AdXensorConfig,\n  SlotOptions,\n  AdFormat,\n  DeviceType,\n  AdResponse,\n  SlotState,\n} from '@adxensor/publisher-sdk';\n\nconst config: AdXensorConfig = {\n  siteId:   'pub-XXXXXXXX',\n  lazyLoad: true,\n};\n\nconst options: SlotOptions = {\n  format: '300x250',\n  lazy:   false,\n};\n```\n\n---\n\n## Requirements\n\n| Environment | Minimum version |\n|---|---|\n| Node.js (npm build) | 18+ |\n| Browser (CDN) | Chrome 58, Firefox 57, Safari 11, Edge 16 |\n| IntersectionObserver | Required for lazy load + viewability (polyfill for IE) |\n\n---\n\n## Support\n\n- **Dashboard** — [app.adxensor.com](https://app.adxensor.com)\n- **Documentation** — [docs.adxensor.com](https://docs.adxensor.com)\n- **Issues** — [GitLab Issues](https://gitlab.com/adxensor/adxensor-publisher-sdk/-/issues)\n- **Email** — [support@adxensor.com](mailto:support@adxensor.com)\n\n---\n\n© 2025 AdXensor. All rights reserved.\n","readmeFilename":"README.md"}