Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
OpenAD Protocol Overview
OpenAD Protocol is a decentralized in-app advertising solution integrated within Mini Dapp based on LINE Messenger. We actively assist dapps in achieving genuine user growth and monetization within their traffic on Mini Dapps. By partnering with us, many clients have successfully leveraged OpenAD to drive growth and generate substantial revenue.
Key Features
For Publishers: Quick bidding, low-cost traffic exchange, easy setup. For Advertisers: Reach real users with precise targeting, no duplicate charges, and transparent ads.
300M Labeled Users
30M Daily Active Users
180M Monthly Active Users
1500+ Clients
We collaborate with a wide range of partners to deliver outstanding results and drive growth.
OpenAD is thrilled to partner with LINE NEXT Inc., expanding our reach to millions of engaged users globally. This collaboration opens up new advertising opportunities, bringing precise targeting and seamless ad integration to LINE NEXT’s vibrant ecosystem.
With LINE NEXT, OpenAD’s platform now offers enhanced visibility, stronger engagement, and new advertising formats to help businesses grow.
The following pages are instructions for advertisers seeking real user growth and traffic to launch an ad campaign.
1000+ Advertisers


Discover the range of advertising formats offered by OpenAD to optimize engagement, drive results, and support your business goals.
Description
Static ads are displayed within the app interface. It is ideal for building brand awareness and driving traffic to specific destinations. The Volume Owner controls ad placements and is typically positioned in high-visibility areas within the mini-app.
The system uses targeting, user profiles, and interests to match the most relevant ad to the user through big data.
Banner Dimensions: A main image format (up to 2 Mb) with an optimal size of 936x120px
User Redirect URL: direct access to the promotional page.
Description
Interactive Ads are where users engage voluntarily to receive in-app rewards. Volume Owner can customize the ad entry points and set up reward mechanisms, ensuring a seamless integration with the mini-app experience.
The publisher can customize the ad entry points and reward content. Users click to trigger the ad. The button can be placed anywhere within the app.
User-Initiated Interaction: Ads are seamlessly integrated into the Volume Owner's mini-app, where users voluntarily view them as part of engaging with in-app incentive activities.
Smooth Playback: GIF or Static Ads play automatically, ensuring an uninterrupted experience.
Reward Delivery: After completing the ad task, users return to the mini-app and receive rewards.
Media Format Choose either an image or a GIF animation - Image: 1:1 ratio, up to 2 MB, 240px - 1024px - GIF Animation : 1:1 ratio, up to 2 MB, 240px - 600px
Ad Title: 3-32 characters.
Ad Description: 10-160 characters.
User Redirect URL
Ad Placement
The ad is displayed when users enter the mini-app. Users can skip the ad at any time or wait for an automatic 5-second countdown before it closes.
Ad Logic
The system intelligently matches the most relevant ad to users based on targeting parameters, browsing behavior, and user interests within the mini-app.
Stay tuned—Splash Ads and Display Ads are coming soon!
OpenAD Protocol provides a streamlined process for advertisers to set up and manage ad campaigns efficiently. This guide outlines the essential steps to launch your campaign.
Universal Campaign Setup Flow (for Banner & Interactive Ads)
Sign Up & Top Up Your Wallet – Create an account or log in, and ensure sufficient funds to cover your ad spend before starting a campaign.
Start a Campaign and Set Up Details –Select your ad format - Banner Ads or Interactive Ads. Then define targeting, budget, and bidding strategy.
Upload Ad Assets – Provide images, GIFs, titles, descriptions, and the destination URL.
Review & Manage – Double-check all details, save drafts, submit for review, and make any necessary edits. Once approved, track performance and optimize as needed.


This document provides step-by-step instructions for using the OpenAD JS SDK to display banner ads & interactive ads across different platforms.
Banner Ads - Ads with a static graphic design to direct to your desired destination
Interactive Ads - Following ads formats are supported now for more interactive scenarios
power up - For example, give users more powers to cool down the skills or reduce downtime.
You will need to connect your wallet to top up your balance.
OpenAD provides a self-service backend, allowing advertisers to manage campaigns independently, track performance, and analyze key metrics in real time. From ad setup to optimization, our platform ensures transparency and control, enabling precise targeting and data-driven decision-making. With built-in analytics, advertisers can verify data accuracy, monitor results, and continuously refine their strategies for optimal performance.
After the campaign was approved, report details can be found in the campaign reports.
Available parameters include:
Ad Project - the name of your project
Page Views - The total number of times your ads are displayed.
second chance - Players have the choice to unlock an ability that allows them to keep playing.
The next page will guide you on how to integrate OpenAD to create banner ads and interacitve ads.
Click - the total number of clicks on your ads
CTR (Click-Through Rate) - The ratio of clicks to impressions, showing how often people click on your ad.
CPM Price - Cost per 1,000 ad impressions.
Budget - your budget set for this campaign
Consume - The total amount spent on your ad campaign
Create Time - the time when the ad campaign is created
Status - the current situation of your ad campaign

Please refer to the next page for code integration if you own an independent APP.
Generate Your Ad Code – Obtain the integration code.
Integrate OpenAD – Implement Banner Ads (Create Banner Ads)/or Interactive Ads(Create Interactive Ads)based on your preference.
And, that's it! You're ready to enjoy the monetization journey with us! The following pages provide instructions for volume owners seeking traffic monetization.
Visit here to create your profile.
Create an account using your email address or log in to access the dashboard.
Navigate to the "For Advertiser" section in the left menu.
Click "Create Campaign" to start a new campaign.
The campaign will not start when the wallet balance is not sufficient. How do I ?
Ensure your wallet has enough funds to cover ad spending and start the campaign.
Top up your balance from the Payment section in your dashboard.
Fill in the ad title and description for better indexing. Then follow the instructions to fill in the following information.
Ad Types - choose Image Ad.
Target Settings: Select audience country, language, and campaign date range.
Initial Status - choose "Active Now" to start the campaign immediately or "On Hold" to set a future date.
Price Settings: Set the CPM (Cost Per Mille) bid. If left blank, the system defaults to 0.5 CPM.
Support: If unsure, contact our team via Telegram.
A campaign requires at least one graphic design banner that will be shown to users.
When you fill in all the necessary fields, a preview of your banner will appear on the right.
Before submitting, review all details:
Double-check your campaign settings and uploaded files.
Click "Save Draft" to save your progress or "Submit for Review".
However, if your wallet balance is insufficient, you won’t be able to submit it for approval. The button on the right will be greyed out, and a reminder will prompt you to recharge your account. If your balance is sufficient, you can choose to click "Save Draft" or submit for approval.
In the Ad Campaign Management page, you can:
Edit campaign details.
Review and confirm all settings.
Delete the campaign if necessary.
Click "Submit for Review" once everything is ready.
After starting, you will soon see the .
OpenAD will notify advertisers for live ad publishing, and upgrade user tags based on callback from advertiser application calls.
This will be used to enhance the governance consensus within OpenAD Network.
This document describes how advertisers use the callback API to notify and return data to OpenAD Protocol.
https://6bf9546ea5.api.openad.network/v3/api/callback
GET
If your promotion link is like https://host/pathname?PromotionChannel=OpenAD_Protocol, the callback parameters will be spliced after your promotion link.
If your promotion link is like https://host/pathname, then your promotion link will be spliced with ?PromotionChannel=OpenAD_Protocol and callback parameters.
After the campaign was approved, report details can be found in the campaign reports.
Available parameters include:
Ad Project: The name of your ad placement project.
Ad Slot: The specific placement on your platform where ads are displayed.
Ad Type: The format of the ad displayed, such as banner ads, interactive ads, etc.
View: The number of times ads are displayed on your ad slot.
Click: The total number of clicks on ads shown in your placement.
CTR (Click-Through Rate): The ratio of clicks to impressions, showing how often your ad is clicked.
Expected Earnings: The projected revenue from the ads placed in your ad slot.
Create Time: The time when your ad placement was created.
Status: The current status of your ad placement (active, paused, etc.).
Earnings Not Withdrawn Cycle: The cycle of earnings that have not been withdrawn.
Estimated Earnings Not Withdrawn: The expected earnings generated within an unsettled cycle.
Welcome to the ultimate Troubleshooting Guide for OpenAD Protocol—your go-to resource for quick solutions and seamless ad operations.
Our team has over 10 years of experience in advertising, product design, and blockchain development, with a global background and leadership positions at several world's top companies.
We are true pratictioners with extensive experience in advertising and traffic.
YOUR SUCCESS IS OUR TOP PRIORITY!
At OpenAD, we provide top-tier advertising solutions within the LINE NEXT ecosystem. We view advertising as an ongoing process of optimization and innovation, not just a one-time transaction. We collaborate with you to explore strategies and creative combinations that maximize impact and efficiency.
Through ongoing strategy refinement, creative optimization, and data analysis, we identify the most effective ways to boost user engagement and conversions for Farmfrens, ensuring sustainable growth. At OpenAD, our expert team continuously guides to help clients achieve optimal advertising results.
System Launch Time: Confirm the ad system launch time to ensure each campaign goes live as scheduled.
Landing Page Content Review: Conduct a thorough review of the landing page, providing content and design recommendations to ensure accuracy and user engagement.
Performance Evaluation & Optimization: Based on the review findings, offer optimization suggestions for the landing page and conversion process to enhance post-click engagement and effectiveness.
Banner Ads Optimization
Ad Testing and Refresh Strategies
Element Testing: Go beyond A/B testing—optimize button placement, text, and size. Content Refresh: Update banners regularly to maintain engagement and appeal.
Bold Visual Appeal
Color Contrast: Use bright, contrasting colors to grab attention. High-Quality Visuals: Clear, attractive images enhance user interest.
Strong Call-to-Action (CTA)
Strong Copy: Use action-driven verbs like "Win" or "Join Now" to boost clicks. Impactful Numbers: Highlight figures like "$68,000 Prize Pool" to drive engagement. CTA Optimization: Make buttons bigger and brighter for better visibility.
Interactive Ads Optimization
When designing interactive ads, the key to success lies in the elements that drive user engagement. First, ensure that your ad creatives are visually compelling—high-quality images and engaging design elements should immediately capture users’ attention. A strong headline is equally important; it should be clear, concise, and spark curiosity. For ad copy, focus on persuasive yet concise messaging that highlights the core value proposition. Additionally, continuously experiment with A/B testing to refine different ad elements, including images, headlines, and descriptions, ensuring maximum engagement. Lastly, a well-optimized landing page is crucial—ensure it aligns with the ad’s message, loads quickly, and provides a seamless user experience. By perfecting these elements, advertisers can significantly improve ad performance and conversion rates.





Discussion
Web browsers traditionally loaded HTML content synchronously. This process involves:
Loading the entire HTML page first, allows the browser to display all content.
After that, other elements like images are loaded.
However, when external sources (like OpenAD Protocol tags) are added to a page:
The browser must fetch the HTML from external sources before loading the page.
If the external source takes time or there are multiple sources, it can delay the page load.
This causes external content to "block" the loading of the main page content.
To avoid this issue, OpenAD Protocol provides methods to prevent banners from blocking the main site content.
How-To
The easiest way to prevent OpenAD banners from delaying website content is to:
Use Asynchronous JS Tags or iFrame Tags.
These tags load banners separately from the main content.
Simply generate the tag for the zone you want to display banners, place it in your HTML, and the banners will load asynchronously.
If you prefer not to use asynchronous tags:
Place the banner tag at the bottom of the HTML page.
Use CSS to position the banner where you want it on the page.
While the browser will still show it's loading until banners appear, the main website content will load first.
This method mimics asynchronous loading, ensuring the main content appears before banners.
A person or company who wants to display on-line advertising - generally, at a cost.
A person or company who has ("publishes") a website (or some other form of on-line property) on which they wish to display on-line advertising (generally, from advertisers, and for a fee; but publishers do also display ads for free, either from advertisers, or to promote their own services when there are no paid ads to display).
Banner — an ad creative.
Campaign — an advertising campaign with a selected ad type.
Country — the country of the user from which the ad request was made.
Budget — spending limit in USD₮ for the campaign.
Language — the language of the Telegram user's interface.
URL — the web address of the advertised resource.
USDâ‚® - Tether (USDâ‚®) is a stablecoin pegged to the US dollar exchange rate in a 1:1 ratio, used to simplify cryptocurrency trading and minimize volatility.
Click — A click is whenever someone clicks on an ad. Click counts are sometimes filtered to prevent repeat clicks or other forms of fraud by publishers trying to raise revenues by repeatedly clicking on ads.
CPM (Cost per mile) — is the cost per 1,000 impressions (for the advertiser). For the publisher, this can also be thought of as the revenue per 1,000 impressions.
CPC (Cost per click) — is the cost per click (for the advertiser). For the publisher, this can also be thought of as the revenue per click.
CPA (Cost per acquisition) — is the cost per acquisition or action (for the advertiser) - that is, where the advertiser pays based the required action being performed after either clicking on an ad, or less commonly, after having seen an ad impression. For the publisher, this can also be thought of as the revenue per acquisition or action.
CTR (Click-Through Rate) — is the percentage of users who clicked on the ad relative to the total number of users who saw the ad.
Impressions — In on-line advertising, and impression is a view, or an "opportunity to see" an ad. Every time an ad is displayed (rendered) on a website site or device, this is an "opportunity to see" the ad, and counts as an impression.
Spent — the amount you spent.
https://host/pathname
?PromotionChannel=OpenAD_Protocol
&zoneId=159
&publisherId=49
&eventId=158
&traceId=10511960c290a145c3fb555c8dddcbf48f96cc
&cb=1b2a1fced9f036b8881a0ffda17920d2
&hash=29ebc1be403b57aba2d2689410e15b01
&signature=b2c2525ef5f8c71378af2fd587b3cdd0
&userId=6087580917
https://6bf9546ea5.api.openad.network/v3/api/callback
?zoneId=159
&publisherId=49
&eventId=158
&traceId=10511960c290a145c3fb555c8dddcbf48f96cc
&cb=1b2a1fced9f036b8881a0ffda17920d2
&hash=29ebc1be403b57aba2d2689410e15b01
&signature=b2c2525ef5f8c71378af2fd587b3cdd0
&userId=6087580917
Navigate to the "For Advertisers" section in the left menu.
Click "Create Campaign" to start a new campaign.
Ensure your wallet has sufficient funds to cover ad spending and start the campaign.
Top up your balance from the Payment section in your dashboard.
Once funded, return to the campaign page and click "Submit for Review" to complete the setup.
Fill in the ad title and description for better indexing. Then follow the instructions to fill in the following information.
Ad Types - choose Interactive Ads.
Target Settings: Select audience country, language, and campaign date range.
Initial Status - choose Active Now to start the campaign immediately or On Hold to set a future date.
Price Settings: Set the CPM (Cost Per Mille) bid. If left blank, the system defaults to 2U CPM.
Support: If unsure, contact our team via Telegram.
Upload your ad assets (images or GIFs) while ensuring they meet platform specifications:
Supported Formats: Image (JPEG, PNG) or GIF.
Correct Dimensions: Using the recommended dimensions ensures proper ad display.
If the dimensions are correct, a preview will appear on the right side of the screen.
A campaign requires at least one graphic design image or a GIF animation that will be shown to users.
Complete all required fields for the Interactive Ad. A preview of your banner will be displayed on the right.
Before submitting, review all details:
Double-check your campaign settings and uploaded files.
Click "Save Draft" to save your progress or "Submit for Review".
However, if your wallet balance is insufficient, you won’t be able to submit it for approval. The button on the right will be greyed out, and a reminder will prompt you to recharge your account. If your balance is sufficient, you can choose to click "Save Draft" or submit for approval.
Confirm all the campaign details you just put in before clicking 'Submit'.
In the Ad Campaign Management page, you can:
Edit campaign details.
Review and confirm all settings.
Delete the campaign if necessary.
Click "Submit for Review" once everything is ready.
After starting, you will soon see the campaign reports.
Instructions on how to integrate your codes into OpenAD Protocol for native JS APP.
This document provides instructions on how to access the SDK in native HTML (Games, etc.).
We recommend to add your application version number or release timestamp after JS to obtain the latest JS SDK for your application. E.g.,
https://protocol.openad.network/sdkloader.js?t=your-app-release-timestamp
https://protocol.openad.network/sdkloader.js?v=your-app-version
The script will pick OpenAD node for your end users, and load proper version of OpenAD SDK for you.
zoneld="158", 158 is a demo zoneld, please use your own "zoneId". publisherld="49", 49 is a demo publisherld, please use your own "publisherld" feel free to define your own banner style
OpenAD SDK will get ad banner for your end users and has it rendered in the DOM placeholder.
In traditional web applications, you can see OpenAD banner been rendered.
Please embed the following code into the body.
Event CallbackIf the user is already logged in,
Initialize user data (optional, not need to set in TMA)
window.openAdNative.initUserInfo(data);
Get Ad Info
window.openAdNative.getAD();
Close AD
window.openAdNative.destroy(window.openAdNative.adInfo);
SymptomsBanners deliver over HTTP, but will not deliver over SSL (HTTPS).
Troubleshooting ProcessEnsure that your HTML banners don’t include any content (like images or CSS files) served over HTTP. OpenAD Protocol excludes any banners with HTTP content when delivering over HTTPS to avoid warnings from browsers about mixed content.
Update your HTML banners to use HTTPS for all included content, ensuring seamless delivery on HTTPS-enabled pages.
When using the "Asynchronous JS Tag" for delivery, check if the issue is related to enforcing SSL on an HTTP page. The Asynchronous JS Tag automatically uses the same protocol (HTTP or HTTPS) as the page where it’s embedded:
If placed on an HTTP page, the tag will connect to your OpenAD Protocol instance using HTTP.
If your OpenAD Protocol returns an HTTP 3xx response code, indicating a redirect to HTTPS, this will not work.
The Asynchronous JS Tag first calls OpenAD Protocol to retrieve data which is required to update the tag placeholder, so that the relevant banner can be loaded. For this to work, OpenAD Protocol returns some headers.
However, most browsers will perform the request to the Asynchronous JS Tag as a CORS preflight request. . This means that an Asynchronous JS Tag embedded on an HTTP page must be able to access OpenAD Protocol's sdkloader.js script over HTTP.
If you have configured your webserver to enforce the use of SSL by redirecting requests over HTTP to HTTPS, then your options are:
Ensure that your Asynchronous JS Tag is only ever embedded on sites delivered using SSL;
Disable the redirection to SSL for the sdkloader.js script, so that this can be accessed via both HTTP and HTTPS; or
Use a different tag type.
This document describes how volume owner use the callback API to notify and return data to OpenAD Protocol.
https://6bf9546ea5.srv.openad.network/v1/getInfo/lineId
POST Content-Type: application/json
Prevent malicious and frequent interface calls by limiting each API key to a maximum of 100 interface calls per 30 seconds.
Are you a traffic volume owner looking for a simple and efficient way to monetize your platform? OpenAD provides a streamlined solution to help you start earning in just a few steps.
This guide will walk you through setting up ad slots, integrating ad codes, and managing your campaigns to maximize revenue.
1.1 Access the platform – Log in to your OpenAD account. If you don’t have an account, sign up to get started.
1.2 Navigate to Volume Owner Settings – In the dashboard, locate the "For Volume Owner" section in the left-hand menu.
1.3 Create an Ad Slot


{
"zone_id"=159, //This is an example zone_id, please get your own code parameters
"event_id"=158, //This is an example event_id, please get your own code parameters
"access_key": "your_access_key", //When you need to access this API, please ask us for the ak.
"sign": "request_signature", //zone_id-event_id-access_key-once-secret,sha256 HMAC signing with these 5 parameters
"once": "unique_request_id", //random string
// hash,signature,cb pass at least one.
"hash": "", // hash from the getAd interface,whether the user clicks
"signature":"", // signature from the getAd interface,whether the user view
"cb":"", // cb from the getAd interface,whether the click jumps to the corresponding advertisement app or not
}<body>
<!--Your codes above-->
<script
name="openADJsSDK"
version="3.0"
type="text/javascript"
src="https://protocol.openad.network/sdkloader.js">
</script>
</body><body>
<!-- code before banner -->
<div class="openADJsSDKBanner #your_style_class"
publisherld="49"
zoneld="158">
</div>
<!-- code after banner -->
</body><script type="text/javascript">
window.addEventListener('DOMContentLoaded', function() {
window.openAdNative = {
adInfo: {
zoneId: 158, // please check your parameter zoneId
publisherId: 49, // please check your parameter publisherId
eventId: 0, // Reserved Parameter
},
adParams: {
version: 'your-app-version', // optional
TG: true, // optional, should be set if the application is TMA
},
// userInfo object
// please add reasonable user IDs for your end users.
// otherwise, OpenAD statistics may be inaccurate,
// which may affect your incentives
userInfo: {
userId : '', // user ID , If there is no data, please leave it blank
firstName : '', // firstName or userId , If there is no data, please leave it blank
lastName : '', // lastName or userId , If there is no data, please leave it blank
username : '', // userName or userId , If there is no data, please leave it blank
},
// If the user is already logged in, initialize user data
initUserInfo: function(data){
this.userInfo.userId = data.userId;
this.userInfo.firstName = data.firstName;
this.userInfo.lastName = data.lastName;
this.userInfo.username = data.username;
},
// Call SDK method to get advertising data
getAD: function(){
window.openADJsSDK.bridge.init({ userInfo: this.userInfo, adParams: this.adParams, adInfo: this.adInfo });
},
// Close AD
destroy: function(adInfo){
document.querySelector(`.openADJsSDKBanner[zoneId="${adInfo.zoneId}"][publisherId="${adInfo.publisherId}"]`).innerHTML = '';
}
};
});
</script>{
"data":{
"hash_count":0, //zero means no click
"cb_count":0, //zero means no jump
"signature_count":1 //1 means view
}
}
Ad Placement Fully customizable placements, typically positioned in high-visibility areas within the mini-app.
Ad Logic
The system uses targeting parameters, user profiles, and interest-based data to display the most relevant ad to each user..
Required Ad Assets
Register for an account using our system.
Integrate our SDK to seamlessly embed ad placements into your desired scenes.
This format is simple and to the point!
An engaging ad format where users voluntarily interact to receive in-app rewards. Volume owners can set up custom ad entry points and define reward mechanisms to ensure smooth integration into their Mini-Dapp experience.
Ad Placement Volume owners can fully customize where the ad appears. Users must actively engage (click) to trigger the ad. The entry point can be placed anywhere in the Mini-Dapp.
User-Initiated Interaction: Ads integrate seamlessly into the Mini-Dapp, appearing as part of incentive-driven engagement.
Smooth Playback: GIF or static ads play automatically, ensuring an uninterrupted experience.
Reward Delivery: After completing the ad task, users return to the Mini-Dapp and receive rewards.
Register on our system to create an account.
Integrate our SDK to seamlessly embed ad placements into your desired scenes.
Ad Placement
The ad is displayed when users enter the mini-app. Users can skip the ad anytime or wait for an automatic 5-second countdown before it closes.
Ad Logic
The system intelligently matches the most relevant ad to users based on targeting parameters, browsing behavior, and user interests within the mini-app.
Stay tuned—Splash Ads and Display Ads are coming soon!

Login Here: OpenAD Dashboard
Customize your ad slot by filling in key details:
Slot Title - The name of an ad placement.
Description - A short explanation of the ad content.
Ad Type - Choose between Image Ads or Interactive Ads.
App Types – Select the relevant category for your app.
Pricing Settings – Choose between system smart matching or manual pricing to set your ad rates.
Telegram Account – Provide your Telegram ID details if applicable.
Remarks – Add any additional notes or comments for review.
Ensure all required fields are accurately completed before proceeding.
Once configured, generate your ad code to integrate it into your platform.
3.1 Code Details: Locate your Zone ID, Publisher ID, and technical instructions.
3.2 Document — If you want to view more code installation methods, just click and you will go to the below page.
3.3 Integration: Copy the provided code snippet and collaborate with your technical team to integrate the SDK.
3.4 Explore Performance Metrics – Use the Ad Slots Management (Ad Slots MGT) page to track ad views, clicks, and conversions.
For additional integration methods, refer to the technical documentation.
4.1 Place Ads – Embed ads into your mini-program, tailored to your preferred layout.
4.2 Submit Details – Return to the OpenAD dashboard and:
Provide your app or website link
Specify ad locations
Upload screenshots showing the ad placements
5.1 Submit for Approval – Finalize your setup and submit your ad slots for review.
5.2 Monitor & Optimize – Use the dashboard to:
Manage, edit, and track ad slots.
Track real-time performance metrics to optimize engagement and earnings
View the demo to see practical applications and setup processes in action.
Once your ad slots are set up, your ads go live and start generating revenue. OpenAD supports various platforms beyond Telegram, including apps and websites. Join us to maximize your earnings.
Updated at: 05/2025





Instructions on how to create banner ads by integrating your codes into OpenAD Protocol.
PreparationsMake sure that you complete Create Your Ad Placement before you start the following steps.
Github Codes And Demohttps://github.com/openad-protocol/openad-line-ad-demo
Easy embeddingLoad the SDK in the body of html, the code is as follows:
We recommend to add your application version number or release timestamp after JS to get the latest JS SDK for your application. E.g.,
https://protocol.openad.network/line/sdk.loader.js?t=your-app-release-timestamp
https://protocol.openad.network/line/sdk.loader.js?v=your-app-version
The following global vairables will be loaded with 'https://protocol.openad.network/line/sdk.loader.js'.
openADSdkLoader.hostURL , node api url to serve end user. e.g., 'https://6bf9546ea5.api.openad.network'.
The script will pick OpenAD node for your end users, and load proper version of OpenAD SDK for you.
zoneld="158", 158 is a demo zoneld, please use your own "zoneId" parameter; publisherld="49", 49 is a demo publisherld, please use your own "publisherld" parameter; feel free to define your own banner style.
OpenAD SDK will get ad banner for your end users and has it rendered in the DOM placeholder.
In traditional web applications, you can see OpenAD banner been rendered.
!!! OpenAD only support ONE DOM placeholder in one web page.
In most SPA (single page application) web frameworks, DOM objects are rendered dynamically. Thus, the ad banner shall be init manually, the init js call will render ad banners to predefined DOM placeholder.
1.If your web application is a LMA(Line Mini App) or LWA(Line Web App),please use the following codes.
2. If your web application is a web3 app and has a wallet provider, please use the following codes.
When wallet pass into SDK, please initialize the user's wallet in advance to ensure that wallet.provider can get the user's wallet address;
When wallet.type = 'eth', you should use codes as below;
When wallet.type = 'kaia', you should use codes as below;
When wallet.type = 'ton', you should use codes as below;
3. If your web application is a web3 app and wallet was created by backend, please use the following codes.
4.If your web application is a web app, please use the following codes.
Explicit Call Functions.......
When the page loads the ad resources and users can see the ads, please execute the following SDK method.
When users click on the ad, please execute the following SDK method:
Instructions on how to create interactive ads by integrating your codes into OpenAD Protocol.
Ad rendering and user interaction will notify publishers and/or advertisers upon request. This feature is suitable for providing traditional gaming incentive scenarios to publisher TMAs, such as extra lives for ad viewing.
Interactive ads will be presented in full screen, ads will be displayed for a certain time, and the number of impressions is calculated by CPM.
OpenAD will notify publishers of ad display events,
onAdResourceLoad, indicates load ad resource from OpenAD platform, false will be returned if there is no resource to be loaded for the publisher slot/zone,
After launching a campaign, it must go through approval process.
Advertising content that requires special review under our internal policies and the laws of the countries where ads are displayed. We reserve the right to reject, block, or restrict any ad that conflicts with our standards, policies, or regional regulations.
Content that is graphic, shocking, or sexual in nature.
Content promoting hate, violence, or harassment.
Violations of third-party rights.
Deceptive, misleading, or predatory advertising practices.
Political ads or topics related to sensitive subjects, including religion.
Promotions of drugs, alcohol, or tobacco.
Misleading or harmful financial products or services.
Content related to weapons, firearms, explosives, or ammunition.
Software that promotes spam, malware, or hacking.
Products or services of questionable legality.
Uncertified medical services, medications, or supplements.
Advertising materials promoting other brands or companies.
Ads where the content does not match the promoted product.
Ads for websites, bots, or games that are non-functional at the time of review.
Services that artificially inflate views, ratings, or other metrics.
Ads that infringe on, defame, or negatively target individuals, brands, or companies.
onAdOpening, indicates the interactive ad is opening,onAdOpened, indicates the interactive ad is opened,
onAdTaskFinished, indicates the interactive ad task is finished, the task is defined by advertiser,
onAdClosing, indicates the interactive ad is closing,
onAdClosed, indicates the interactive ad is closed.
onAdClick, indicates clicked and jumps.
This document provides instructions on how to use OpenAD js SDK to create interactive ads on your web applications.
https://github.com/openad-protocol/openad-line-ad-demo
Load the SDK in the body of html, the code is as follows:
We recommend to add your application version number or release timestamp after JS to get the latest JS SDK for your application. E.g.,
https://protocol.openad.network/line/sdk.loader.js?t=your-app-release-timestamp
https://protocol.openad.network/line/sdk.loader.js?v=your-app-version
The following global vairables will be loaded with 'https://protocol.openad.network/line/sdk.loader.js'.
openADSdkLoader.hostURL , node api url to serve end user. e.g., 'https://6bf9546ea5.api.openad.network'.
The script will pick OpenAD node for your end users, and load proper version of OpenAD SDK for you.
The interactive ads shall be init manually.
Please follow the guideline to add the following js codes.
1.If your web application is a LMA(Line Mini App) or LWA(Line Web App),please use the following codes.
2. If your web application is a web3 app and has a wallet provider, please use the following codes.
When wallet pass into SDK, please initialize the user's wallet in advance to ensure that wallet.provider can get the user's wallet address;
When wallet.type = 'eth', you should use codes as below;
When wallet.type = 'kaia', you should use codes as below;
When wallet.type = 'ton', you should use codes as below;
3. If your web application is a web3 app and wallet was created by backend, please use the following codes.
4.If your web application is a web app, please use the following codes.
After executing the init method, determine whether to continue executing the getRender method based on the status of res.code!
Please pay attention to your page flow design, there may be res.code !== 0. In the case of res.code === 0, please execute the getRender method as soon as possible. The data is time-sensitive. After the timeout, the ad delivery will be invalid.
There are 7 callback methods for calling the getRender method, which can be called on demand!
The client must re-execute the init method every time to determine whether the AD can be loaded. Otherwise, the data statistics will only take effect once, and multiple repeated impressions cannot be counted!!!
<head>
<!--Your codes above-->
<script
name="OpenADLineJsSDK"
version="1.0"
type="text/javascript"
src="https://protocol.openad.network/line/sdk.loader.js">
</script>
</head><body>
<!-- code before banner -->
<div class="openADJsSDKBanner #your_style_class"
publisherld="49"
zoneld="158">
</div>
<!-- code after banner -->
</body>/* ... */
const LineAD = {
adInfo: {
zoneId: 427, // int, This is an example zoneId, please get your own code parameters
publisherId: 1, // int, This is an example publisherId, please get your own code parameters
},
adParams = {
line: {
type: 'LMA', // LMA, LWA
liffId: '2007174241-G112KL7Y', // when type = LMA / LWA, liffId is required
prototype: null, // when type = LMA / LWA, prototype is required. line.prototype must contain two methods: getProfile and openWindow, whether you are using liff SDK js or npm installation package;
},
wallet: { // If you have a web3 wallet components, Optional
type: 'eth', // eth: eth wallet, kaia: line wallet, ton: ton wallet;
provider:null, // here is a provider object after wallet initialization.
components: '', // web3 wallet components name
},
},
}
/* ... *//* ... */
const LineAD = {
adInfo: {
zoneId: 427, // int, This is an example zoneId, please get your own code parameters
publisherId: 1, // int, This is an example publisherId, please get your own code parameters
},
adParams = {
line: {
type:'WEB3',
},
wallet: { // line.type = 'WEB3', wallet is required
type: 'eth', // eth: eth wallet, kaia: line wallet, ton: ton wallet;
provider:null, // here is a provider object after wallet initialization.It can be used to retrieve the wallet address.
components: '', // web3 wallet components name
},
},
userInfo:{ // line.type = 'WEB3', userInfo is required
userId: 'vincent', // the id of the current user in your APP
displayName: 'vincent', // the firstName / lastName / username / userId of the current user in your APP,
}
}
/* ... *//* ... */
// if you are using reown
const Modal = createAppKit({
adapters: [ wagmiAdapter ],
networks: [ mainnet, arbitrum ],
defaultNetwork: mainnet,
projectId,
features: {
analytics: true, // Optional - defaults to your Cloud configuration
email: false,
socials: [ ],
emailShowWallets: false,
allWallets: 'SHOW',
},
});
wallet: {
type: 'eth',
provider: Modal,
components: '@reown',
},
/* ... *//* ... */
import DappPortalSDK from '@linenext/dapp-portal-sdk'
const sdk = await DappPortalSDK.init({ clientId: '<CLIENT_ID>' });
const provider = sdk.getWalletProvider();
wallet: {
type: 'kaia',
provider: provider,
components: 'dapp-portal-sdk'
}
/* ... *//* ... */
// if you are using useTonConnectUI
const { tonConnectUI } = useTonConnectUI();
const userFriendlyAddress = useTonAddress();
wallet: {
type: 'ton',
provider: {
...tonConnectUI.account,
userFriendlyAddress,
},
components: '@tonconnect/ui',
}
/* ... *//* ... */
const LineAD = {
adInfo: {
zoneId: 427, // int, This is an example zoneId, please get your own code parameters
publisherId: 1, // int, This is an example publisherId, please get your own code parameters
},
adParams = {
line: {
type:'WEB3',
},
wallet: { // line.type = 'WEB3', wallet is required
type: 'api', // type is required
method: 'GET', // GET / POST, method is required
chainType: 'eth', // eth, ton, kaia; chainType is required
api: 'https://host/...api' // here is the required API. We will call this API to get user's wallet.
},
},
userInfo:{// line.type = 'WEB3', userInfo is required
userId: 'vincent', // the id of the current user in your APP
displayName: 'vincent', // the firstName / lastName / username / userId of the current user in your APP,
}
}
for example, if method = 'GET', request url = 'https://host/...api?userId=xxx';
response = {
data: '', // data must be a valid string, or SDK will reject.
}
/* ... *//* ... */
const LineAD = {
adInfo: {
zoneId: 427, // int, This is an example zoneId, please get your own code parameters
publisherId: 1, // int, This is an example publisherId, please get your own code parameters
},
adParams = {
line: {
type:'WEB',
},
web: { // line.type = 'WEB', web is required
api: 'https://host/...api', // here is the required API. We will call this API to retrieve the token.
method: 'GET', // GET / POST, method is required
token: 'data', // response object key, how to get token value.
valid: 171, // token's length. either string or numeric type is acceptable.
},
},
userInfo:{// line.type = 'WEB3', userInfo is required
userId: 'vincent', // the id of the current user in your APP
displayName: 'vincent', // the firstName / lastName / username / userId of the current user in your APP,
}
}
for example, if method = 'GET', request url = 'https://host/...api?userId=xxx';
response = {
data: '', // data must be a valid string, or SDK will reject.
}
/* ... *//* ... */
...
window.OpenADLineJsSDK.banner.init({ ...LineAD });
...
/* ... *// Ad resource object structure, banner
// resource = {
// type : 'banner',
// resource_url : string, // resource url
// width : int, // resource width
// height : int, // resource height
// resource_id : int // resource ID
//};
// for detail, please view 'Step #3 Above'.
// Call SDK method to get advertising data
const res = await window.OpenADLineJsSDK.banner.get({ ...LineAD });
if ( res.code === 0 ) {
const resource = res.data;
// After getting the data, you can render it on the page
// you can add multiple ad banners
}else{
// We recommend not throwing an error
}const res = await window.OpenADLineJsSDK.banner.log(adInfo);
if ( res.code === 0 ) {
// Callback log info successful
}else{
// We recommend not throwing an error
}window.OpenADLineJsSDK.banner.click(adInfo);
SDK will open a new app by the above function;
No Callback, if you want to do sth, you should use yourself functions or methods;
<head>
<!--Your codes above-->
<script
name="OpenADLineJsSDK"
version="1.0"
type="text/javascript"
src="https://protocol.openad.network/line/sdk.loader.js">
</script>
</head>/* ... */
const LineAD = {
adInfo: {
zoneId: 428, // int, This is an example zoneId, please get your own code parameters
publisherId: 1, // int, This is an example publisherId, please get your own code parameters
},
adParams = {
line: {
type: 'LMA', // LMA, LWA
liffId: '2007174241-G112KL7Y', // when type = LMA / LWA, liffId is required
prototype: null, // when type = LMA / LWA, prototype is required. line.prototype must contain two methods: getProfile and openWindow, whether you are using liff SDK js or npm installation package;
},
wallet: { // If you have a web3 wallet components, Optional
type: 'eth', // eth: eth wallet, kaia: line wallet, ton: ton wallet;
provider:null, // here is a provider object after wallet initialization.
components: '', // web3 wallet components name
},
},
}
/* ... *//* ... */
const LineAD = {
adInfo: {
zoneId: 428, // int, This is an example zoneId, please get your own code parameters
publisherId: 1, // int, This is an example publisherId, please get your own code parameters
},
adParams = {
line: {
type:'WEB3',
},
wallet: { // line.type = 'WEB3', wallet is required
type: 'eth', // eth: eth wallet, kaia: line wallet, ton: ton wallet;
provider:null, // here is a provider object after wallet initialization.It can be used to retrieve the wallet address.
components: '', // web3 wallet components name
},
},
userInfo:{ // line.type = 'WEB3', userInfo is required
userId: 'vincent', // the id of the current user in your APP
displayName: 'vincent', // the firstName / lastName / username / userId of the current user in your APP,
}
}
/* ... *//* ... */
// if you are using reown
const Modal = createAppKit({
adapters: [ wagmiAdapter ],
networks: [ mainnet, arbitrum ],
defaultNetwork: mainnet,
projectId,
features: {
analytics: true, // Optional - defaults to your Cloud configuration
email: false,
socials: [ ],
emailShowWallets: false,
allWallets: 'SHOW',
},
});
wallet: {
type: 'eth',
provider: Modal,
components: '@reown',
},
/* ... *//* ... */
import DappPortalSDK from '@linenext/dapp-portal-sdk'
const sdk = await DappPortalSDK.init({ clientId: '<CLIENT_ID>' });
const provider = sdk.getWalletProvider();
wallet: {
type: 'kaia',
provider: provider,
components: 'dapp-portal-sdk'
}
/* ... *//* ... */
// if you are using useTonConnectUI
const { tonConnectUI } = useTonConnectUI();
const userFriendlyAddress = useTonAddress();
wallet: {
type: 'ton',
provider: {
...tonConnectUI.account,
userFriendlyAddress,
},
components: '@tonconnect/ui',
}
/* ... *//* ... */
const LineAD = {
adInfo: {
zoneId: 428, // int, This is an example zoneId, please get your own code parameters
publisherId: 1, // int, This is an example publisherId, please get your own code parameters
},
adParams = {
line: {
type:'WEB3',
},
wallet: { // line.type = 'WEB3', wallet is required
type: 'api', // type is required
method: 'GET', // GET / POST, method is required
chainType: 'eth', // eth, ton, kaia; chainType is required
api: 'https://host/...api' // here is the required API. We will call this API to get user's wallet.
},
},
userInfo:{// line.type = 'WEB3', userInfo is required
userId: 'vincent', // the id of the current user in your APP
displayName: 'vincent', // the firstName / lastName / username / userId of the current user in your APP,
}
}
for example, if method = 'GET', request url = 'https://host/...api?userId=xxx';
response = {
data: '', // data must be a valid string, or SDK will reject.
}
/* ... *//* ... */
const LineAD = {
adInfo: {
zoneId: 428, // int, This is an example zoneId, please get your own code parameters
publisherId: 1, // int, This is an example publisherId, please get your own code parameters
},
adParams = {
line: {
type:'WEB',
},
web: { // line.type = 'WEB', web is required
api: 'https://host/...api', // here is the required API. We will call this API to retrieve the token.
method: 'GET', // GET / POST, method is required
token: 'data', // response object key, how to get token value.
valid: 171, // token's length. either string or numeric type is acceptable.
},
},
userInfo:{// line.type = 'WEB3', userInfo is required
userId: 'vincent', // the id of the current user in your APP
displayName: 'vincent', // the firstName / lastName / username / userId of the current user in your APP,
}
}
for example, if method = 'GET', request url = 'https://host/...api?userId=xxx';
response = {
data: '', // data must be a valid string, or SDK will reject.
}
/* ... *//* ... */
...
window.OpenADLineJsSDK.interactive.init({ ...LineAD }).then(res => {
if(res.code === 0){
// you can callback 'getRender' function, user can load an interactive ad;
}else{
// you can't callback 'getRender' function, user can't load an interactive ad;
}
});
...
/* ... *//* ... */
// view AD steps is [1,2,3,5,6,7], click AD steps is [1,2,3,6,7,5,4]
const callbackFunc = {
// Indicates load ad resource from OpenAD platform, false will be returned if there is no resource to be loaded for the publisher slot/zone
onAdResourceLoad: (e) => {
// 'step1', e = true / false
},
// Indicates the interactive ad is opening
onAdOpening: (e) => {
// 'step2', e = true / false
},
// Indicates the interactive ad is opened,
onAdOpened: (e) => {
// 'step3', e = true / false
},
// indicates the interactive ad task is finished, the task is defined by publisher
onAdTaskFinished: (e) => {
// 'step5', e = true / false
},
// Indicates the interactive ad is closing
onAdClosing: (e) => {
// 'step6',e = true / false
},
// Indicates the interactive ad is closed
onAdClosed: (e) => {
// 'step7', e = view / click / close
// close: user manually closed ads. client side can not get any rewards.
if(e === 'close'){
// do sth ...
}
// view: viewed Ad completed, not clicked, not manually closed ads; client side needs to get rewards level 1.
if(e === 'view'){
// do sth ...
}
// click: clicked Ad completed, include viewed Ad, not manually closed ads; client side needs to get rewards level 2.
// If your app is 'WEB3' or 'WEB', can add codes below; 'LMA' or 'LWA' can not write codes here.
if(e === 'click'){
// do sth ...
}
},
// Indicates clicked and jumps
onAdClick: (e) => {
// 'step4', e = true / false
},
};
/* ... *//* ... */
// If your app is 'WEB3' or 'WEB', use codes below:
window.OpenADLineJsSDK.interactive.getRender({ adInfo, cb: callbackFunc });
// If your app is 'LMA' or 'LWA', use codes below:
const clickReward = async () => {
// maybe this is a ajax, maybe a ws, or somthing. async mode.
let res = await getRewardsLevel2Method;
console.log('clickReward', res);
}
window.OpenADLineJsSDK.interactive.getRender({ adInfo, cb: callbackFunc, clickReward });
/* ... */