Troubleshooting
Find your symptom, get the exact fix. Almost every integration problem people hit turns out to be one of these ten things.
First: the 60-second checklist
Before digging deeper, confirm these five things — they cover the vast majority of reported issues:
- You're using an official SDK, or you've set an explicit, non-default
User-Agent— see User-Agent rules. - You're passing a real, active
slot_id— check it in the publisher dashboard, and confirm the Slot'sformatisbanner,interstitial, ornative(notrewarded/video). - You haven't hand-rolled URL-encoding for
page_url/page_keywords— see WAF-safe encoding. - You're not refreshing more often than every 30 seconds per Slot.
- You've checked whether Sandbox mode is on when you didn't mean it to be (or off when you did).
# Sanity-check the raw endpoint outside your app entirely:
curl -v "https://api.adx.theaimart.co/api/v1/serve/ad?api_key=pk_...&slot_id=..." \
-H "User-Agent: theaimart-adx-node/1.0.0" \
-H "Accept: application/json"
# Read the actual HTTP status + body before assuming your app code is the problem.Symptom → cause → fix
Every request returns { fill: false } — 100% no-fill, no errors anywhere
User-Agent. Your HTTP client's default UA (python-requests, okhttp, curl/…, Java/…) is on the backend's bot blocklist, which returns an ordinary no-fill with zero indication anything is wrong.FixUse an official SDK (it sets this for you), or set an explicit User-Agent header yourself that doesn't contain any of the blocked substrings. Full list: User-Agent rules.Requests that used to work suddenly 403 with "Request blocked due to security policy"
page_url/page_keywords contains a substring the WAF treats as SQL-injection-shaped — end, open, select, @, etc. These show up in totally ordinary URLs (/weekend-sale, ?ref=open).FixByte-percent-encode the value instead of using ordinary URL-encoding — every official SDK does this automatically. See WAF-safe encoding if you're building a custom client.Web SDK: fetch fails with a CORS error in the browser console
adx.theaimart.co/theaimart.co. Serving directly from an arbitrary publisher domain isn't supported yet.FixSee the CORS note on the Web SDK page. Native mobile/server SDKs are unaffected — this is web-browser-only.House ads never fire a viewability beacon / impId is always null for them
ad.isTrackable (equivalent to impId != null) instead of just ad.filled — see Response shapes.429 Too Many Requests, or ads suddenly stop appearing after working fine
Retry-After header before retrying. See Rate limits & errors.An OpenRTB/HTML creative renders blank, or throws a script error in the console
A click_url does nothing when tapped/clicked
http/https (e.g. a stray javascript: or intent: URL from a hostile or malformed creative) and every SDK deliberately refuses to navigate to it.FixThis is a safety feature, not a bug — see Navigation / URL safety in the security model. The image still renders; only the link is dropped.Server-side integration (Node/Python/Rust): fill rate is far lower than the same traffic gets in a plain browser
User-Agent and X-Forwarded-For/client IP through to requestAd/request_ad on every call. See Requesting an ad.Sandbox mode isn't behaving differently from production
A rewarded or video slot never fills
banner, interstitial, or native format slots for now. See Getting credentials.Still stuck?
Re-read Core concepts if any of the terms above are unfamiliar, check the FAQ for conceptual questions this page doesn't cover, or email support@theaimart.co with the raw request and response from the sanity-check curl above — that single pair of status code + body resolves most tickets immediately.