Load one URL in a WebView and a ready-made icon ad appears. We handle the ad selection, the design, impression tracking and click tracking — your app only has to display it.
Send a GET request with your parameters in the query string.
https://ads.welcomead.com/api/v1/ad/viewIt returns an HTML page, not JSON. Load it directly in an Android WebView or iOS WKWebView — no parsing or rendering needed on your side.
Replace YOUR_API_KEY with the key we provide:
https://ads.welcomead.com/api/v1/ad/view?bundle=com.yourcompany.yourapp&deviceid=device-abc-123&tag=games&format=icon&size=120x150&placement_ctr=2.5&device_ctr=1.8&country=India| Parameter | Required | Example | Description |
|---|---|---|---|
key | Optional | wad_live_... | Optional. Send it and your traffic is tracked separately for reporting and revenue share. Ads work without it too. |
bundle | Optional | com.instagram.android | The package name of YOUR OWN app (the one showing the ad). We use it to never advertise your own app back to your users — the user already has it installed. |
installed | Optional | com.whatsapp,com.spotify.music | Comma-separated package names already installed on the device. We never return an ad for any of them. We also remember them, so you do not have to resend the full list every time. |
deviceid | Optional | device-abc-123 | Unique device identifier. Enables install attribution, stops showing apps the user already installed, and rotates the ad so the same one is not repeated on every request. |
tag | Optional | games | Your slot / content tag. Used for targeting and appears in reports. |
format | Optional | icon | Ad format. Currently only 'icon' is supported. Defaults to icon. |
size | Optional | 120x150 | Slot size in pixels. The ad layout adapts automatically to fit. |
placement_ctr | Optional | 2.5 | This slot's historical CTR, in percent. |
device_ctr | Optional | 1.8 | This device's historical CTR, in percent. |
country | Optional | India | User country. Used for country targeting — ads that are not permitted in that country are never returned. Also recorded on impressions and clicks. |
Only key is mandatory. The more targeting values you send, the better the ad we can pick — which means a higher click rate for you.
Open any example below in a browser — no setup needed:
Prefer a form? Use the interactive URL builder to set parameters, preview the ad at different slot sizes, and copy the finished URL.
WebView ad = findViewById(R.id.adSlot);
ad.getSettings().setJavaScriptEnabled(true);
ad.setBackgroundColor(Color.TRANSPARENT);
// IMPORTANT: store link must open outside the WebView
ad.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView v, WebResourceRequest r) {
startActivity(new Intent(Intent.ACTION_VIEW, r.getUrl()));
return true;
}
});
ad.loadUrl("https://ads.welcomead.com/api/v1/ad/view?bundle=" + getPackageName()
+ "&deviceid=" + deviceId + "&tag=games&format=icon&size=120x150");let ad = WKWebView(frame: slot.bounds)
ad.isOpaque = false
ad.backgroundColor = .clear
ad.navigationDelegate = self
ad.load(URLRequest(url: URL(string:
"https://ads.welcomead.com/api/v1/ad/view?bundle=\(Bundle.main.bundleIdentifier!)&deviceid=\(deviceId)&tag=games&format=icon&size=120x150")!))
// IMPORTANT: store link must open outside the WebView
func webView(_ w: WKWebView, decidePolicyFor n: WKNavigationAction,
decisionHandler d: @escaping (WKNavigationActionPolicy) -> Void) {
if n.navigationType == .linkActivated, let u = n.request.url {
UIApplication.shared.open(u); d(.cancel); return
}
d(.allow)
}| Header | Meaning |
|---|---|
X-Ad-Filled: true | An ad was returned — show the WebView. |
X-Ad-Filled: false | No ad available — hide the WebView. |
X-Ad-Id | The served ad's ID, for your own logs. |
On no fill we return an empty transparent page — never an error page — so a failed request can never show broken content inside your app.
Because we render the ad, we can improve the design or add new formats without you shipping an app update.
When an app that we advertised gets installed, tell us with one call. We match on the device ID and the package name, so send the same deviceid you used on the ad request.
An install is attributed only if that app's ad was clicked from that device within the last 7 days. This is standard click-through attribution — an impression on its own is not enough. In WebView mode the click goes through us automatically; in JSON mode you must open the click_url we return instead of linking straight to the store.
GET https://ads.welcomead.com/api/v1/ad/install
?deviceid=device-abc-123
&package_name=com.example.game| Parameter | Required | Notes |
|---|---|---|
deviceid | Yes | The same device ID you sent on the ad request. Alias: device_id. |
package_name | Yes | The installed package. Case does not matter. Aliases: package, bundle. |
country, tag | Optional | Stored on the install event so it appears in country-wise and slot-wise reports. |
click_id | Optional | Alternative matching method, using the Play Install Referrer. If sent, it is used instead. |
| Response | Meaning |
|---|---|
200 · duplicate: false | Install counted. |
200 · duplicate: true | You already reported this one. Safe to ignore. |
404 · no_ad_served | We never advertised that package to that device. |
404 · no_click | The ad was shown but never tapped on that device. |
404 · click_expired | The last click is more than 7 days old. |
400 | deviceid or package_name missing. |
Once an install is counted, we stop serving that app to that device, and the install appears in the advertiser's report the same day.