Only this pageAll pages
Powered by GitBook
1 of 83

Product Docs

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...

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...

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...

Dashboard Setup

Product Docs

Account

Placements

Callbacks Settings

1. Offerwall Callbacks

πŸ’‘Callbacks & Testing

2. Rewarded Video Callbacks

πŸ’‘Callbacks & Testing

Securing Callbacks

1. Offerwall Securing Callbacks

πŸ’‘Callbacks & Testing

2. Rewarded Video Securing Callbacks

πŸ’‘Callbacks & Testing

AdSlots

Offerwall

Web Integrations

SDK Integrations (deprecated)

SDK Integrations (v2)

SDK Wrappers (v2)

API Integrations

Surveywall

Web Integrations

Here are the articles in this section:

Web Surveywall

SDK Integrations (v2)

SDK Wrappers (v2)

API Integrations

Web integrations

In-app integrations

AdServer

Android SDK (coming soon)

Coming soon

Rewarded Video

Failed Redirects

FAQ

Testing

iOS SDK (coming soon)

Coming soon

Callbacks & Testing

Callbacks

Callback Verification

Go-live checklist

Reporting APIs

Creating an Account

In this page you can find step-by-step instructions on how to get started

To create an account click the following link:

Once you have clicked the link shown above, click on "Create Account".

Select: Publisher (Monetize your apps) from the drop-down menu.

First, you have to chose if you are business or Person, and then fill in the rest of the information. Enter company and/or your name, last name, address, country and email.

Personal Information

This page shows you how to fill out or update your personal / company information

To access your Publisher account click on the following link:

On the left-hand side of the screen:

  • Click on "Account Settings"

  • Click on "Personal/Company Information"

Creating Sub-Accounts

Learn how to creat Sub-Accounts to grant access to your dashboard for your colleagues

To access your Publisher account click on the following link:

On the left-hand side of the screen:

  • Click on "Sub-Accounts"

  • Click on "Create Sub-Account" on the top right

What is a Placement?

A Placement is meant to represent your app or website. It indicates the platform that your owned & operated asset is build for and running on.

A Placement can be one of the following:

  • Android App

  • iOS App

What is an AdSlot?

An AdSlot is a combination of type of ad, integration and placement of the ad on your website or within your app.

There is a number of AdSlot Types that you can choose from, dependent on if you added an Android App, an iOS App or a Website. AdSlot Types include:

  • Offerwall

  • Rewarded Video

IP Whitelist

If you want to restrict postbacks to our callback server IPs, please whitelist the following IPs and check back regularly for possible changes:

Last IP List Update: 2025-01-30

Logos and Creatives

Currency management

Allows publishers to update Currency Conversion Rate, for a specific adslot.

With the Currency Conversion Rate publishers can adjust the exchange rate used to calculate payouts to users. You can define the amount of virtual currency paid out to users for each USD you earn.

All transactions on the ayeT-Studios are handled and operated in USD.

Go into "Edit AdSlot" and edit Currency Conversion Rate ($1 = X virtual currency). Dont forget to hit save.

Advertiser Reporting API

Our Advertiser Reporting API allows advertisers to retrieve detailed statistics on their pending, active and historic campaigns including impressions, clicks and conversions.

Retrieves all statistics for the account for the given date range and filtered for an optional identifier. The returned data includes the number of currently running and active (pending, running, review) campaigns as well as impressions, clicks and transaction statistics for the specified date range. If identifier is set, only campaigns matching "identifier" are inspected.

Follow the link to learn more about utilizing the Advertiser Reporting API.

Publisher Reporting API

Our Publisher Reporting API allows publishers with and without adserver functionality to retrieve detailed statistics on their placement & adslot performance.

Retrieves all statistics for the account for the given date range and filtered by optional parameters. The returned data includes the impressions, clicks, conversions, revenue etc. statistics for the specified date range for each day grouped by country. If optional parameters (placements, adslots, etc.) are set, only metrics matching those parameters will be returned.

Follow the link to learn more about utilizing the Publisher Reporting API.

Offerwall API vs Static API

The Offerwall API provides a solution for publishers who want to include an offerwall in their application/website but have control over the presentation of the offers. All offers matching the parameters provided will be returned and can be displayed to the user. The Offerwall API supports both server and client-side calls, which distinguishes it from the deprecated Live API.

The Static API is recommended only for special integrations, because not all campaigns are available without more sophisticated device match. If integrated, it should be called each 15-30 minutes to make sure our campaigns are still available, did not run into daily caps or changed targeting / bid. The "Static API key" for requests is adslot specific and available in the adslot details once approved by your account manager.

Declined Placements

We decline placements for several reasons. Some of the reasons are listed below:

  • You didn't set up the placement correctly

  • Your app / website failed to reach our quality criteria

Offerwall API

Static API

Introduction

Updating the Currency Conversion Rate

Offerwall API

  • Static API

  • Web Surveywall

  • The beauty of AdSlots are that you can add n+1 AdSlots to for each of your Placements.

    That way you can for example have two offerwalls within your Android App. Each Offerwall can then carry its own virtual currency and its own design.

    You can also create more complex setups to run 10 or more offerwalls within your app, while aggregating data.

    The same is true for Rewarded Video setups. You can for example add one Website and five AdSlots to have users unlock boosters for AdSlot 1, decrease waiting time for AdSlot 2 and get bonus coins for AdSlot 3.

    Read more about how to create a Placement:

    Once you have created your first Placement and AdSlot, you can easily add additional AdSlots to your placement.

    You can add 1+n AdSlots for each Placement you created, giving you the room to slice and dice setups within your App or on your Website.

    The AdSlot ID is relevant for most of the integrations on the ayeT-Studios platform.

    Before creating an AdSlot, you have to create a Placement for your App or Website first.

    Creating a Placement
    51.79.101.241
    158.69.185.134
    158.69.185.154  
    35.165.166.40
    35.166.159.131
    52.40.3.140
    You have to read through and agree to the
    or
    and

    1.Access the Dashboard

    2.Create Account

    3.Publisher Account

    4. Fill in the Information

    You can edit / change this information.

    5. Sign up

    Advertiser Terms
    Publisher Terms
    Privacy Policy

    First, you have to chose if you are business or Person, and then fill in the rest of the information. Enter company and/or your name, last name, address, country and email.

    Once you are done filling out all of the provided fields, click on "Update Personal/Additional Information"

    You can change and update your personal information.

    1. Log into your account

    2. Account Settings

    3.Fill out / update all of the fields

    4. Update

    Add the email address of your colleague

  • Add First & Last Name of your colleague

  • Click "Create"

    • Your colleague will receive an email from ayeT-Studios with instructions to reset their password

    • After completing the process, they will be able to log into their account

    1. Log into your account

    2. Navigate to Sub-Acocunts

    3. Fill in the Information

    4. Tell your colleague to finish the setup

    Website

  • Network / API

  • For example, you create a separate Placement for your Android App and a separate Placement for your IOS app.

    While creating a Placement, you also set up the AdSlot, which you select based on the type of integration or ad format you want to use.

    Follow the link below to read about AdSlots.

    React Native Example

    If you created an app via React Native and you compile your production version for both Android and IOS, you would ideally set up the following placement on ayeT-Studios:

    • Android App

    Once you create a Placement, you cannot change the platform type

    What is an AdSlot?
    We reached out to you with additional questions, but you didn't get back to us
  • You set up an API / Network placement for which only selected publishers are eligible

  • You couldn't find a reason for which we might have declined your placement?

    No problem, getting declined isn't the end of the world. We are happy to discuss why we declined your placement in detail. Hopefully, there is a chance to work out a solution together.

    In order to find out more, please reach out via email at:

    1) Offerwall - GameTastic

    2) Surveywall - PollTastic

    3) Rewarded Video - TubeTastic

    4) ayeT-Studios Logo

    Technical Documentation: Advertiser Reporting API

    Technical Documentation: Publisher Reporting API

    Attention: Requests to the reporting module are limited to 20 calls per hour.

    Creating a Placement

    In this section, you can find step-by-step guidance on how to set up placement and get started.

    1. Log in to the dashboard

    2. Placements / Apps

    On the left-hand side of the screen click on "Placements / Apps"

    3. + Add application / Placement

    In the upper-right corner of the screen - click on "+ Add Application / Placement"

    4. Select the Placement type

    In this step you select the type of platform you want to integrate.

    Once you have created a Placement - you cannot change the placement type

    5. Fill in the information

    For example: Creating a new Android App placement

    6. Select your preferred Adslot

    Adslot is the HTML markup that defines where an ad appears. You chose adslot type based on the integration (for example Rewarded Video). (The adslot ID is relevant in integration).

    • The name of your currency;

    • Adjust the conversion rate;

    • Currency decimal places.

    Once you are done filling out the information - click on "Create Placement"

    Currency Settings

    For Offerwall

    1. Log into the dashboard

    2. Chose the Placement

    In the central part of the screen, all of your Placements will be shown - Locate the Placement which you want to customize

    3. Edit Adslot

    4. Currency Setup

    In the pop-up window click on "Overview".

    In this section you can adjust:

    • The name of your currency(s);

    • Adjust the conversion rate;

    • Chose a minimum Offer Payout

    In the central part of the screen, all of your Placements will be shown - Locate the Placement which you want to customize

    Once you have located the Placement you want to customize - click on "Edit Adslot" - on the Rewarder Video Adslot of the Placement.

    In this section you can adjust:

    • Rewarded Video Caps (per user / device);

    • Video Volume;

    • The name of your currency(s);

    Offerwall API

    The Offerwall API provides a solution for publishers who want to include an Offerwall in their application/website but have control over the presentation of the offers.

    Eligible Placement & AdSlot Combinations

    The table below shows all Placement & AdSlot Type combinations that allow you to utilize the Offerwall API integration.

    Placement Type
    AdSlot Type
    Eligible Integration Type

    Android App

    Before you start with the integration, make sure you:

    You will find more details here:

    For API Calls, all offers matching the parameters provided will be returned and can be displayed to the user.

    The Offerwall API supports both server and client-side calls.

    Follow the link below to get to the detailed technical documentation.

    Learn about:

    • Setting up callbacks

    • IP Whitelists

    • Securing callbacks using HMAC Security Hash

    Click on the link below:

    Surveywall Checklist

    This checklist is supposed to help you to take care of all important and relevant settings before going live with your Surveywall.

    Please go through the list to see if you can check each box. If you can check each box, you are most likely good to go live.

    Most Important

    Offerwall Checklist

    This checklist is supposed to help you to take care of all important and relevant settings before going live with your Offerwall.

    Please go through the list to see if you can check each box. If you can check each box, you are most likely good to go live.

    Most Important

    Get Offerwall User ID

    1. Access the Offerwall

    Ask the user to go to the Offerwall using the appropriate device.

    2. Go to Offerwall Menu

    Ask the user to click on the Offerwall menu - on the top left corner of the Offerwall.

    3. Click on "Reward Status"

    4. User ID

    ​On the header of the Offerwall you have the Unique User ID (the number highlighted in orange).

    Rewarded Video Checklist

    This checklist is supposed to help you to take care of all important and relevant settings before going live with your rewarded video placement.

    Please go through the list to see if you can check each box. If you can check each box, you are most likely good to go live.

    Most Important

    Get ads.txt

    An ads.txt (Authorized Digital Sellers) file is essential for ensuring transparency in digital advertising

    Hosted on a publisher's server, it lists authorized sellers of ad inventory, preventing fraud by verifying legitimate transactions. This file safeguards both publishers and advertisers, instilling confidence in the ad buying process and maintaining the integrity of the advertising ecosystem.

    This is a step by step documentation on how you can get and automatically keep your ads.txt lines updated with ayeT-Studios' platform.

    In the top right corner of the screen click on β€œPlacements/Apps”

    Locate your rewarded video placement, and click on edit (right-hand side of the screen)

    In the pop-up window, click on β€œads.txt”

    Failed Redirect Destination

    Control the user flow when a redirect is failing.

    During a redirect through tracking links, a few things can happen such as:

    • low user quality

    • proxy or VPN use

    • wrong GEO targeting

    Blacklisting Offers

    This section explains how to remove offers that you do not wish to show to your players. You can exclude individual offers for a specific placement. You can exclude an offer for all of your placements

    Click on 'Offers'

    In this section you can get an overview of all active and past campaigns.

    Look for the campaign name in the column "Campaign Name" and in the corresponding row click on the button "Blacklist" (far to the right)

    A pop-up window will appear

    Creating a Currency Sale

    A virtual currency sale is a limited-time event aimed at boosting performance for publishers and advertisers alike. During the event, the digital currency exchange rates for rewards are increased with a multiplier between 1.3x and 2x in order to create a stronger incentive for users to use the Offerwall. aye-T Studios regularly organizes currency sales with partnering publishers during holiday periods like Easter or Christmas for example.

    In the top left corner of the screen under "Overview" - click on "Currency Sale"

    On the right-hand side of the screen - click on "Currency Sale"

    Callback Tester

    With the Callback Tester you can verify that you receive back all relevant information you need in order to pay your users and if the added macros are populated correctly.

    The Callback Tester was built to help you to verify that you:

    1. added all the macros to your Callback URL that you need to receive back

    2. that those macros are populated by ayeT-Studios' servers as expected

    You can check all availabe macros that can be added to your callback URL here:

    Sandbox Identifier

    Sandbox Identifiers can be used to test the user and callback flow from initial entering the offerwall until successfully processing a callback.

    A Sandbox Identifier is basically an external identifier (a User ID) that you define. Appending or passing this identifier to the offerwall will trigger the offerwall to run in sandbox mode.

    Sandbox Identifiers will help you to test the offerwall across multiple devices and in different GEOs for certain predefined "Identifiers".

    Click on Edit Placement in the ayeT-Studios Publisher Dashboard and enter a identifier of your choice for the Sandbox Identifiers feature.

    In the example below, the sandbox identifier is set to testuser123.

    You can enter several identifiers if needed to make it easer to test with different devices and in different GEOs across your team.

    iOS App

    Did you upload your customized virtual currency icon?
  • Optional

    Did you add Proguard Rules?
    Did you upload your customized virtual currency icon?
  • Android SDK Specific

    Optional

    Did you add all necessary macros to your callback URL in order to pay your users?
  • Optional

    spasija.elenova@ayetstudios.com
    Currency Per Completed View (optional).

    For Rewarded Video

    1. Log into the dashboard

    2.Chose the Placement

    3. Edit Adslot

    4. Currency Setup In the pop-up window click on "Overview".

    You set the Currency Conversion Rate depending on how much you want to reward the user for each $1 you earn. For example, if $1 = 1000 Coins on your end and you want to set a 40% share for the users, you need to fill-in in the conversion rate field: $1 = 400 (40% from 1000 = 400)
    Testing callbacks

    Offerwall API

    Offerwall API

    iOS App

    Offerwall API

    Offerwall API

    Website

    Offerwall API

    Offerwall API

    If you integrate the Offerwall API while using a different Placement & AdSlot combination in the ayeT-Studios dashboard, you won't be able to make correct API requests.

    Getting Started

    Technical Offerwall API Documentation

    Conversion Callbacks & Currency Handling

    πŸ–₯️Dashboard Setup
    πŸ’‘Callbacks & Testing

    You should update your ads.txt regularly, since ayeT-Studios might add new partners to sell your traffic for higher CPMs. If you don't update regularly, you might miss out on additional revenue opportunities.

    You have two options to keep your ads.txt entries updated on your website:

    1. You can either download the entire ads.txt file

    2. Or you can copy the missing entries

    You then have to manually add these lines to your ads.txt site on your domain.

    Regular Manual Updates

    You can use the Permanent URL option to automate keeping the ads.txt entries on your site updated.

    Tell your tech to write a few lines of code to e.g. crawl the permanent URL once a day to search for updated ads.txt entries. Once you fetch changes, automaically update the ads.txt entries on your website.

    For more information on the API integration please go to the following link:

    Implementing and regularly updating an ads.txt file is a fundamental step in fostering a trustworthy and secure advertising environment.

    1. Log into your Publisher account

    2. Access Placement/Apps Settings

    3. Edit Placement

    4. Get ads.txt

    Two options to keep your ads.txt entries updated

    Option A: Regular Manual Updates

    Option B: Automated Updates / Permanent URL

    Recommened: Using the Permanent URL ensures that you don't have to regularly check on new entries or inform your tech team to update the ads.txt entries regularly.

    wrong device or browser version

    This prevents users from successful redirect to the final destination - the Play Store, the App Store or the intended Landing Page.

    You can configure an https redirect target for failed offer redirects in our publisher dashboard.

    This will override the standard "Error Page" (we call it "Share Offer" page) displayed in case of redirect errors.

    To do so, navigate to Placements / Apps, edit your placement and set the Failed Redirect Destination:

    A typical redirect destination may look like this:

    Below is a list of available macros to use in your redirect URL to better understand why a certain click is failing to get redirected. That way you can improve your integration down the road.

    Variable
    Type
    Description

    {external_identifier}

    string

    The user identifier (EXTERNAL IDENTIFIER) originally passed in the tracking link.

    {placement_id}

    string

    The ID of the placement for which the failed redirect happened

    https://your-redirect-destination.com/redirect?user_id={external_identifier}&offer_id={offer_id}&reason_code={reason_code}&reason_message={reason_message}

    Setting your custom Redirect Destination

    On your own redirect destiantion (landing page), you would be able to show a tailored:

    • error message to users

    • simply redirect the user back into your website or app

    Available Macros

    In the β€œApply to Placement” section you can blacklist the campaign for a specific placement.

    If you wish to blacklist the campaign for all placements – select β€œ(global)”

    In the main page of the Blackisting section you can find an overview of all the campaigns you blacklisted

    If you no longer want a campaign to be blacklisted you can easily make the change.

    First,locate the campaign from the list of all blacklisted entries and then click Delete.

    1. Log into your Publisher account

    2. Go to the 'Reports' section

    3. Add New Blacklist Entry

    4. Click 'Save' when you are done

    5. All Blacklisted Campaigns

    6. Unblocking a Campaign

    Name your currency sale
  • Description (not mandatory)

  • Select your Placement for which you want to run a currency sale

  • select a multiplier (we recommend at least 1.3)

  • You can also make your currency sale country-specific - by entering the country name in the box

    You can also exclude certain countries from your currency sale - by entering the country name in the box and ticking the box "Exclude Selected Countries"

    You can also exclude certain countries from your currency sale - by entering the country name in the box and ticking the box "Exclude Selected Countries"

    You can customize the start and the end date of your currency sale by clicking on the calendar icon.

    In the "Currency Sale" section of the dashboard a list of all Currency Sales created will be displayed. Locate the one you just created and turn it "ON"

    What is a Currency Sale?

    You can send an email to spasija.elenova@ayetstudios.com if you wish to participate in holiday-themed (platform-wide) currency sales.

    Custom Currency Sale

    1. Log into your dashboard

    2. Overview

    3. Create Currency Sale

    4. Setup

    A. You have to fill in the missing information, such as:

    B. Targeting

    C. Schedule

    Turn on currency sale immediately - will turn on the currency sale automatically on the start date you selected

    Click on "Save"

    D. Turn "ON" Currency Sale

    Click on Edit Placement in order to open the detail modal. Here you can change your postback URL and i.e. add additional macros.

    In addition you can send a test postback to your servers.

    When you click Send Test Postback, you will a list of fields and the information with which we will populate the macros you added to your callback URL.

    For a few of those fields you can input values yourself. A few other fields are locked and only the information displayed can be passed.

    Clicking on Send Postback will send the test postback.

    Clicking on Check Postback Status afterwards, will lead you to Reports / Conversions, where the callback that just got sent will be displayed.

    If you click on Details, you will be able to see the entire payload we sent and your Callback URL with populated macros.

    Why you should utilize the Callback Tester

    Check Available Macros

    Send Test Postback

    Offerwall Callbacks
    Rewarded Video Callbacks

    The example shows that the macros

    • {external_identifier}

    • {payout_usd}

    Check Test Postback

    In this specific example the ayeT-Studios servers populated only the macros that you previously added to your callback URL:

    • {external_identifier} = my-test-user-567

    • {payout_usd} = 0

    Now that the sandbox identifier is set, you have to pass the sandbox identifier to your Offerwall AdSlot that you want to test.

    In the example below, the testuser123 was passed to a Web Offerwall AdSlot. The offerwall now shows three test offers.

    Clicking on one of the test offers will show a detail modal with more instructions.

    Clicking on the Earn Button will trigger a test callback.

    Once you clicked on an offer, you can see the click ID and additional conversion details. In this case, a test callback with 200 in virtual currency and $0.2 in USD payout was triggered.

    You can also see the transaction ID and a describtion where to find more details for the callback in the ayeT-Studios dashboard.

    If you navigate to Reports / Conversions in the ayeT-Studios dashboard, you are able to find the test postback with your sandbox identifier that you just triggered.

    If you click on Details for the test callback, you are able to see all details for the test callback.

    The Callback Details show a list of available macros and information as well as the callback URL that was triggered, including the is_sandbox=1 macro to identifiy the callback as a test.

    To see a list of available callback macros, please go to the following section:

    Why you should utilize Sandbox Identifiers

    Using Sandbox Identifiers for testing helps you to avoid triggering any of the ayeT-Studios Fraud Prevention Checks that would block your device from accessing the offerwall.

    Defining Sandbox Identifiers

    Triggering a Test Callback

    Note: If you passed the sandbox identifier correctly, your offerwall will show three test offers (see screenshot below).

    Checking the Test Callback

    Note: Sandbox offer conversions will generate regular callbacks with fake payouts and user currency.

    &is_sandbox=1 is appended to every callback url to easily allow discarding test conversions.

    If your callback URL is missing information, please navigate to placements and edit your callback URL by adding additional callback macros.

    Offerwall Callbacks

    7. Fil in the Adslot information

    You can customize your virtual currency:

    8. Create Placement

    If the button is not clickable - some information is missing

    Design Settings

    Payments & Billing

    This section explains how to Provide us with Billing information, How to update your billing information, and also where to see your current and historic payments.

    Update Billing Information

    You have to provide the correct billing information during the integration process

    1. Log into your Publisher account

    2. Access Account Settings

    Under Account setting - (in the bottom right corner of the screen) click on "Billing Setting"

    3. Select your preferred method

    In the β€œPayout Method and Currency” section activate the drop-down list and chose your preferred payout method and currency.

    Note: Each payment method has a different minimum payout threshold (The minimum payout threshold is shown next to the preferred payout method).

    Example: If you chose PayPal as the preferred payout method, we will make payments to you that are a minimum of 25$. If you do not reach the minimum threshold in the current month, the amount earned will be transferred to the next.

    4. Update Billing Information

    Once you have filled out all of the required fields, click on "Update Billing Information"

    If you want to update your existing billing information please inform us at: billing@ayetstudios.com

    Credit Notes

    Whenever a payout is due - we issue a credit note. You can see the current (pending) credit note in the dashboard.

    The current billing cycle includes all accumulated earnings and deductions since the last credit note has been created. If the sum of these positions is greater or equal the threshold for the selected payout method, a credit note is generated.

    To check your credit note:

    Under Account setting - (in the bottom right corner of the screen) - click on "Payments"

    In this section, you can find Overview of your earnings for each one of your placement(s) in the current billing cycle.

    Whenever a payout threshold is reached - we issue the payout. You can see all the payouts made out to you in the dashboard.

    Under Account setting - (in the bottom right corner of the screen) - click on "Payments"

    "Under Credit Notes" you can find all payments made out to you.

    You can download the credit notes, and check the status of all historic payouts.

    You can sort the credit notes by status (for example "Paid") by selecting it in the field "Status".

    You can also download the credit notes, by clicking on "Download" in a row or the respective credit note.

    Static API

    The Static API is recommended only for special integrations, because not all campaigns are available without more sophisticated device match.

    If integrated, it should be called each 15-30 minutes to make sure our campaigns are still available, did not run into daily caps or changed targeting / bid.

    The "Static API key" for requests is adslot specific and available in the adslot details once approved by your account manager.

    Eligible Placement & AdSlot Combinations

    The table below shows all Placement & AdSlot Type combinations that allow you to utilize the Static API integration.

    Placement Type
    AdSlot Type
    Eligible Integration Type

    Website

    Before you start with the integration, make sure you:

    You will find more details here:

    API calls return a list of currently running campaigns on our platform which suit your adslot configuration. Can be filtered by additional parameters.

    Follow the link below to get to the detailed technical documentation.

    If you also request Multi-Reward Offers (CPE Offers) to display them to your users, you can use the CPE Offer Status API to track user progress and build a user journey displaying completed and available tasks.

    Follow the link to learn more about the CPE Offer Status API.

    Learn about:

    • Setting up callbacks

    • IP Whitelists

    • Securing callbacks using HMAC Security Hash

    Click on the link below:

    Reporting

    Learn more about the Offerwall metrics available in our dashboard and how to use them in your reporting

    Group
    Metric
    Description

    Revenue & Costs

    Revenue

    The publisher's net revenue from completed offers.

    Best Practise

    Following each of the main points below will help you get the most out of your Rewarded Video integration.

    CMP Integration & User Consent

    Why is a CMP integration with enabled vendor management essential to collect GDPR & CCPA compliant user consents to increase fill rates?

    Implementing a Consent Management Platform (CMP) is crucial for maximizing ad fill rates and ensuring demand partners actively bid on your inventory. A CMP facilitates compliance with data protection regulations, such as the General Data Protection Regulation (GDPR) in the European Union and the California Consumer Privacy Act (CCPA) in the United States. Without a compliant CMP and without requesting consent from affected GDPR & CCPA users, both fill rate and eCPM will be impacted significantly or no ads will be delivered at all.

    Importance of Vendor Management in Your CMP

    Enabling vendor management within your CMP is essential. This feature allows you to control which advertising partners can access user data, ensuring that only trusted vendors participate in the bidding process. Proper vendor management enhances transparency and trust, leading to higher fill rates and better eCPM.

    Key Regions Where CMP Implementation Is Critical

    Implementing a CMP is particularly important in regions with stringent data protection laws, including:

    • European Union (EU): Under the GDPR, user consent is mandatory for data processing activities, including targeted advertising.

    • United States (US): The CCPA requires businesses to obtain user consent before collecting personal information for advertising purposes.

    By integrating a CMP with robust vendor management capabilities, you ensure compliance with these regulations, maintain user trust, and optimize your ad monetization strategy.

    To optimize your setup:

    • Request a detailed introduction to Vendor Management from your CMP provider.

    • Contact our Account Managers to receive a curated list of the most relevant vendors to enable in your CMP solution.

    By focusing on comprehensive Vendor Management, you can maximize ad demand, increase fill rates, and comply with data privacy regulations effectively.

    When should you initialize the SDK?

    To provide a seamless experience and avoid user frustration, it’s essential to initialize the SDK at an appropriate time. This ensures the rewarded video is ready to play when users reach the relevant point in your app or game. Follow these recommendations:

    1. Early Initialization: Initialize the SDK as early as possible, such as when the user opens your app or game. This proactive approach ensures the SDK is ready well before users reach the video placement.

    2. Contextual Initialization: If initializing at app launch isn't feasible, do it when the user is nearing the section where the video will be displayed. This minimizes wait times and ensures a smoother experience.

    When should you make an Ad Request?

    It is a much better user experience to make ad requests before the user interacts with the video play button. Here’s why:

    1. Improved User Experience Pre-loading ads ensures they are ready to play instantly when the user clicks the button, eliminating waiting times and providing a seamless experience.

    2. Ensure Availability By making the ad request in advance, you can verify whether an ad is available (a "fill") before even displaying the button to the user. If no ad is available, the button can remain hidden, avoiding any user confusion or dissatisfaction.

    3. Logical Button Display Build a logic in your app or game to display the play button only if an ad is ready to be shown. For example:

    Why should you choose Client-Side Callbacks over Server-to-Server Callbacks?

    For scenarios where speed and user satisfaction are criticalβ€”such as rewarding users after a video adβ€” client-side callbacks are the superior choice.

    1. Immediate User Feedback: Client-side callbacks provide instant feedback to the user. When a rewarded video ends, the user immediately sees their reward, maintaining engagement and avoiding frustration caused by delays.

    2. No Network Dependency: Unlike S2S callbacks, client-side callbacks do not rely on external server communications. This eliminates risks associated with server downtime, network instability, or latency.

    3. Enhanced User Experience: Users expect immediate rewards after completing a task. Delays caused by S2S callbacks may lead to complaints, reduced trust, and a negative impression of the app.

    Design Settings

    In the left-hand side of at the top of the screen - click on "Placements / Apps"

    In the central part of the screen, all of your Placements will be shown - Locate the Placement which you want to customize

    Once you have located the Placement you want to customize - click on "Edit Adslot" - on the Offerwall Adslot of the Placement.

    In the pop-up window click on "Offerwall Design".

    From the drop-down menu you can select different types of themes. You have predefined themes, but you can also make a custom theme. You can select the colors you preferer.

    iOS SDK (v2)

    The iOS SDK allows you to easily monetize your app and reward your users with in-app currency. Your users get access to our offers and surveys, allowing them to earn rewards for completing offers.

    The table below shows all Placement & AdSlot Type combinations that allow you to utilize the iOS SDK integration.

    Placement Type
    AdSlot Type

    React Native Wrapper (v2)

    The React Native Wrapper lets you easily monetize your app and reward your users with in-app currency. Your users get access to our offers and surveys, allowing them to earn rewards.

    The table below shows all Placement & AdSlot Type combinations that allow you to utilize the React Native integration.

    Placement Type
    AdSlot Type

    iOS SDK (v2)

    The iOS SDK allows you to easily monetize your app and reward your users with in-app currency. Your users get access to our offers and surveys, allowing them to earn rewards for completing offers.

    The table below shows all Placement & AdSlot Type combinations that allow you to utilize the iOS SDK integration.

    Placement Type
    AdSlot Type

    React Native Wrapper (v2)

    The React Native Wrapper lets you easily monetize your app and reward your users with in-app currency. Your users get access to our offers and surveys, allowing them to earn rewards.

    The table below shows all Placement & AdSlot Type combinations that allow you to utilize the React Native integration.

    Placement Type
    AdSlot Type

    Surveywall API

    The Surveywall API provides a solution for publishers to include Surveys into their application/website while maintaining full control over look and feel of the Surveys.

    Eligible Placement & AdSlot Combinations

    The table below shows all Placement & AdSlot Type combinations that allow you to utilize the Surveywall API integration.

    Placement Type
    AdSlot Type
    Eligible Integration Type

    Payments & Billing

    This section explains how to Provide us with Billing information, How to update your billing information, and also where to see your current and historic payments.

    Under Account setting - (in the bottom right corner of the screen) click on "Billing Setting"

    In the β€œPayout Method and Currency” section activate the drop-down list and chose your preferred payout method and currency.

    Example: If you chose PayPal as the preferred payout method, we will make payments to you that are a minimum of 25$. If you do not reach the minimum threshold in the current month, the amount earned will be transferred to the next.

    Once you have filled out all of the required fields, click on "Update Billing Information"

    ​

    AdServer Fees

    This is the amount deducted from the revenue for the AdServer service. (*equals 0 if AdServer is not used)

    Delivery

    DAU

    Unique Users per calendar day using the offerwall.

    Offerwall Requests

    Total non-unique requests to the Offerwall (counts users multiple times if they enter the offerwall several times a day).

    Unique Offerwall Requests

    Unique requests to the Offerwall by users (including users that churned by not accepting the privacy policy).

    ​

    Unique Offerwall Entries

    Unique entries to the Offerwall by users (consisting of users which are accepting the privacy policy or have accepted it already in the past).

    Interactions

    Impressions

    An impression is registered once a user opens the Offerwall (no time delay).

    ​

    Clicks

    This equals the number of offers which were started.

    ​

    Conversions

    A conversion is registered once an offer is completed.

    Performance

    EPC

    The average Earnings per Click calculated from the Revenue divided by the amount of clicks.

    eCPM

    The average CPM (Cost per Thousand) calculated from Revenue divided by Offerwall Requests times 1000.

    ARPDAU

    The Average Revenue per Daily Active User.

    Make the ad request in advance (e.g., during app initialization or when the user is approaching the rewarded video placement).

  • Display the button only if an ad is available, ensuring users can always watch a video upon clicking.

  • Check the availability of the ad (whether there is a "fill") when the user clicks on the button. If there is a no fill or the ad expired, re-request an ad.

  • Simpler Implementation: Client-side callbacks are easier to implement as they do not require complex server infrastructure or robust handling for network issues.

    Avoid CMPs That Only Offer Cookie Management

    When choosing a Consent Management Platform (CMP), it’s essential to look beyond basic cookie management. Some CMPs focus solely on managing cookies, which is not sufficient for effective advertising monetization. Ensure that your CMP includes Vendor Management capabilities to manage and enable demand partners effectively.

    SDK Initialization

    Avoid Delayed Initialization: Never initialize the SDK only when the video button is already visible to the user. SDK initialization can take a few seconds, and users expect immediate responses. Delays at this stage can lead to frustration and disrupt the overall user experience.

    Ad Requests

    Avoid Delays in Ad Loading: When an ad request is initiated upon the button click, the user must wait for the ad to load. Depending on the network speed and server response time, this delay can disrupt the flow of the app or game and frustrate the user.

    Avoid Risk of No Fill: There is always a possibility of receiving a "no fill" response from the ad network, meaning no ad is available to show. If this occurs after the user has already clicked the button, they might feel misled or disappointed, as they were expecting to watch an ad and earn a reward. This can lead to a negative perception of the app or game.

    Callbacks

    Avoid Delays in Callbacks: Rewarding users after a video has been watched should be instant. Avoid delays when using server-to-server callbacks and use client-side callbacks instead.

    or anything similar of your choice

    {offer_id}

    int

    ID of the offer for which the redirect failed

    {reason_code}

    int

    Code indicating the type of failed redirect so you can group different reasons and their frequency - e.g. 310

    {reason_message}

    string

    A more detailed message of the reason for the redirect failure - e.g. "We are sorry, but the offer you were looking for is not available for you!"

    {currency_amount}

  • {placement_identifer}

  • were added to your callback URL.

    {currency_amount} = 320

  • {placement_identifer} = deb88ed8abe52ab1f67a97068d88d9db

  • Surveywall

    Android/iOS

    Offerwall API

    Before you start with the integration, make sure you have:

    You can find more details here:

    Run the installation command:

    Add the following tag to your AndroidManifest.xml , just before the application tag:

    Example of completed AndroidManifest.xml:

    Install pods:

    The externalIdentifier is your user's ID, accessible in conversion callbacks via {external_identifier}. The placementId is found in your dashboard.

    To show the offerwall, simply call the showOfferwall method:

    Learn about:

    • Setting up callbacks

    • IP Whitelists

    • Securing callbacks using HMAC Security Hash

    • Testing callbacks

    Click on the link below:

    To show the surveywall, simply call the showSurveywall method:

    To fetch a list of all offers in JSON format, simply call the getOffers method:

    The Reward Status page allows users to see their clicked and in-progress offers and allows users to request support / submit tickets. The reward status is also part of the offerwall and the surveywall. To show the reward status page stand-alone, simply call the showRewardStatus method:

    Set custom parameters for callbacks. Set up to 5 custom parameters.

    More information here:

    Additionally, you may optionally pass user age and gender to us. This can help us match users to the best and most appropriate offers for them.

    Android/iOS

    Offerwall

    Updates History

    2026-04-15: v1.0.0 - Release the React Native Wrapper for V2 of the SDK

    Eligible Placement & AdSlot Combinations

    Android/iOS

    If you integrate the React Native wrapper while using a different Placement & AdSlot combination in the ayeT-Studios dashboard, you won't be able to initialize the SDK.

    Getting Started

    Make sure to use the correct package name that you intend to use for your final app. Alternatively, create a test placement with a different package name that matches the package name of your test app.

    If package name of your placement and your actual app don't match, you can't initialize the SDK. Note that your package name may be different on iOS and Android for the same React Native app.

    Installation

    Android Setup

    iOS Setup

    Import and initialize the SDK

    Show the Offerwall

    The YOUR_OFFERWALL_ADSLOT_NAME parameter can be found by clicking on the adslot on your dashboard. This is only available on Offerwall adslots.

    Conversion Callbacks & Currency Handling

    Additional Methods

    Show the Surveywall

    The YOUR_SURVEYWALL_ADSLOT_NAME parameter can be found by clicking on the adslot on your dashboard. This is only available on Surveywall adslots.

    Fetch Offers

    The YOUR_OFFERWALL_API_ADSLOT_NAME parameter can be found by clicking on the adslot on your dashboard. This is only available on Offerwall API adslots.

    Show Reward Status

    Set custom parameters

    Note: Custom parameters must also be added to your callback URL to receive them in your S2S callbacks.

    Set Age and Gender

    πŸ–₯️Dashboard Setup
    πŸ’‘Callbacks & Testing
    Offerwall Callbacks

    Surveywall

    Android/iOS

    Offerwall API

    Before you start with the integration, make sure you have:

    You can find more details here:

    Run the installation command:

    Add the following tag to your AndroidManifest.xml , just before the application tag:

    Example of completed AndroidManifest.xml:

    Install pods:

    The externalIdentifier is your user's ID, accessible in conversion callbacks via {external_identifier}. The placementId is found in your dashboard.

    To show the surveywall, simply call the showSurveywall method:

    Learn about:

    • Setting up callbacks

    • IP Whitelists

    • Securing callbacks using HMAC Security Hash

    • Testing callbacks

    Click on the link below:

    To show the offerwall, simply call the showOfferwall method:

    To fetch a list of all offers in JSON format, simply call the getOffers method:

    The Reward Status page allows users to see their clicked and in-progress offers and allows users to request support / submit tickets. The reward status is also part of the offerwall and the surveywall. To show the reward status page stand-alone, simply call the showRewardStatus method:

    Set custom parameters for callbacks. Set up to 5 custom parameters.

    More information here:

    Additionally, you may optionally pass user age and gender to us. This can help us match users to the best and most appropriate offers for them.

    Android/iOS

    Offerwall

    Updates History

    2026-04-15: v1.0.0 - Release the React Native Wrapper for V2 of the SDK

    Eligible Placement & AdSlot Combinations

    Android/iOS

    If you integrate the React Native wrapper while using a different Placement & AdSlot combination in the ayeT-Studios dashboard, you won't be able to initialize the SDK.

    Getting Started

    Make sure to use the correct package name that you intend to use for your final app. Alternatively, create a test placement with a different package name that matches the package name of your test app.

    If package name of your placement and your actual app don't match, you can't initialize the SDK. Note that your package name may be different on iOS and Android for the same React Native app.

    Installation

    Android Setup

    iOS Setup

    Import and initialize the SDK

    Show the Surveywall

    The YOUR_SURVEYWALL_ADSLOT_NAME parameter can be found by clicking on the adslot on your dashboard. This is only available on Surveywall adslots.

    Conversion Callbacks & Currency Handling

    Additional Methods

    Show the Offerwall

    The YOUR_OFFERWALL_ADSLOT_NAME parameter can be found by clicking on the adslot on your dashboard. This is only available on Offerwall adslots.

    Fetch Offers

    The YOUR_OFFERWALL_API_ADSLOT_NAME parameter can be found by clicking on the adslot on your dashboard. This is only available on Offerwall API adslots.

    Show Reward Status

    Set custom parameters

    Note: Custom parameters must also be added to your callback URL to receive them in your S2S callbacks.

    Set Age and Gender

    πŸ–₯️Dashboard Setup
    πŸ’‘Callbacks & Testing
    Offerwall Callbacks
    npm install ayet-react-native-sdk-v2
    <uses-permission android:name="android.permission.INTERNET" />
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">
    
        <uses-permission android:name="android.permission.INTERNET" />
    
        <application
            android:allowBackup="true"
            android:dataExtractionRules="@xml/data_extraction_rules"
            android:fullBackupContent="@xml/backup_rules"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/Theme.AyetSDKExample">
            <activity
                android:name=".MainActivity"
                android:exported="true"
                android:label="@string/app_name"
                android:theme="@style/Theme.AyetSDKExample">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    </manifest>
    cd ios && pod install
    import AyetSdkV2 from 'ayet-react-native-sdk-v2';
    
    // Initialize with your placement ID and user identifier
    AyetSdkV2.init(YOUR_PLACEMENT_ID, 'USER_EXTERNAL_IDENTIFIER');
    AyetSdkV2.showOfferwall('YOUR_OFFERWALL_ADSLOT_NAME');
    AyetSdkV2.showSurveywall('YOUR_SURVEYWALL_ADSLOT_NAME');
    const offersJson = await AyetSdkV2.getOffers('YOUR_OFFERWALL_API_ADSLOT_NAME');
    AyetSdkV2.showRewardStatus();
    AyetSdkV2.setTrackingCustom1('custom1');
    AyetSdkV2.setTrackingCustom2('custom2');
    AyetSdkV2.setTrackingCustom3('custom3');
    AyetSdkV2.setTrackingCustom4('custom4');
    AyetSdkV2.setTrackingCustom5('custom5');
    AyetSdkV2.setAge(25);
    AyetSdkV2.setGender(AyetGender.Male);
    npm install ayet-react-native-sdk-v2
    <uses-permission android:name="android.permission.INTERNET" />
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">
    
        <uses-permission android:name="android.permission.INTERNET" />
    
        <application
            android:allowBackup="true"
            android:dataExtractionRules="@xml/data_extraction_rules"
            android:fullBackupContent="@xml/backup_rules"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/Theme.AyetSDKExample">
            <activity
                android:name=".MainActivity"
                android:exported="true"
                android:label="@string/app_name"
                android:theme="@style/Theme.AyetSDKExample">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    </manifest>
    cd ios && pod install
    import AyetSdkV2 from 'ayet-react-native-sdk-v2';
    
    // Initialize with your placement ID and user identifier
    AyetSdkV2.init(YOUR_PLACEMENT_ID, 'USER_EXTERNAL_IDENTIFIER');
    AyetSdkV2.showSurveywall('YOUR_SURVEYWALL_ADSLOT_NAME');
    AyetSdkV2.showOfferwall('YOUR_OFFERWALL_ADSLOT_NAME');
    const offersJson = await AyetSdkV2.getOffers('YOUR_OFFERWALL_API_ADSLOT_NAME');
    AyetSdkV2.showRewardStatus();
    AyetSdkV2.setTrackingCustom1('custom1');
    AyetSdkV2.setTrackingCustom2('custom2');
    AyetSdkV2.setTrackingCustom3('custom3');
    AyetSdkV2.setTrackingCustom4('custom4');
    AyetSdkV2.setTrackingCustom5('custom5');
    AyetSdkV2.setAge(25);
    AyetSdkV2.setGender(AyetGender.Male);
    Testing callbacks

    Static API

    Static API

    Android App

    Static API

    Static API

    iOS App

    Static API

    Static API

    API / Network

    Static API

    Static API

    If you integrate the Offerwall API while using a different Placement & AdSlot combination in the ayeT-Studios dashboard, you won't be able to make correct API requests.

    Getting Started

    Technical Documentation: Static API

    Note: To pass custom parameters from clicks to conversion callbacks, the tracking_link parameter in offer objects can be extended with &custom_1=... to &custom_5=...

    CPE Offer Status

    Conversion Callbacks & Currency Handling

    πŸ–₯️Dashboard Setup
    πŸ’‘Callbacks & Testing

    In the left-hand side of at the top of the screen - click on "Placements / Apps"

    In the central part of the screen, all of your Placements will be shown - Locate the Placement which you want to customize

    Once you have located the Placement you want to customize - click on "Edit Adslot" - on the Offerwall Adslot of the Placement.

    In the pop-up window click on "Offerwall Design".

    On top of the Offerwall you can add your custom banner / image

    • Chose if you like to upload a Portrait Image or Landscape image

    • Next to the respective image type you chose - click on "Chose File"

    • Locate and upload the file you want

    • Click on "Save"

    In the left-hand side of at the top of the screen - click on "Placements / Apps"

    In the central part of the screen, all of your Placements will be shown - Locate the Placement which you want to customize

    Once you have located the Placement you want to customize - click on "Edit Adslot" - on the Offerwall Adslot of the Placement.

    In the pop-up window click on "Offerwall Design".

    You can customize your virtual coin as you wish. You can choose a color of your liking, but also upload your designed coin.

    • Select Theme - from the drop-down menu click on "Customize"

    • Select Custom Coin - From the drop-down menu click on "Upload Custom Image"

    • To upload the image click on "Choose File"

    You can customize the Offerwall to your liking

    Custom Theme

    1. Log into the dashboard

    2. Chose the Placement

    3. Edit Adslot

    4. Offerwall Design

    5. Customize

    The changes you make are displayed in the Offerwall Preview

    Custom Banner

    1. Log into the dashboard

    2. Chose the Placement

    3. Edit Adslot

    4. Offerwall Design

    5. Customize

    The changes you make are displayed in the Offerwall Preview

    For Portrait Image - we recommend 1080px x (120px to 350px)

    For Landscape Image - we recommend 1920px x (70px to 200 px)

    Custom Coin

    1. Log into the dashboard

    2. Chose the Placement

    3. Edit Adslot

    4. Offerwall Design

    5. Customize

    We recommend using image 50px x 50px

    Click on "Save"

    iOS

    Surveywall

    iOS

    Offerwall API

    Before you start with the integration, make sure you have:

    You can find more details here:

    To integrate the iOS SDK into your project, add the package dependency to your app.

    In Xcode, with your project open, click File and Add Package Dependencies...

    Enter the repository URL (https://github.com/ayetstudios/ios-sdk-v2-repo) in the search bar and click Add Package:

    Select the target for your app, then click Add Package again:

    In this step, we will import and initialize the SDK in the app.

    First, import the library:

    Then, call the AyetSDK.shared.initialize method:

    To show the offerwall, simply call the showOfferwall method:

    Learn about:

    • Setting up callbacks

    • IP Whitelists

    • Securing callbacks using HMAC Security Hash

    • Testing callbacks

    Click on the link below:

    To fetch a list of all offers in JSON format, simply call the getOffers method:

    The Reward Status page allows users to see their clicked and in-progress offers and allows users to request support / submit tickets. The reward status is also part of the offerwall and the surveywall. To show the reward status page stand-alone, simply call the showRewardStatus method:

    To show the surveywall, simply call the showSurveywall method:

    Set custom parameters for callbacks. Set up to 5 custom parameters.

    More information here:

    Additionally, you may optionally pass user age and gender to us. This can help us match users to the best and most appropriate offers for them.

    iOS

    Updates History

    2025-12-02: v1.0.0 - Release the iOS SDK v2

    Eligible Placement & AdSlot Combinations

    Offerwall

    import AyetSDK           
    @main
    struct iosSdkV2DemoAppApp: App {
        init() {
            AyetSDK.shared.initialize(placementId: YOUR_PLACEMENT_ID, externalIdentifier: "USER_EXTERNAL_IDENTIFIER")
        }
    
        var body: some Scene {
            WindowGroup {
                ContentView()
            }
        }
    }
    await AyetSDK.shared.showOfferwall(adSlotName: "YOUR_OFFERWALL_ADSLOT_NAME")
    if let offersJson = await AyetSDK.shared.getOffers(adSlotName: "YOUR_OFFERWALL_API_ADSLOT_NAME") {
        print("Offers received: \(offersJson)")
    } else {
        print("Failed to get offers - null response")
    }
    await AyetSDK.shared.showRewardStatus()
    await AyetSDK.shared.showSurveywall(adSlotName: "YOUR_SURVEYWALL_ADSLOT_NAME")
    AyetSDK.shared.setTrackingCustom1("custom1")
    AyetSDK.shared.setTrackingCustom2("custom2")
    AyetSDK.shared.setTrackingCustom3("custom3")
    AyetSDK.shared.setTrackingCustom4("custom4")
    AyetSDK.shared.setTrackingCustom5("custom5")
    AyetSDK.shared.setGender(.male)
    AyetSDK.shared.setGender(.female)
    AyetSDK.shared.setAge(25)

    If you integrate the iOS SDK while using a different Placement & AdSlot combination in the ayeT-Studios dashboard, you won't be able to initialize the SDK.

    Demo App

    Getting Started

    Make sure to use the correct package name that you intend to use for your final app. Alternatively, create a test placement with a different package name that matches the package name of your test app.

    If package name of your placement and your actual app don't match, you can't initialize the SDK.

    Adding the SDK Dependency

    Import and initialize the SDK

    Note: The externalIdentifier passed in the init call is the user's identifier on your end. This will be accessible in the conversion callbacks through the {external_identifier} parameter. The placementId is the unique ID assigned to your placement when it's created through our dashboard.

    Show the Offerwall

    The YOUR_OFFERWALL_ADSLOT_NAME parameter can be found by clicking on the adslot on your dashboard. This is only available on Offerwall adslots.

    Conversion Callbacks & Currency Handling

    Additional Methods

    Fetch Offers

    The YOUR_OFFERWALL_API_ADSLOT_NAME parameter can be found by clicking on the adslot on your dashboard. This is only available on Offerwall API adslots.

    Show Reward Status

    Show the Surveywall

    The YOUR_SURVEYWALL_ADSLOT_NAME parameter can be found by clicking on the adslot on your dashboard. This is only available on Surveywall adslots.

    Set custom parameters

    Note: Custom parameters must also be added to your callback URL to receive them in your S2S callbacks.

    Set Age and Gender

    πŸ–₯️Dashboard Setup
    πŸ’‘Callbacks & Testing
    Offerwall Callbacks

    iOS

    Surveywall

    iOS

    Offerwall API

    Before you start with the integration, make sure you have:

    You can find more details here:

    To integrate the iOS SDK into your project, add the package dependency to your app.

    In Xcode, with your project open, click File and Add Package Dependencies...

    Enter the repository URL (https://github.com/ayetstudios/ios-sdk-v2-repo) in the search bar and click Add Package:

    Select the target for your app, then click Add Package again:

    In this step, we will import and initialize the SDK in the app.

    First, import the library:

    Then, call the AyetSDK.shared.initialize method:

    To show the surveywall, simply call the showSurveywall method:

    Learn about:

    • Setting up callbacks

    • IP Whitelists

    • Securing callbacks using HMAC Security Hash

    • Testing callbacks

    Click on the link below:

    To show the offerwall, simply call the showOfferwall method:

    To fetch a list of all offers in JSON format, simply call the getOffers method:

    The Reward Status page allows users to see their clicked and in-progress offers and allows users to request support / submit tickets. The reward status is also part of the offerwall and the surveywall. To show the reward status page stand-alone, simply call the showRewardStatus method:

    Set custom parameters for callbacks. Set up to 5 custom parameters.

    More information here:

    Additionally, you may optionally pass user age and gender to us. This can help us match users to the best and most appropriate offers for them.

    iOS

    Updates History

    2025-12-02: v1.0.0 - Release the iOS SDK v2

    Eligible Placement & AdSlot Combinations

    Offerwall

    import AyetSDK           
    @main
    struct iosSdkV2DemoAppApp: App {
        init() {
            AyetSDK.shared.initialize(placementId: YOUR_PLACEMENT_ID, externalIdentifier: "USER_EXTERNAL_IDENTIFIER")
        }
    
        var body: some Scene {
            WindowGroup {
                ContentView()
            }
        }
    }
    await AyetSDK.shared.showSurveywall(adSlotName: "YOUR_SURVEYWALL_ADSLOT_NAME")
    await AyetSDK.shared.showOfferwall(adSlotName: "YOUR_OFFERWALL_ADSLOT_NAME")
    if let offersJson = await AyetSDK.shared.getOffers(adSlotName: "YOUR_OFFERWALL_API_ADSLOT_NAME") {
        print("Offers received: \(offersJson)")
    } else {
        print("Failed to get offers - null response")
    }
    await AyetSDK.shared.showRewardStatus()
    AyetSDK.shared.setTrackingCustom1("custom1")
    AyetSDK.shared.setTrackingCustom2("custom2")
    AyetSDK.shared.setTrackingCustom3("custom3")
    AyetSDK.shared.setTrackingCustom4("custom4")
    AyetSDK.shared.setTrackingCustom5("custom5")
    AyetSDK.shared.setGender(.male)
    AyetSDK.shared.setGender(.female)
    AyetSDK.shared.setAge(25)

    If you integrate the iOS SDK while using a different Placement & AdSlot combination in the ayeT-Studios dashboard, you won't be able to initialize the SDK.

    Demo App

    Getting Started

    Make sure to use the correct package name that you intend to use for your final app. Alternatively, create a test placement with a different package name that matches the package name of your test app.

    If package name of your placement and your actual app don't match, you can't initialize the SDK.

    Adding the SDK Dependency

    Import and initialize the SDK

    Note: The externalIdentifier passed in the init call is the user's identifier on your end. This will be accessible in the conversion callbacks through the {external_identifier} parameter. The placementId is the unique ID assigned to your placement when it's created through our dashboard.

    Show the Surveywall

    The YOUR_SURVEYWALL_ADSLOT_NAME parameter can be found by clicking on the adslot on your dashboard. This is only available on Surveywall adslots.

    Conversion Callbacks & Currency Handling

    Additional Methods

    Show the Offerwall

    The YOUR_OFFERWALL_ADSLOT_NAME parameter can be found by clicking on the adslot on your dashboard. This is only available on Offerwall adslots.

    Fetch Offers

    The YOUR_OFFERWALL_API_ADSLOT_NAME parameter can be found by clicking on the adslot on your dashboard. This is only available on Offerwall API adslots.

    Show Reward Status

    Set custom parameters

    Note: Custom parameters must also be added to your callback URL to receive them in your S2S callbacks.

    Set Age and Gender

    πŸ–₯️Dashboard Setup
    πŸ’‘Callbacks & Testing
    Offerwall Callbacks

    Surveywall API

    Surveywall API

    iOS App

    Surveywall API

    Surveywall API

    Website

    Surveywall API

    Surveywall API

    Before you start with the integration, make sure you:

    You will find more details here:

    For API Calls, all surveys matching the parameters provided will be returned and can be displayed to the user.

    The Surveywall API supports both server and client-side calls.

    Follow the link below to get to the detailed technical documentation.

    If you already collect profiling data from your users, you can optionally pass this information to us through the Surveywall API call. While not required, providing profiling details can improve targeting and survey performance.

    To enable this feature, open the Edit Adslot modal for your Surveywall API adslot in the dashboard and generate a Profiling Data Validation Hash.

    You can find the complete list of supported profiling questions and acceptable answer formats here: πŸ‘‰ Profiling Questions & Answers Please check this document regularly for updates.

    To include profiling data in your API call, append the appropriate question and answer parameters to the request URL. You'll also need to generate a cryptographic hash to validate the data.

    For example, to pass the following information:

    • Gender: Male

    • ZIP Code: 20500

    • Birthdate: 1995-05-31

    The API call would look like this:

    The hash parameter is calculated as a SHA256 HMAC, using the Profiling Data Validation Hash as the secret key. The input string is a URL-encoded query string of all parameters except the hash itself, sorted by key.

    Here’s a PHP example:

    Learn about:

    • Setting up callbacks

    • IP Whitelists

    • Securing callbacks using HMAC Security Hash

    • Testing callbacks

    Click on the link below:

    Android App

    https://www.ayetstudios.com/surveys/surveywall_api/{adslotId}?external_identifier={YOUR_USER_IDENTIFIER}&q5=1995-05-31&q6=20500&q7=8&hash=88cd2108b5347d973cf39cdf9053d7dd42704876d8c9a9bd8e2d168259d3ddf7
    function generateHash($requestParams, $profilingDataValidationHash) {
        // Remove the 'hash' parameter
        unset($requestParams['hash']);
    
        // Sort parameters by key
        ksort($requestParams);
    
        // Build query string
        $queryString = http_build_query($requestParams);
    
        // Calculate HMAC-SHA256 hash
        $expectedHash = hash_hmac('sha256', $queryString, $profilingDataValidationHash);
    
        return $expectedHash;
    }
    
    // Input data
    $profilingDataValidationHash = "your-key";
    $requestParams = [
        "external_identifier" => "testuser1234",
        "q5" => "1995-05-31",
        "q6" => "20500",
        "q7" => "8"
    ];
    
    echo "https://www.ayetstudios.com/surveys/surveywall_api/1234?external_identifier=testuser1234&q5=1995-05-31&q6=20500&q7=8&hash=" . generateHash($requestParams, $profilingDataValidationHash);

    If you integrate the Surveywall API while using a different Placement & AdSlot combination in the ayeT-Studios dashboard, you won't be able to make correct API requests.

    Getting Started

    Technical Surveywall API Documentation

    Passing Profiling Information via the Surveywall API

    Available Questions and Answers

    How to Pass Profiling Information

    Hash Generation

    Conversion Callbacks & Currency Handling

    πŸ–₯️Dashboard Setup
    πŸ’‘Callbacks & Testing
    Whenever a payout is due - we issue a credit note. You can see the current (pending) credit note in the dashboard.

    The current billing cycle includes all accumulated earnings and deductions since the last credit note has been created. If the sum of these positions is greater or equal the threshold for the selected payout method, a credit note is generated.

    To check your credit note:

    Under Account setting - (in the bottom right corner of the screen) - click on "Payments"

    In this section, you can find Overview of your earnings for each one of your placement(s) in the current billing cycle.

    Whenever a payout threshold is reached - we issue the payout. You can see all the payouts made out to you in the dashboard.

    In the bottom left corner of the screen - click on "Payments"

    "Under Credit Notes" you can find all payments made out to you.

    You can download the credit notes, and check the status of all historic payouts.

    You can sort the credit notes by status (for example "Paid") by selecting it in the field "Status".

    You can also download the credit notes, by clicking on "Download" in a row or the respective credit note.

    Update Billing Information

    You have to provide the correct billing information during the integration process

    1. Log into your Publisher account

    2. Access Account Settings

    3. Select your preferred method

    Note: Each payment method has a different minimum payout threshold (The minimum payout threshold is shown next to the preferred payout method).

    4. Update Billing Information

    If you want to update your existing billing information please inform us at: spasija.elenova@ayetstudios.com

    Credit Notes

    1. Log into your Publisher account

    2. Access Account Settings

    3. Current Billing Cycle

    Once the payout threshold is made - we will make the payment.

    Payments

    1. Log into your Publisher account

    2. Access Account Settings

    2. Credit Notes

    1. Log into your Publisher account

    2. Access Account Settings

    3. Current Billing Cycle

    Once the payout threshold is made - we will make the payment.

    Payments

    1. Log into your Publisher account

    2. Access Account Settings

    2. Credit Notes

    Web Offerwall

    The ayeT-Studios Publisher Browser Web Offerwall allows you to easily monetize your desktop and mobile traffic and reward your users with virtual currency.

    Eligible Placement & AdSlot Combinations

    The below table shows all Placement & AdSlot Type combinations that allow you to utilize the Web Offerwall integration.

    Placement Type
    AdSlot Type
    Eligible Integration Type

    Website

    Technically, the Offerwall has to be implemented by opening a new browser tab or loading the Offerwall link inside an iframe.

    This type of Web Offerwall is intended to be called directly in an actual browser and is not very well suited for webview (in-app) integration. For this type of integration, please take a look at our seamless In-App integrations by checking out our available SDKs, Wrappers and Plugins.

    Platform
    Integration Best Practise
    Offers

    Before you start with the integration, make sure you:

    You will find more details here:

    The URL template for our web offerwall looks like this:

    To retrieve the URL for one of your web offerwall adslots, click on "Edit" next to an AdSlot under Placements / Apps and retrieve the Integration URL in the modal.

    URL Parameters:

    Parameter
    Mandatory
    Description

    Learn about:

    • Setting up callbacks

    • IP Whitelists

    • Securing callbacks using HMAC Security Hash

    Click on the link below:

    Reporting

    Learn more about the Rewarded Video metrics available in our dashboard and how to use them in your reporting

    Group
    Metric
    Description

    Revenue & Costs

    Revenue

    The publisher's net revenue.

    ​

    *For AdServer integration the service fees are not considered and revenue is estimated based on Rewarded views (after our own fraud & viewability checks), VAST network configuration or RTB (real-time bidding) exchange eCPM in bid responses.

    HMAC Security Hash (optional)

    HMAC Security Hash

    Our server will always add a custom header, X-Ayetstudios-Security-Hash, containing a SHA256 HMAC hash of the request parameters and your publisher api key. Your API key can be found in your dashboard at ayetstudios.com under settings.

    To verify the hash, perform the following steps:

    1. Get all request parameters

    2. Order the request parameters alphabetically

    3. Build and compare the HMAC hash using the ordered request parameter string and your API key

    PHP example:

    Javascript example:

    Python example:

    Assuming the below is the callback we sent to you:

    1) Get all request parameters

    Strip away your domain and get the request parameters.

    2) Sort the parameters alphabetically and URL-encode the values

    This is crucial because special characters (like spaces) must be encoded (e.g. a space should become +) in order to match the original string that was hashed.

    Your API Key from the ayeT dashboard:

    3) Build and compare the HMAC hash using the ordered request parameter string and your API key

    Hashing the ordered request parameter string with your Secret Key (API Key) with SHA256, you will get the following HASH Key:

    Compare the HASH Key you calculated to the X-Ayetstudios-Security-Hash our server will always add as a custom header for each conversion.

    Android SDK (v2)

    The Android SDK allows you to easily monetize your app and reward your users with in-app currency. Your users get access to our offers and surveys, allowing them to earn rewards for completing offers.

    The table below shows all Placement & AdSlot Type combinations that allow you to utilize the Android SDK integration.

    Placement Type
    AdSlot Type

    Android SDK (v2)

    The Android SDK allows you to easily monetize your app and reward your users with in-app currency. Your users get access to our offers and surveys, allowing them to earn rewards for completing offers.

    The table below shows all Placement & AdSlot Type combinations that allow you to utilize the Android SDK integration.

    Placement Type
    AdSlot Type

    Web Surveywall

    The Web Surveywall by ayeT-Studios allows you to easily monetize your desktop and mobile traffic with surveys that users can complete in exchange for getting a virtual currency reward.

    The below table shows all Placement & AdSlot Type combinations that allow you to utilize the Web Surveywall integration.

    Placement Type
    AdSlot Type
    Eligible Integration Type
    ayeT - Logo Kit.zipGoogle Docs
    ayeT-Studios Publisher API Documentationwww.ayetstudios.com

    ​

    AdServer Fees

    This is the amount deducted from the revenue for the AdServer service.

    (*equals 0 if AdServer is not used)

    Delivery

    Requests

    Number of requested video ads.

    ​

    Fills

    Ad requests with valid fill for at least one network.

    No Fills

    The network didn't deliver an ad for the request.

    Unchecked Fill Status

    The fill wasn't checked for this network, because a network higher up in the waterfall already delivered fill.

    Playback

    Requested Plays

    The number of filled ad requests for which playAd was called.

    ​

    Media Errors

    The number of requested plays for which the player was unable to load or initialize the media file.

    ​

    Started Plays

    The media file was loaded and playback started.

    ​

    Play errors

    The number of times video playback was prematurely interrupted (user abort, network errors, interactive ad termination).

    Performance

    Completed Views

    The number of completed video views.

    ​

    Rewarded Views

    The number of rewarded views after server-side fraud and visibility checks.

    eCPM

    This is the effective Cost Per Mille calculated based on the revenue and rewarded views.

    eCPM= Revenue / Rewarded views *1000

    TCF

    TCF Missing

    Consent String is missing

    TCF GDPR

    GDPR Consent String is available

    TCF No GDPR

    GDPR Consent String is not available

    TCF Rejected

    User rejected the Consent

    TCF Partial

    User partially accepted the Consent

    TCF Consented

    User fully accepted the Consent

    Logo

    The web offerwall adjusts its layout if users access via a mobile device. I.e. for accessing via an Android device, users will see elibile Android offers to complete.

    In-App

    Create a button in your app that leads users into their mobile browser and into the ayeT-Studios Web Offerwall.

    The web offerwall shows mobile offers according the the user's device only.

    custom_2

    no

    Custom parameter you can pass to the Offerwall Entry Link in the form of: &custom_2={YOUR_CUSTOM_PARAMETER}

    You can get this variable back via conversion callbacks

    custom_3

    no

    Custom parameter you can pass to the Offerwall Entry Link in the form of: &custom_3={YOUR_CUSTOM_PARAMETER}

    You can get this variable back via conversion callbacks

    custom_4

    no

    Custom parameter you can pass to the Offerwall Entry Link in the form of: &custom_4={YOUR_CUSTOM_PARAMETER}

    You can get this variable back via conversion callbacks

    custom_5

    no

    Custom parameter you can pass to the Offerwall Entry Link in the form of: &custom_5={YOUR_CUSTOM_PARAMETER}

    You can get this variable back via conversion callbacks

    Testing callbacks

    Offerwall

    Web Offerwall

    Desktop

    Open the web offerwall in a new tab or iframe.

    The web Offerwall shows web and mobile offers to the user. Users can send mobile offers to their mobile devices.

    Mobile Web

    externalIdentifier

    yes

    Your identifier for the calling user - this is mandatory, has to be minimum 3 characters and allows you to attribute our Server2Server conversion callbacks to a specific user (returned in {uid})

    custom_1

    no

    If you integrate the Web Offerwall while using a different Placement & AdSlot combination in the ayeT-Studios dashboard, you won't be able to initialize the Offerwall.

    Utilization for Desktop, Mobile Web & In-App

    The Web Offerwall can nevertheless be used in-app if you follow a few guidelines

    • Your placement has to be a "Website" placement

    • You have link out of your app to open the Web Offerwall in a mobile browser

    Please follow the Integration Best Practises.

    Integration Best Practices

    Getting Started

    Your Browser Offerwall Link - Mandatory Parameters

    Conversion Callbacks & Currency Handling

    πŸ–₯️Dashboard Setup
    πŸ’‘Callbacks & Testing

    Open the web offerwall in a new tab or iframe.

    Custom parameter you can pass to the Offerwall Entry Link in the form of: &custom_1={YOUR_CUSTOM_PARAMETER}

    You can get this variable back via conversion callbacks

    Example HMAC calculation

    Important: Make sure you URL-encode every parameter value. This is crucial because special characters (like spaces) must be encoded (e.g. a space should become +) in order to match the original string that was hashed.

    https://offerwall.ayet.io/offers?adSlot={ADSLOT_ID}&externalIdentifier={YOUR_USER_IDENTIFIER}
    // Retrieve the GET parameters
    $params = $_GET;
    
    // Sort the parameters alphabetically by key
    ksort($params, SORT_STRING);
    
    // Build the sorted query string
    $sortedQueryString = http_build_query($params, '', '&');
    
    // Compute the HMAC hash using your API key
    $apiKey = 'YOUR PUBLISHER API KEY';
    $computedHash = hash_hmac('sha256', $sortedQueryString, $apiKey);
    
    // Compare with the header-provided hash
    if (isset($_SERVER['HTTP_X_AYETSTUDIOS_SECURITY_HASH']) &&
        $_SERVER['HTTP_X_AYETSTUDIOS_SECURITY_HASH'] === $computedHash) {
        // Valid signature: process the callback
    } else {
        // Invalid signature: reject the callback
    }
    import crypto from "crypto";
    
    // Retrieve the GET parameters from the request URL
    const url = new URL(request.url);
    const params = url.searchParams;
    
    // Sort the parameters alphabetically by key
    const sorted = new URLSearchParams(
      [...params.entries()].sort(([a], [b]) => a.localeCompare(b))
    );
    
    // Build the sorted query string
    const sortedQueryString = sorted.toString();
    
    // Compute the HMAC hash using your API key
    const apiKey = "YOUR PUBLISHER API KEY";
    const computedHash = crypto
      .createHmac("sha256", apiKey)
      .update(sortedQueryString)
      .digest("hex");
    
    // Compare with the header-provided hash
    const securityHash = request.headers.get("X-Ayetstudios-Security-Hash");
    if (securityHash === computedHash) {
      // Valid signature: process the callback
    } else {
      // Invalid signature: reject the callback
    }
    import hmac
    import hashlib
    from urllib.parse import urlparse, parse_qs, urlencode
    
    # Retrieve the GET parameters from the request URL
    params = parse_qs(urlparse(request.url).query, keep_blank_values=True)
    
    # Sort the parameters alphabetically by key and flatten values
    sorted_params = sorted(params.items())
    
    # Build the sorted query string
    sorted_query_string = urlencode([(k, v[0]) for k, v in sorted_params])
    
    # Compute the HMAC hash using your API key
    api_key = "YOUR PUBLISHER API KEY"
    computed_hash = hmac.new(
        api_key.encode(), sorted_query_string.encode(), hashlib.sha256
    ).hexdigest()
    
    # Compare with the header-provided hash
    security_hash = request.headers.get("X-Ayetstudios-Security-Hash")
    if security_hash == computed_hash:
        # Valid signature: process the callback
        pass
    else:
        # Invalid signature: reject the callback
        pass
    https://your-site.com/postback/?transaction_id=8ee08f32ae611231b0a49d1bd66e9bf193132561&amount=0.10&payout=1.50&user_id=testuser123456&click_id=1234abcd5678021&offer_name=TEST+OFFER 
    transaction_id=8ee08f32ae611231b0a49d1bd66e9bf193132561
    amount=0.10
    payout=1.50
    user_id=testuser123456
    click_id=1234abcd5678021
    offer_name=TEST OFFER
    amount=0.10&click_id=1234abcd5678021&offer_name=TEST+OFFER&payout=1.50&transaction_id=8ee08f32ae611231b0a49d1bd66e9bf193132561&user_id=testuser123456
    9f2228fea0d8e7ce10b2ac36053db14c
    62a32725866780ada1dec3d62232645f2801e05a91df7b0202e9b780f804f04b

    Android

    Surveywall

    Android

    Offerwall API

    Before you start with the integration, make sure you have:

    You can find more details here:

    To add the SDK to your project, simply update your build.gradle.kts file to add the following dependency:

    Once this has been added, sync your project to apply the changes:

    Add the following tag to your AndroidManifest.xml , just before the application tag:

    Example of completed AndroidManifest.xml:

    In this step, we will import and initialize the SDK in the main activity.

    First, import the library:

    Then, call the AyetSdk.init method:

    To show the offerwall, simply call the showOfferwall method:

    Learn about:

    • Setting up callbacks

    • IP Whitelists

    • Securing callbacks using HMAC Security Hash

    • Testing callbacks

    Click on the link below:

    To fetch a list of all offers in JSON format, simply call the getOffers method:

    The Reward Status page allows users to see their clicked and in-progress offers and allows users to request support / submit tickets. The reward status is also part of the offerwall and the surveywall. To show the reward status page stand-alone, simply call the showRewardStatus method:

    To show the surveywall, simply call the showSurveywall method:

    Set custom parameters for callbacks. Set up to 5 custom parameters.

    More information here:

    Additionally, you may optionally pass user age and gender to us. This can help us match users to the best and most appropriate offers for them.

    • When calling certain SDK methods, context must be passed. When passing context from onCreate for example, this will simply be this. If calling from elsewhere, the context will need to be provided from LocalContext.current.

    Android

    Updates History

    2025-12-02: v1.0.0 - Release the Android SDK v2

    Eligible Placement & AdSlot Combinations

    Offerwall

    dependencies {
        implementation("io.ayet:android-sdk-v2:1.0.3")
    }
    <uses-permission android:name="android.permission.INTERNET" />
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">
    
        <uses-permission android:name="android.permission.INTERNET" />
    
        <application
            android:allowBackup="true"
            android:dataExtractionRules="@xml/data_extraction_rules"
            android:fullBackupContent="@xml/backup_rules"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/Theme.AyetSDKExample">
            <activity
                android:name=".MainActivity"
                android:exported="true"
                android:label="@string/app_name"
                android:theme="@style/Theme.AyetSDKExample">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    </manifest>
    import com.ayet.sdk.AyetSdk                
    class MainActivity : ComponentActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            enableEdgeToEdge()
    
            AyetSdk.init(this, YOUR_PLACEMENT_ID, "USER_EXTERNAL_IDENTIFIER")
    
            setContent {
                AyetSDKExampleTheme {
                    Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
                        MainScreen(modifier = Modifier.padding(innerPadding))
                    }
                }
            }
        }
    }
    val context = LocalContext.current
    AyetSdk.showOfferwall(context, "YOUR_OFFERWALL_ADSLOT_NAME")
    AyetSdk.getOffers("YOUR_OFFERWALL_API_ADSLOT_NAME") { offersJson ->
        if (offersJson != null) {
            Log.d("MainActivity", "Offers received: $offersJson")
        } else {
            Log.w("MainActivity", "Failed to get offers - null response")
        }
    }
    val context = LocalContext.current
    AyetSdk.showRewardStatus(context)
    val context = LocalContext.current
    AyetSdk.showSurveywall(context, "YOUR_SURVEYWALL_ADSLOT_NAME")
    AyetSdk.setTrackingCustom1("custom1")
    AyetSdk.setTrackingCustom2("custom2")
    AyetSdk.setTrackingCustom3("custom3")
    AyetSdk.setTrackingCustom4("custom4")
    AyetSdk.setTrackingCustom5("custom5")
    AyetSdk.setGender(Gender.MALE)
    AyetSdk.setGender(Gender.FEMALE)
    AyetSdk.setAge(25)

    If you integrate the Android SDK while using a different Placement & AdSlot combination in the ayeT-Studios dashboard, you won't be able to initialize the SDK.

    Demo App

    Getting Started

    Make sure to use the correct package name that you intend to use for your final app. Alternatively, create a test placement with a different package name that matches the package name of your test app.

    If package name of your placement and your actual app don't match, you can't initialize the SDK.

    Adding the SDK Dependency

    Add the internet permission to AndroidManifest

    Import and initialize the SDK

    Note: The externalIdentifier passed in the init call is the user's identifier on your end. This will be accessible in the conversion callbacks through the {external_identifier} parameter. The placementId is the unique ID assigned to your placement when it's created through our dashboard.

    Show the Offerwall

    The YOUR_OFFERWALL_ADSLOT_NAME parameter can be found by clicking on the adslot on your dashboard. This is only available on Offerwall adslots.

    Conversion Callbacks & Currency Handling

    Additional Methods

    Fetch Offers

    The YOUR_OFFERWALL_API_ADSLOT_NAME parameter can be found by clicking on the adslot on your dashboard. This is only available on Offerwall API adslots.

    Show Reward Status

    Show the Surveywall

    The YOUR_SURVEYWALL_ADSLOT_NAME parameter can be found by clicking on the adslot on your dashboard. This is only available on Surveywall adslots.

    Set custom parameters

    Note: Custom parameters must also be added to your callback URL to receive them in your S2S callbacks.

    Set Age and Gender

    Notes

    πŸ–₯️Dashboard Setup
    πŸ’‘Callbacks & Testing
    Offerwall Callbacks

    Android

    Surveywall

    Android

    Offerwall API

    Before you start with the integration, make sure you have:

    You can find more details here:

    To add the SDK to your project, simply update your build.gradle.kts file to add the following dependency:

    Once this has been added, sync your project to apply the changes:

    Add the following tag to your AndroidManifest.xml , just before the application tag:

    Example of completed AndroidManifest.xml:

    In this step, we will import and initialize the SDK in the main activity.

    First, import the library:

    Then, call the AyetSdk.init method:

    To show the surveywall, simply call the showSurveywall method:

    Learn about:

    • Setting up callbacks

    • IP Whitelists

    • Securing callbacks using HMAC Security Hash

    • Testing callbacks

    Click on the link below:

    To show the offerwall, simply call the showOfferwall method:

    To fetch a list of all offers in JSON format, simply call the getOffers method:

    The Reward Status page allows users to see their clicked and in-progress offers and allows users to request support / submit tickets. The reward status is also part of the offerwall and the surveywall. To show the reward status page stand-alone, simply call the showRewardStatus method:

    Set custom parameters for callbacks. Set up to 5 custom parameters.

    More information here:

    Additionally, you may optionally pass user age and gender to us. This can help us match users to the best and most appropriate offers for them.

    • When calling certain SDK methods, context must be passed. When passing context from onCreate for example, this will simply be this. If calling from elsewhere, the context will need to be provided from LocalContext.current.

    Android

    Updates History

    2025-12-02: v1.0.0 - Release the Android SDK v2

    Eligible Placement & AdSlot Combinations

    Offerwall

    dependencies {
        implementation("io.ayet:android-sdk-v2:1.0.3")
    }
    <uses-permission android:name="android.permission.INTERNET" />
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">
    
        <uses-permission android:name="android.permission.INTERNET" />
    
        <application
            android:allowBackup="true"
            android:dataExtractionRules="@xml/data_extraction_rules"
            android:fullBackupContent="@xml/backup_rules"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/Theme.AyetSDKExample">
            <activity
                android:name=".MainActivity"
                android:exported="true"
                android:label="@string/app_name"
                android:theme="@style/Theme.AyetSDKExample">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    </manifest>
    import com.ayet.sdk.AyetSdk                
    class MainActivity : ComponentActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            enableEdgeToEdge()
    
            AyetSdk.init(this, YOUR_PLACEMENT_ID, "USER_EXTERNAL_IDENTIFIER")
    
            setContent {
                AyetSDKExampleTheme {
                    Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
                        MainScreen(modifier = Modifier.padding(innerPadding))
                    }
                }
            }
        }
    }
    val context = LocalContext.current
    AyetSdk.showSurveywall(context, "YOUR_SURVEYWALL_ADSLOT_NAME")
    val context = LocalContext.current
    AyetSdk.showOfferwall(context, "YOUR_OFFERWALL_ADSLOT_NAME")
    AyetSdk.getOffers("YOUR_OFFERWALL_API_ADSLOT_NAME") { offersJson ->
        if (offersJson != null) {
            Log.d("MainActivity", "Offers received: $offersJson")
        } else {
            Log.w("MainActivity", "Failed to get offers - null response")
        }
    }
    val context = LocalContext.current
    AyetSdk.showRewardStatus(context)
    AyetSdk.setTrackingCustom1("custom1")
    AyetSdk.setTrackingCustom2("custom2")
    AyetSdk.setTrackingCustom3("custom3")
    AyetSdk.setTrackingCustom4("custom4")
    AyetSdk.setTrackingCustom5("custom5")
    AyetSdk.setGender(Gender.MALE)
    AyetSdk.setGender(Gender.FEMALE)
    AyetSdk.setAge(25)

    If you integrate the Android SDK while using a different Placement & AdSlot combination in the ayeT-Studios dashboard, you won't be able to initialize the SDK.

    Demo App

    Getting Started

    Make sure to use the correct package name that you intend to use for your final app. Alternatively, create a test placement with a different package name that matches the package name of your test app.

    If package name of your placement and your actual app don't match, you can't initialize the SDK.

    Adding the SDK Dependency

    Add the internet permission to AndroidManifest

    Import and initialize the SDK

    Note: The externalIdentifier passed in the init call is the user's identifier on your end. This will be accessible in the conversion callbacks through the {external_identifier} parameter. The placementId is the unique ID assigned to your placement when it's created through our dashboard.

    Show the Surveywall

    The YOUR_SURVEYWALL_ADSLOT_NAME parameter can be found by clicking on the adslot on your dashboard. This is only available on Surveywall adslots.

    Conversion Callbacks & Currency Handling

    Additional Methods

    Show the Offerwall

    The YOUR_OFFERWALL_ADSLOT_NAME parameter can be found by clicking on the adslot on your dashboard. This is only available on Offerwall adslots.

    Fetch Offers

    The YOUR_OFFERWALL_API_ADSLOT_NAME parameter can be found by clicking on the adslot on your dashboard. This is only available on Offerwall API adslots.

    Show Reward Status

    Set custom parameters

    Note: Custom parameters must also be added to your callback URL to receive them in your S2S callbacks.

    Set Age and Gender

    Notes

    πŸ–₯️Dashboard Setup
    πŸ’‘Callbacks & Testing
    Offerwall Callbacks

    Web Surveywall

    Technically, the Surveywall has to be implemented by opening a new browser tab or loading the Surveywall link inside an iframe.

    This type of Web Surveywall is intended to be called directly in an actual browser and is not very well suited for webview (in-app) integration.

    For in-app integrations, please take a look at our seamless In-App integrations by checking out our available SDKs, Wrappers and Plugins.

    Platform
    Integration Best Practise
    Surveys

    Desktop

    Open the web surveywall in a new tab or iframe.

    The web surveywall shows surveys to the user.

    Mobile Web

    Before you start with the integration, make sure you:

    You will find more details here:

    The URL template for our web surveywall looks like this:

    To retrieve the URL for one of your web surveywall adslots, click on "Edit" next to an AdSlot under Placements / Apps and retrieve the Integration URL in the modal.

    URL Parameters:

    Parameter
    Mandatory
    Description

    external_identifier

    yes

    Your identifier for the calling user - this is mandatory and allows you to attribute our Server2Server conversion callbacks to a specific user (returned in {uid})

    custom_1

    no

    Learn about:

    • Setting up callbacks

    • IP Whitelists

    • Securing callbacks using HMAC Security Hash

    • Testing callbacks

    Click on the link below:

    Website

    Eligible Placement & AdSlot Combinations

    Web Surveywall

    https://surveys.ayet.io/surveys?adSlot=ADSLOT_ID&external_identifier={YOUR_USER_IDENTIFIER}

    If you integrate the Web Surveywall while using a different Placement & AdSlot combination in the ayeT-Studios dashboard, you won't be able to initialize the Surveywall.

    Utilization for Desktop, Mobile Web & In-App

    The Web Surveywall can nevertheless be used in-app if you follow a few guidelines

    • Your placement has to be a "Website" placement

    • You have to link out of your app to open the Web Surveywall in a mobile browser

    Integration Best Practices

    Getting Started

    Your Web Survewall Link - Mandatory Parameters

    Conversion Callbacks & Currency Handling

    πŸ–₯️Dashboard Setup
    πŸ’‘Callbacks & Testing
    ayeT-Studios - Dashboard Loginwww.ayetstudios.com
    ayeT-Studios - Dashboard Loginwww.ayetstudios.com
    ayeT-Studios - Dashboard Loginwww.ayetstudios.com
    ayeT-Studios - Dashboard Loginwww.ayetstudios.com
    ayeT-Studios - Dashboard Loginwww.ayetstudios.com
    ayeT-Studios - Dashboard Loginwww.ayetstudios.com

    iOS SDK

    The iOS SDK allows you to easily monetize your app and reward your users with in-app currency. Your users get access to our offerwalls, allowing them to earn currency for completing offers.

    2024-08-02: v1.7.2 - Updated documentation to replace plist.info new Xcode 13 Info settings, and add up-to-date Xcode screenshots.

    2020-08-11: v1.7.1 - Updated documentation to introduce new parameters to differentiate chargebacks from conversions

    2020-07-29: v1.7 - Updated iOS SDK to xcframework, support for Xcode 12, Swift 5.x, iOS 11+, dropped ARMv7 support

    2019-10-20: v1.6 - Updated iOS SDK to Xcode 11, iOS 13 SDK, Swift 5.1, full binary support

    Eligible Placement & AdSlot Combinations

    The below table shows all Placement & AdSlot Type combinations that allow you to utilize the Android SDK integration.

    Placement Type
    AdSlot Type
    Eligible Integration Type

    iOS App

    Before you start with the integration, make sure you have:

    You will find more details here:

    You can download the lastest version of our publisher library here:

    Unzip the downloaded xcframework archive file, preferably somewhere in your project root.

    Navigate to your project root in the Project Navigator, select General tab and then expand Frameworks, Libraries, and Embedded Content.

    Click on the + sign and add the archive to your project (using select files), then make sure the Embed option is set to Embed & Sign. The final configuration should look like this:

    Then, still in your project root in the Project Navigator, select Info tab and expand Custom iOS Target Properties. Right click and select Add Row, and add App Transport Security Settings. Then click on the newly added row, select Add Row again, and add the Allow Arbitrary Loads option. Make sure this is set to YES:

    You'll need to initialize ayeT SDK before being able to use it. A good place to do this is the application:didFinishLaunchingWithOptions: method in your application delegate:

    If you want to spend user currency, for example if the user clicks a button assigned to a purchaseInAppItem function, you can utilize the deductBalance function:

    After initializing the SDK, you can check the current user balances anywhere in your code:

    Showing the offerwall is straight-forward, you can simply call showOfferwall from your UIViewController:

    If you want to see logs in Xcode debug area, simply call sdkLogEnable before initializing sdk.

    Learn about:

    • Setting up callbacks

    • IP Whitelists

    • Securing callbacks using HMAC Security Hash

    Click on the link below:

    Flutter Wrapper (v2)

    The Flutter Wrapper lets you easily monetize your app and reward your users with in-app currency. Your users get access to our offers and surveys, allowing them to earn rewards for completing offers.

    2025-12-19: v1.0.0 - Release the Flutter Wrapper for V2 of the SDK

    Eligible Placement & AdSlot Combinations

    The table below shows all Placement & AdSlot Type combinations that allow you to utilize the Flutter integration.

    Placement Type
    AdSlot Type

    Android/iOS

    Before you start with the integration, make sure you have:

    You can find more details here:

    Add to your pubspec.yaml:

    Once this has been added, run flutter pub get to fetch the package.

    Add the following tag to your AndroidManifest.xml , just before the application tag:

    Example of completed AndroidManifest.xml:

    Enable Swift Package Manager:

    Then run flutter build ios to fetch dependencies.

    The externalIdentifier is your user's ID, accessible in conversion callbacks via {external_identifier}. The placementId is found in your dashboard.

    To show the surveywall, simply call the showSurveywall method:

    Learn about:

    • Setting up callbacks

    • IP Whitelists

    • Securing callbacks using HMAC Security Hash

    • Testing callbacks

    Click on the link below:

    To show the offerwall, simply call the showOfferwall method:

    To fetch a list of all offers in JSON format, simply call the getOffers method:

    The Reward Status page allows users to see their clicked and in-progress offers and allows users to request support / submit tickets. The reward status is also part of the offerwall and the surveywall. To show the reward status page stand-alone, simply call the showRewardStatus method:

    Set custom parameters for callbacks. Set up to 5 custom parameters.

    More information here:

    Additionally, you may optionally pass user age and gender to us. This can help us match users to the best and most appropriate offers for them.

    Flutter Wrapper (v2)

    The Flutter Wrapper lets you easily monetize your app and reward your users with in-app currency. Your users get access to our offers and surveys, allowing them to earn rewards for completing offers.

    2025-12-19: v1.0.0 - Release the Flutter Wrapper for V2 of the SDK

    Eligible Placement & AdSlot Combinations

    The table below shows all Placement & AdSlot Type combinations that allow you to utilize the Flutter integration.

    Placement Type
    AdSlot Type

    Android/iOS

    Before you start with the integration, make sure you have:

    You can find more details here:

    Add to your pubspec.yaml:

    Once this has been added, run flutter pub get to fetch the package.

    Add the following tag to your AndroidManifest.xml , just before the application tag:

    Example of completed AndroidManifest.xml:

    Enable Swift Package Manager:

    Then run flutter build ios to fetch dependencies.

    The externalIdentifier is your user's ID, accessible in conversion callbacks via {external_identifier}. The placementId is found in your dashboard.

    To show the offerwall, simply call the showOfferwall method:

    Learn about:

    • Setting up callbacks

    • IP Whitelists

    • Securing callbacks using HMAC Security Hash

    • Testing callbacks

    Click on the link below:

    To fetch a list of all offers in JSON format, simply call the getOffers method:

    The Reward Status page allows users to see their clicked and in-progress offers and allows users to request support / submit tickets. The reward status is also part of the offerwall and the surveywall. To show the reward status page stand-alone, simply call the showRewardStatus method:

    To show the surveywall, simply call the showSurveywall method:

    Set custom parameters for callbacks. Set up to 5 custom parameters.

    More information here:

    Additionally, you may optionally pass user age and gender to us. This can help us match users to the best and most appropriate offers for them.

    VAST Tags

    You can bring your own VAST Tag Demand to our Ad Server solution to make direct deals with preferred partners in order to increase your overall eCPMs.

    Attribute
    Type
    Description

    {external_identifier}

    string

    Unique User ID passed to the Video SDK for each user.

    Offerwall - Gametastic - Logo Kit.zipGoogle Docs
    Surveywall - Polltastic - Logo Kit.zipGoogle Docs
    Rewarded Video - Tubetastic - Logo Kit.zipGoogle Docs
    ayeT-Studios Publisher API Documentationwww.ayetstudios.com

    Rewarded Video Callbacks

    To handle video conversions with S2S Callbacks, first make sure your callback URL is setup correctly in your publisher placement. To do so, navigate to Placements / Apps, edit your placement and set the Callback Url to your server's postback url:

    Also make sure that "Send S2S Callbacks" for video views is enabled for your Rewarded Video AdSlot in "AdSlot Details" > "Overview".

    If this is the callback url you set for your placement:

    A typical conversion callback sent by our server will look like this:

    ayeT-Studios - Dashboard Loginwww.ayetstudios.com
    ayeT-Studios - Dashboard Loginwww.ayetstudios.com
    ayeT-Studios - Dashboard Loginwww.ayetstudios.com
    ayeT-Studios - Dashboard Loginwww.ayetstudios.com
    ayeT-Studios - Dashboard Loginwww.ayetstudios.com
    ayeT-Studios - Dashboard Loginwww.ayetstudios.com
    ayeT-Studios - Dashboard Loginwww.ayetstudios.com
    ayeT-Studios - Dashboard Loginwww.ayetstudios.com
    ayeT-Studios - Dashboard Loginwww.ayetstudios.com
    ayeT-Studios - Dashboard Loginwww.ayetstudios.com
    ayeT-Studios - Dashboard Loginwww.ayetstudios.com
    ayeT-Studios - Dashboard Loginwww.ayetstudios.com
    ayeT-Studios Advertiser API Documentationwww.ayetstudios.com

    Please follow the Integration Best Practises.

    Open the web surveywall in a new tab or iframe.

    The web surveywall adjusts its layout if users access via a mobile device. E.g. for accessing via an Android device, users will see a single column layout as oposed to a two-column layout like for desktop.

    In-App

    Create a button in your app that leads users into their mobile browser and into the ayeT-Studios Web Surveywall.

    The web surveywall shows eligible surveys to the user in a mobile optimized layout.

    Custom parameter you can pass to the Surveywall Entry Link in the form of: &custom_1={YOUR_CUSTOM_PARAMETER}

    You can get this variable back via conversion callbacks

    custom_2

    no

    Custom parameter you can pass to the Surveywall Entry Link in the form of: &custom_2={YOUR_CUSTOM_PARAMETER}

    You can get this variable back via conversion callbacks

    custom_3

    no

    Custom parameter you can pass to the Surveywall Entry Link in the form of: &custom_3={YOUR_CUSTOM_PARAMETER}

    You can get this variable back via conversion callbacks

    custom_4

    no

    Custom parameter you can pass to the Surveywall Entry Link in the form of: &custom_4={YOUR_CUSTOM_PARAMETER}

    You can get this variable back via conversion callbacks

    custom_5

    no

    Custom parameter you can pass to the Surveywall Entry Link in the form of: &custom_5={YOUR_CUSTOM_PARAMETER}

    You can get this variable back via conversion callbacks

    {device_uuid}

    string

    ayeT-Studios internal device identificator

    {device_make}

    string

    Device manufacturer

    {device_model}

    string

    Device model

    {device_ifa}

    string

    Device advertising id (GAID/IDFA) if known, otherwise empty

    {device_os}

    string

    Device os

    {device_osv}

    string

    Device os version

    {country}

    string

    Country from which the ad request is made.

    {ip}

    string

    IP address from which the ad request is made.

    {ua}

    string

    User Agent from which the ad request is made.

    {cat}

    string array

    Array of IAB content categories of the site.

    {bcat}

    string array

    Array of Blocked IAB content categories of the site.

    {site_name}

    string

    Site name / Placement name as set up in the ayeT dashboard by the publisher .

    {site_domain}

    string

    Domain of the site (e.g., "sub.foobar.com")

    {site_url}

    string

    URL of the site (e.g., "https://sub.foobar.com/abc")

    {site_url_encoded}

    string

    Encoded URL of the site (e.g., "https%3A%2F%2Fsub.foobar.com%2Fabc")

    {app_bundle}

    string

    A platform-specific application identifier intended to be unique to the app and independent of the exchange. On Android, this should be a bundle or package name (e.g., com.foo.mygame). On iOS, it is typically a numeric ID.

    {app_name}

    string

    App name / Placement name as set up in the ayeT dashboard by the publisher.

    {app_storeurl}

    string

    App store URL for an installed app.

    {app_storeurl_encoded}

    string

    Encoded app store URL for an installed app.

    {cmp_available}

    int

    1 if a CMP was detected, 0 if not

    {tc_string}

    string

    Tcf Consent String received from the CMP

    {gdpr_applies}

    int

    1 if the user is from a county where the GDPR applies, 0 if not

    {ts}

    int

    Unix timestamp

    {uid_criteo}

    string

    Macro for passing an external / share User ID from our integrated partner Criteo

    Logo
    Logo
    Logo
    Logo
    Logo
    Logo
    Logo
    Logo
    Logo
    Logo
    Logo
    Logo
    Logo
    Logo
    Logo
    Logo
    Logo
    Logo
    Logo
    Testing callbacks
    2019-07-19: v1.5 - Updated iOS SDK with adslot changes, recompiled with Swift 5, re-added x86_64 (simulator) support

    2018-09-29: v1.4.2 - Updated iOS SDK to Xcode 10 and Swift 4.2, stripped debug symbols

    2018-07-09: v1.4.1 - Removed Simulator Code from iOS SDK, fixed iTunes validation issues with Xcode 9+

    2018-05-07: v1.4 - Framework recompiled with Swift 4.1

    2018-03-08: v1.3 - You are able to use logs now in order to locate implementation problems

    2018-01-20: v1.2 - Added functions that provide current user balances

    2017-12-06: v1.0 - Initial Release of our Publisher SDK (iOS)

    Offerwall

    iOS SDK

    If you integrate the iOS SDK while using a different Placement & AdSlot combination in the ayeT-Studios dashboard, you won't be able to initialize the Offerwall.

    Getting Started

    Make sure to use the correct package name that you intend to use for your final app.

    Or create a test placement with a different package name that matches the package name of your test app.

    If package name of your placement and your actuall app don't match, you can't initialize the Offerwall.

    Download the Library

    Add the library to your Xcode project

    Initialize the SDK & Managed User Balances

    The status string will be "success" if the balance deduction was successful or "failed" if something went wrong (e.g. insufficient user balance).

    Attention: The username or external identifier passed in the init call (e.g. username, hashed email address, etc.) will be accessible in the conversion callbacks through the {external_identifier} parameter.

    Check User Balances (Managed Currency Handling)

    Show the Offerwall

    showOfferwall starts our offerwall activity for the given adslot and displays available tasks for the user to complete.

    Logs

    Conversion Callbacks & Currency Handling

    Updates History

    πŸ–₯️Dashboard Setup
    πŸ’‘Callbacks & Testing
    257KB
    AyetStudiosSdk_v1.7.xcframework.zip
    archive
    Open
    import AyetStudiosSDK
    [...]
    AyetSdk.sdkInit(appKey: "<your placement identifier from our dashboard>" , userIdentifier: "username (external identifier)" , callback: { available_currency , pending_currency , spent_currency in
        print("Available currency:  \(available_currency)")
        print("Pending currency:    \(pending_currency)")
        print("Spent currency:      \(spent_currency)")
    });
    @IBAction func purchaseInAppItem(_ sender: Any) {
    
        let deductAmount = 5
    
        AyetSdk.deductBalance(amount: deductAmount , deductCallback: {callback in
    
            if (callback.caseInsensitiveCompare("success") == .orderedSame) {
                print("Deduct response is successful");
                // TODO: activate the purchased content
            }
            else {
                print("Deduct response is unsuccessful");
                // this usually means that the user does not have sufficient balance in his account
            }
        })
    
    }	         
    AyetSdk.getAvailableCurrency();
    
    AyetSdk.getPendingCurrency();
    
    AyetSdk.getSpentCurrency();	  
    /AyetSdk.showOfferwall(currentController: self, adslotName: "my offerwall adslot name");	  
    AyetSdk.sdkLogEnable();	  
    Variable
    Type
    Description

    {transaction_id}

    string

    Unique transaction id - use for duplicate checks.

    {payout_usd}

    float

    The actual conversion payout in USD.

    https://your-server.com/callback?network=ayetstudios&amount={currency_amount}&external_identifier={external_identifier}&payout_usd={payout_usd}&adslot_id={adslot_id}
    https://your-server.com/callback?network=ayetstudios&amount=10&external_identifier=username&payout_usd=0.007&adslot_id=16

    Adding your Callback URL

    This assumes you set externalIdentifier to username when calling AyetVideoSdk.init(...), the currency amount per view was set to 10 in your rewarded video adslot #16 and the delivered video had an eCPM of $7.00.

    Hint: If you send callbacks from multiple different adslots (e.g. rewarded_video and offerwall) make sure to pass and validate {adslot_id} in your callback URL to determine if the conversion was a normal offer or a rewarded video.

    Important: Your server must always reply with an HTTP 200 status code to our postbacks. Otherwise we will resend the postback 12 times over a span of one hour before giving up.

    Available Macros for Callback URLs:

    Note: If the parsing capabilities of your callback endpoint are limited, each of the parameters below is also available in a sanitized version. By suffixing any of the parameters below with _sanitized (for example {external_identifier_sanitized}), any character that is not in 0-9 a-z A-Z - _ will be removed. Whitespaces will be replaced by underscores.

    Important: To ensure each conversion is granted only once to your users, always use {transaction_id}. Occasional callback resends may occur for various reasons. Utilizing {transaction_id} prevents granting conversions more than once.

    Offerwall

    Android/iOS

    Surveywall

    Android/iOS

    Offerwall API

    dependencies:
      ayet_sdk_v2: ^1.0.4
    <uses-permission android:name="android.permission.INTERNET" />
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">
    
        <uses-permission android:name="android.permission.INTERNET" />
    
        <application
            android:allowBackup="true"
            android:dataExtractionRules="@xml/data_extraction_rules"
            android:fullBackupContent="@xml/backup_rules"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/Theme.AyetSDKExample">
            <activity
                android:name=".MainActivity"
                android:exported="true"
                android:label="@string/app_name"
                android:theme="@style/Theme.AyetSDKExample">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    </manifest>
    flutter config --enable-swift-package-manager
    import 'package:ayet_sdk_v2/ayet_sdk_v2.dart';
    
    final sdk = AyetSdkV2();
    
    // Initialize with your placement ID and user identifier
    await sdk.init(
      placementId: YOUR_PLACEMENT_ID,
      externalIdentifier: 'USER_EXTERNAL_IDENTIFIER',
    );
    await sdk.showSurveywall('YOUR_SURVEYWALL_ADSLOT_NAME');
    await sdk.showOfferwall('YOUR_OFFERWALL_ADSLOT_NAME');
    final offersJson = await sdk.getOffers('YOUR_OFFERWALL_API_ADSLOT_NAME');
    await sdk.showRewardStatus();
    await sdk.setTrackingCustom1('custom1');
    await sdk.setTrackingCustom2('custom2');
    await sdk.setTrackingCustom3('custom3');
    await sdk.setTrackingCustom4('custom4');
    await sdk.setTrackingCustom5('custom5');
    await sdk.setAge(25);
    await sdk.setGender(AyetGender.male);
    await sdk.setGender(AyetGender.female);

    If you integrate the Flutter wrapper while using a different Placement & AdSlot combination in the ayeT-Studios dashboard, you won't be able to initialize the SDK.

    Demo App

    Getting Started

    Make sure to use the correct package name that you intend to use for your final app. Alternatively, create a test placement with a different package name that matches the package name of your test app.

    If package name of your placement and your actual app don't match, you can't initialize the SDK. Note that your package name may be different on iOS and Android for the same Flutter app.

    Adding the SDK Dependency

    Android Setup

    iOS Setup

    Import and initialize the SDK

    Show the Surveywall

    The YOUR_SURVEYWALL_ADSLOT_NAME parameter can be found by clicking on the adslot on your dashboard. This is only available on Surveywall adslots.

    Conversion Callbacks & Currency Handling

    Additional Methods

    Show the Offerwall

    The YOUR_OFFERWALL_ADSLOT_NAME parameter can be found by clicking on the adslot on your dashboard. This is only available on Offerwall adslots.

    Fetch Offers

    The YOUR_OFFERWALL_API_ADSLOT_NAME parameter can be found by clicking on the adslot on your dashboard. This is only available on Offerwall API adslots.

    Show Reward Status

    Set custom parameters

    Note: Custom parameters must also be added to your callback URL to receive them in your S2S callbacks.

    Set Age and Gender

    Updates History

    πŸ–₯️Dashboard Setup
    πŸ’‘Callbacks & Testing
    Offerwall Callbacks

    Offerwall

    Android/iOS

    Surveywall

    Android/iOS

    Offerwall API

    dependencies:
      ayet_sdk_v2: ^1.0.4
    <uses-permission android:name="android.permission.INTERNET" />
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">
    
        <uses-permission android:name="android.permission.INTERNET" />
    
        <application
            android:allowBackup="true"
            android:dataExtractionRules="@xml/data_extraction_rules"
            android:fullBackupContent="@xml/backup_rules"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/Theme.AyetSDKExample">
            <activity
                android:name=".MainActivity"
                android:exported="true"
                android:label="@string/app_name"
                android:theme="@style/Theme.AyetSDKExample">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    </manifest>
    flutter config --enable-swift-package-manager
    import 'package:ayet_sdk_v2/ayet_sdk_v2.dart';
    
    final sdk = AyetSdkV2();
    
    // Initialize with your placement ID and user identifier
    await sdk.init(
      placementId: YOUR_PLACEMENT_ID,
      externalIdentifier: 'USER_EXTERNAL_IDENTIFIER',
    );
    await sdk.showOfferwall('YOUR_OFFERWALL_ADSLOT_NAME');
    final offersJson = await sdk.getOffers('YOUR_OFFERWALL_API_ADSLOT_NAME');
    await sdk.showRewardStatus();
    await sdk.showSurveywall('YOUR_SURVEYWALL_ADSLOT_NAME');
    await sdk.setTrackingCustom1('custom1');
    await sdk.setTrackingCustom2('custom2');
    await sdk.setTrackingCustom3('custom3');
    await sdk.setTrackingCustom4('custom4');
    await sdk.setTrackingCustom5('custom5');
    await sdk.setAge(25);
    await sdk.setGender(AyetGender.male);
    await sdk.setGender(AyetGender.female);

    If you integrate the Flutter wrapper while using a different Placement & AdSlot combination in the ayeT-Studios dashboard, you won't be able to initialize the SDK.

    Demo App

    Getting Started

    Make sure to use the correct package name that you intend to use for your final app. Alternatively, create a test placement with a different package name that matches the package name of your test app.

    If package name of your placement and your actual app don't match, you can't initialize the SDK. Note that your package name may be different on iOS and Android for the same Flutter app.

    Adding the SDK Dependency

    Android Setup

    iOS Setup

    Import and initialize the SDK

    Show the Offerwall

    The YOUR_OFFERWALL_ADSLOT_NAME parameter can be found by clicking on the adslot on your dashboard. This is only available on Offerwall adslots.

    Conversion Callbacks & Currency Handling

    Additional Methods

    Fetch Offers

    The YOUR_OFFERWALL_API_ADSLOT_NAME parameter can be found by clicking on the adslot on your dashboard. This is only available on Offerwall API adslots.

    Show Reward Status

    Show the Surveywall

    The YOUR_SURVEYWALL_ADSLOT_NAME parameter can be found by clicking on the adslot on your dashboard. This is only available on Surveywall adslots.

    Set custom parameters

    Note: Custom parameters must also be added to your callback URL to receive them in your S2S callbacks.

    Set Age and Gender

    Updates History

    πŸ–₯️Dashboard Setup
    πŸ’‘Callbacks & Testing
    Offerwall Callbacks
    ayeT-Studios Publisher API Documentationwww.ayetstudios.com
    ayeT-Studios Publisher API Documentationwww.ayetstudios.com
    Logo
    GitHub - ayetstudios/ios-sdk-v2-demo-app: A demo app for the ayeT-Studios iOS SDK v2GitHub
    GitHub - ayetstudios/ios-sdk-v2-demo-app: A demo app for the ayeT-Studios iOS SDK v2GitHub
    ayeT-Studios Publisher API Documentationwww.ayetstudios.com

    {currency_amount}

    float

    The amount of currency the user earned (taken from your offerwall currency configuration).

    {external_identifier}

    string

    The user identifier (EXTERNAL IDENTIFIER) originally passed in the web offerwall link

    {user_id}

    integer

    Our internal id for this offerwall user

    {placement_identifier}

    string

    The placement_identifier for which the conversion occured

    {adslot_id}

    int

    The ID of the adslot for which the conversion occured

    {sub_id}

    string

    The ID of the Placement for which the conversion occured [PL-1...n]

    {ip}

    string

    Converting device's IP address if known, 0.0.0.0 otherwise

    {offer_id}

    int

    Offer ID of the converting offer

    {offer_name}

    string

    Name / title of the converting offer

    {device_uuid}

    string

    ayeT-Studios internal device identificator

    {device_make}

    string

    Device manufacturer

    {device_model}

    string

    Device model

    {advertising_id}

    string

    Device advertising id (GAID/IDFA) if known, otherwise empty

    {sha1_android_id}

    string

    Device sha1 hashed android id if known, otherwise empty

    {sha1_imei}

    string

    Device sha1 hashed imei if known, otherwise empty

    {currency_identifier}

    string

    Shows virtual currency name as set in adslot.

    {currency_conversion_rate}

    decimal

    Shows currency conversion rate used to calculate user currency for the given conversion.

    {custom_1}

    string

    Custom parameter to pass variables to the conversion callbacks

    {custom_2}

    string

    Custom parameter to pass variables to the conversion callbacks

    {custom_3}

    string

    Custom parameter to pass variables to the conversion callbacks

    {custom_4}

    string

    Custom parameter to pass variables to the conversion callbacks

    {custom_5}

    string

    Custom parameter to pass variables to the conversion callbacks

    Logo
    Logo
    Logo
    ayeT-Studios Publisher API Documentationwww.ayetstudios.com

    Android SDK

    The Android SDK allows you to easily monetize your app and reward your users with in-app currency. Your users get access to our offerwalls, allowing them to earn currency for completing offers.

    The table below shows all Placement & AdSlot Type combinations that allow you to utilize the Android SDK integration.

    Placement Type
    AdSlot Type
    Eligible Integration Type

    Surveywall Callbacks

    You can configure a conversion callback URL in our publisher dashboard. To do so, navigate to Placements / Apps, edit your placement and set the Callback URL to your server's postback URL:

    If this is the callback URL you set for your offerwall placement:

    A typical conversion callback sent by our server will look like this:

    You can automatically process Reversals made to your account and placements by enabling Reversal Callbacks.

    Simply navigate to Placements / Apps, edit your placement and check the box Enable Reversal Callbacks.

    Offerwall

    Android SDK

    Before you start with the integration, make sure you have:

    You will find more details here:

    The integration is simple and allows both managed and unmanaged user balances / currencies.

    A managed user balance / currency is a user balance that is stored on our servers. We store user information and the amount of virtual currency a user owns. You can use balance listeners to manage the amount of currency each user has on our servers.

    An unmanaged user balance / currency is a user balance that is stored on your servers. You receive callbacks and handle user wallets yourself.

    You can download the lastest version of our publisher library here:

    Copy the downloaded jar library to your Android Studio project (in the app/libs/ folder). Go to "Module Settings" (F12 or right-click your app in the Project View) and check the dependencies tab to make sure the library is added as a file dependency and set to "Compile":

    Afterwards open your AndroidManifest.xml and add our offerwall activity to your application scope:

    Another AndroidManifest.xml requirement is your AYET_APP_KEY which you can fetch from our publisher dashboard in your placement or adslot details - add it to the application scope as well:

    Also make sure to check your permissions in the AndroidManifest.xml:

    In this step, we are going to initialize the SDK in the main activity. We also use callbacks to track the user's account balance - this is optional and not required if you're planning to manage user balances on your own servers.

    If you want to make sure the SDK has been initialized and is ready to display the Offerwall or video ads, you can use the following function:

    If you want to spend user currency, for example if the user clicks a "purchaseInAppItem" button, you can utilize the deductUserBalance function:

    Showing the offerwall for an offerwall adslot is straight-forward, you can simply call showOfferwall from any Activity:

    showOfferwall starts the offerwall activity for the adslot you pass as second parameter and displays available tasks for the user to complete.

    If you're going to use Proguard in your release build to obfuscate your application, make sure to add the following rules to your proguard-rules.pro files:

    Learn about:

    • Setting up callbacks

    • IP Whitelists

    • Securing callbacks using HMAC Security Hash

    • Testing callbacks

    Click on the link below:

    Updates History

    2024-08-16: v3.6 - Removed documentation for deprecated "Native Offer Feed" functionality. Recommended replacement is client or server side "Offerwall API".

    2022-04-12: v3.6 - Updated SDK to Android Api 30 (Android 11) and restored compliance with updated privacy requirements

    2022-02-11: v3.5.2 - Removed Rewarded Video from documentation

    2020-08-11: v3.5.1 - Updated documentation to introduce new parameters to differentiate chargebacks from conversions

    2020-07-29: v3.5 - Improved UI / handling, removed deprecated INSTALL_REFERRER, performance improvements and bug fixes

    2019-08-20: v3.4 - Updated Android SDK to support decimal places in payouts (currency amount) for native offers

    2019-07-19: v3.3 - Updated Android SDK and documentation to reflect the adslot changes 2019-06-21: v3.2 - Native Offer Feed functionality

    2019-02-01: v3.1 - Fixed conversion tracking issues under certain conditions (application lifecycle monitoring improved)

    2018-11-29: v3.0 - Full support for API 26+ build targets, bugfixes, simplified use & improved handling under poor network conditions

    2018-07-02: v2.1 - Fixed video ad orientation & resolution issues on Android 8.1

    2018-06-18: v2.0 - Video Ads & Rewarded Video Ads 2017-11-01: v1.1 - Fixed incompatibilities with present GSON dependencies 2017-10-29: v1.0 - Initial Release of our Publisher SDK (Android)

    Eligible Placement & AdSlot Combinations

    Android App

    <activity
        android:name="com.ayetstudios.publishersdk.OfferwallActivity"
        android:configChanges="orientation|screenSize">
        <intent-filter android:label="offer">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="offer" android:host="com.example.myapplication" /> <!-- Replace with your lower case package name -->
        </intent-filter>
    </activity>
    <activity android:name="com.ayetstudios.publishersdk.VideoActivity" android:configChanges="orientation|screenSize" />	
    <meta-data android:name="AYET_APP_KEY" android:value="xxxxxxxxxxxxxxxx" />
    <uses-permission android:name="android.permission.INTERNET" /> <!-- mandatory permission -->
    <uses-permΓΆlmission android:name="android.permission.READ_PHONE_STATE" /> <!-- optional -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- optional -->
    This is an example for a complete AndroidManifest.xml:
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapplication"> <!-- Replace with your lower case package name -->
    <uses-permission android:name="android.permission.INTERNET" /> <!-- mandatory permission -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- optional -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- optional -->
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    android:name=".MainActivity"
    android:label="@string/app_name">
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
    <!-- Publisher SDK Specific-->
    android:name="com.ayetstudios.publishersdk.OfferwallActivity"
    android:configChanges="orientation|screenSize">
    <intent-filter android:label="offer">
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="offer" android:host="com.example.myapplication" /> <!-- Replace with your lower case package name -->
    <activity android:name="com.ayetstudios.publishersdk.VideoActivity" android:configChanges="orientation|screenSize"></activity>
    <meta-data android:name="AYET_APP_KEY" android:value="xxxxxxxxxxxxxxxx" />
    <!-- End of: Publisher SDK Specific-->
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        AyetSdk.init(getApplication(), "username (external identifier)", new UserBalanceCallback() { // UserBalanceCallback is optional if you want to manage balances on your servers
                @Override
                public void userBalanceChanged(SdkUserBalance sdkUserBalance) {
                    Log.d("AyetSdk" , "userBalanceChanged - available balance: "+sdkUserBalance.getAvailableBalance()); // this is the new total available balance for the user
                }
    
                @Override
                public void userBalanceInitialized(SdkUserBalance sdkUserBalance) {
                    Log.d("AyetSdk" , "SDK initialization successful");
                    Log.d("AyetSdk" , "userBalanceInitialized - available balance: "+sdkUserBalance.getAvailableBalance()); // this is the total available balance for the user
                    Log.d("AyetSdk" , "userBalanceInitialized - spent balance: "+sdkUserBalance.getSpentBalance()); // this is the total amount spent with "AyetSdk.deductUserBalance(..)"
                    Log.d("AyetSdk" , "userBalanceInitialized - pending balance: "+sdkUserBalance.getPendingBalance()); // this is the amount currently pending for conversion (e.g. user still has offer requirements to meet)
                }
    
                @Override
                public void initializationFailed() {
                    Log.d("AyetSdk", "initializationFailed - please check APP API KEY & internet connectivity");
                }
            });
    
        setContentView(R.layout.activity_main);
    }	                
    if (AyetSdk.isInitialized()) {
        Log.d("AyetSdk" , "SDK is ready");
    } else {
        Log.d("AyetSdk" , "SDK is NOT ready");
    }	
    mPurchaseInAppItemButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            int amount=100;
            AyetSdk.deductUserBalance(getApplication(), amount, new DeductUserBalanceCallback() {
                @Override
                public void success() {
                    Log.d("AyetSdk" , "deductUserBalance - successful, new available balance: "+AyetSdk.getAvailableBalance());
                    // TODO: activate the purchased content
                }
    
                @Override
                public void failed() {
                    Log.d("AyetSdk" , "deductUserBalance - failed");
                    // this usually means that the user does not have sufficient balance in his account
                }
            });
        }
    });
    AyetSdk.showOfferwall(getApplication(), "offerwall adslot name");
    -keep class com.ayetstudios.publishersdk.messages.** {*;}
    -keep public class com.ayetstudios.publishersdk.AyetSdk
    -keepclassmembers class com.ayetstudios.publishersdk.AyetSdk {
       public *;
    }
    -keep public interface com.ayetstudios.publishersdk.interfaces.UserBalanceCallback { *; }
    -keep public interface com.ayetstudios.publishersdk.interfaces.DeductUserBalanceCallback { *; }
    
    -keep class com.ayetstudios.publishersdk.models.VastTagReqData { *; }

    If you integrate the Android SDK while using a different Placement & AdSlot combination in the ayeT-Studios dashboard, you won't be able to initialize the Offerwall.

    Getting Started

    Make sure to use the correct package name that you intend to use for your final app.

    Or create a test placement with a different package name that matches the package name of your test app.

    If package name of your placement and your actual app don't match, you can't initialize the Offerwall.

    User Balance

    We don't recommend a managed user balance!

    Managed user balances don't work well alongside additional rewarded ad integrations.

    This form of user balance is recommended.

    You will find additional information about callbacks at the end of the Adndroid SDK documentation.

    Download the Library

    Add the library to your Android Studio project

    Initialize the SDK & Managed User Balances

    Attention: The username or external identifier passed in the init call (e.g. username, hashed email address, etc.) will be accessible in the conversion callbacks through the {external_identifier} parameter.

    Show the Offerwall

    Proguard Rules / Release Builds

    It's always highly recommended to test your release builds before publishing them on Google Play to verify that they behave as intended!

    Conversion Callbacks & Currency Handling

    πŸ–₯️Dashboard Setup
    πŸ’‘Callbacks & Testing
    Once enabled we will send reversal callbacks directly to the callback URL you set up for your placements.

    The unique transaction ID we send for each conversion will carry an "r-" prepended to the ID for each reversal callback.

    Below is a list of all relevant parameters to use in order to distinguish reversal callbacks from regular callbacks.

    Variable
    Type
    Description

    {transaction_id}

    string

    Unique transaction ID - use for duplicate checks. For chargebacks the original tid is prepended with "r-".

    {is_chargeback}

    int

    Either 0 or 1. Indicator if the callback is a conversion (0) or a chargeback (1).

    Variable
    Type
    Description

    {transaction_id}

    string

    Unique transaction ID - use for duplicate checks. For chargebacks the original tid is prepended with "r-".

    {payout_usd}

    float

    https://your-server.com/callback?network=ayetstudios&amount={currency_amount}&external_identifier={external_identifier}&payout_usd={payout_usd}
    https://your-server.com/callback?network=ayetstudios&amount=360&external_identifier=username&payout_usd=0.36

    For Web Surveywalls, you have to manually manage your users' currencies on your own servers.

    Adding your Callback URL

    This assumes you set external_identifier to username in the original Offerwall URL for that user, the currency conversion rate in your placement was 1000 per $1 and the user completed an offer with a $0.36 payout.

    Important: Your server must always reply with an HTTP 200 status code to our postbacks. Otherwise we will resend the postback 12 times over a span of one hour before giving up.

    Enabling & Processing Reversal Callbacks

    For chargebacks the original transaction ID of a conversion is prepended with "r-".

    Example Transaction IDs:

    381f99333613b41392b15183d69a7240308e8461 -> Regular Callback

    r-381f99333613b41392b15183d69a7240308e8461 -> Reversal Callback

    Available Macros for Callback URLs

    Note: If the parsing capabilities of your callback endpoint are limited, each of the parameters below is also available in a sanitized version. By suffixing any of the parameters below with _sanitized (for example {external_identifier_sanitized}), any character that is not in 0-9 a-z A-Z - _ will be removed. Whitespaces will be replaced by underscores.

    Important: To ensure each conversion is granted only once to your users, always use {transaction_id}. Occasional callback resends may occur for various reasons. Utilizing {transaction_id} prevents granting conversions more than once.

    Logo
    Logo

    Offerwall Callbacks

    For Web Offerwalls and SDKs, you have to manually manage your users' currencies on your own servers.

    Adding your Callback URL

    You can configure a conversion callback URL in our publisher dashboard. To do so, navigate to Placements / Apps, edit your placement and set the Callback URL to your server's postback URL:

    If this is the callback URL you set for your offerwall placement:

    https://your-server.com/callback?network=ayetstudios&amount={currency_amount}&external_identifier={external_identifier}&payout_usd={payout_usd}

    A typical conversion callback sent by our server will look like this:

    https://your-server.com/callback?network=ayetstudios&amount=360&external_identifier=username&payout_usd=0.36

    This assumes you set external_identifier to username in the original Offerwall URL for that user, the currency conversion rate in your placement was 1000 per $1 and the user completed an offer with a $0.36 payout.

    Important: Your server must always reply with an HTTP 200 status code to our postbacks. Otherwise we will resend the postback 12 times over a span of one hour before giving up.

    Enabling & Processing Reversal Callbacks

    You can automatically process Reversals made to your account and placements by enabling Reversal Callbacks.

    Simply navigate to Placements / Apps, edit your placement and check the box Enable Reversal Callbacks.

    Once enabled we will send reversal callbacks directly to the callback URL you set up for your placements.

    The unique transaction ID we send for each conversion will carry an "r-" prepended to the ID for each reversal callback.

    Below is a list of all relevant parameters to use in order to distinguish reversal callbacks from regular callbacks.

    Variable
    Type
    Description
    Variable
    Type
    Description

    GitHub - ayetstudios/android-sdk-v2-demo-app: A demo app for the ayet-Studios Android SDK v2GitHub
    GitHub - ayetstudios/android-sdk-v2-demo-app: A demo app for the ayet-Studios Android SDK v2GitHub
    GitHub - ayetstudios/flutter_sdk_v2_demo_app: A demo app for the Flutter v2 SDK wrapperGitHub
    GitHub - ayetstudios/flutter_sdk_v2_demo_app: A demo app for the Flutter v2 SDK wrapperGitHub

    {chargeback_reason}

    string

    Reason why chargeback created. Only available if is_chargeback set to 1.

    {chargeback_date}

    string

    Date of chargeback creation. Only available if is_chargeback set to 1.

    The actual conversion payout in USD. If chargeback value is negative.

    {currency_amount}

    float

    The amount of currency the user earned (taken from your offerwall currency configuration). If chargeback value is negative.

    {is_screenout}

    integer

    Either 1 or 0. Indicates whether the conversion is a screenout reward (1) or a regular conversion (0).

    {is_survey}

    integer

    Either 1 or 0. Always 1 for surveywall related conversions. 0 for offer conversions (e.g. when using the offerwall).

    {external_identifier}

    string

    The user identifier (EXTERNAL IDENTIFIER) originally passed in the web offerwall link.

    {user_id}

    integer

    Our internal ID for this offerwall user

    {placement_identifier}

    string

    The placement_identifier for which the conversion occured

    {survey_id}

    unsigned int64

    Survey ID of the completed survey

    {loi}

    float

    Length of interview - the time it took the user to complete the survey in minutes

    {adslot_id}

    int

    The ID of the adslot for which the conversion occured

    {sub_id}

    string

    The ID of the Placement for which the conversion occured [PL-1...n]

    {ip}

    string

    Converting device's IP address if known, 0.0.0.0 otherwise

    {offer_id}

    int

    Offer ID of the converting offer

    {offer_name}

    string

    Name / title of the converting offer

    {device_uuid}

    string

    ayeT-Studios internal device identificator

    {device_make}

    string

    Device manufacturer

    {device_model}

    string

    Device model

    {advertising_id}

    string

    Device advertising id (GAID/IDFA) if known, otherwise empty

    {sha1_android_id}

    string

    Device sha1 hashed android id if known, otherwise empty

    {sha1_imei}

    string

    Device sha1 hashed IMEI, if known, otherwise empty

    {is_chargeback}

    int

    Either 0 or 1. Indicator if the callback is a conversion (0) or a chargeback (1).

    {chargeback_reason}

    string

    Reason why chargeback created. Only available if is_chargeback set to 1.

    {chargeback_date}

    string

    Date of chargeback creation. Only available if is_chargeback set to 1.

    {currency_identifier}

    string

    Shows virtual currency name as set in adslot.

    {currency_conversion_rate}

    decimal

    Shows currency conversion rate used to calculate user currency for the given conversion.

    {custom_1}

    string

    Custom parameter to pass variables to the conversion callbacks.

    {custom_2}

    string

    Custom parameter to pass variables to the conversion callbacks.

    {custom_3}

    string

    Custom parameter to pass variables to the conversion callbacks.

    {custom_4}

    string

    Custom parameter to pass variables to the conversion callbacks.

    {custom_5}

    string

    Custom parameter to pass variables to the conversion callbacks.

    Logo
    Logo
    Logo

    {chargeback_reason}

    string

    Reason why chargeback created. Only available if is_chargeback set to 1.

    {chargeback_date}

    string

    Date of chargeback creation. Only available if is_chargeback set to 1.

    {currency_amount}

    float

    The amount of currency the user earned (taken from your offerwall currency configuration). If chargeback value is negative.

    {external_identifier}

    string

    The user identifier (EXTERNAL IDENTIFIER) originally passed in the web offerwall link.

    {user_id}

    integer

    Our internal ID for this offerwall user

    {placement_identifier}

    string

    The placement_identifier for which the conversion occured

    {adslot_id}

    int

    The ID of the adslot for which the conversion occured

    {sub_id}

    string

    The ID of the Placement for which the conversion occured [PL-1...n]

    {ip}

    string

    Converting device's IP address if known, 0.0.0.0 otherwise

    {offer_id}

    int

    Offer ID of the converting offer

    {offer_name}

    string

    Name / title of the converting offer

    {device_uuid}

    string

    ayeT-Studios internal device identificator

    {device_make}

    string

    Device manufacturer

    {device_model}

    string

    Device model

    {advertising_id}

    string

    Device advertising id (GAID/IDFA) if known, otherwise empty

    {sha1_android_id}

    string

    Device sha1 hashed android id if known, otherwise empty

    {sha1_imei}

    string

    Device sha1 hashed IMEI, if known, otherwise empty

    {is_chargeback}

    int

    Either 0 or 1. Indicator if the callback is a conversion (0) or a chargeback (1).

    {chargeback_reason}

    string

    Reason why chargeback created. Only available if is_chargeback set to 1.

    {chargeback_date}

    string

    Date of chargeback creation. Only available if is_chargeback set to 1.

    {event_name}

    string

    For CPA & CPE campaigns, event name of the conversion

    {event_value}

    float

    The value associated with the event (non-billable - refer to "payout_usd" and "currency_amount" for publisher & user payout).

    {task_name}

    string

    Only available for CPE campaigns, shows individual task name for that conversion (for example "Complete Level 5")

    {task_uuid}

    string

    Only available for CPE campaigns, shows unique id for the task and campaign

    {currency_identifier}

    string

    Shows virtual currency name as set in adslot.

    {currency_conversion_rate}

    decimal

    Shows currency conversion rate used to calculate user currency for the given conversion.

    {click_date}

    string

    A string representing the date and time (in 'Y-m-d H:i:s' format) at which the user clicked on the offer.

    {callback_type}

    string

    Retruns the type of callbcak. Possible values are 'conversion', 'chargeback', 'installation', 'optional', 'iap', 'iaa', 'survey'

    {callback_ts}

    integer

    Timestamp at which the user triggered the event/callback.

    {custom_1}

    string

    Custom parameter to pass variables to the conversion callbacks.

    {custom_2}

    string

    Custom parameter to pass variables to the conversion callbacks.

    {custom_3}

    string

    Custom parameter to pass variables to the conversion callbacks.

    {custom_4}

    string

    Custom parameter to pass variables to the conversion callbacks.

    {custom_5}

    string

    Custom parameter to pass variables to the conversion callbacks.

    {transaction_id}

    string

    Unique transaction ID - use for duplicate checks. For chargebacks the original tid is prepended with "r-".

    {is_chargeback}

    int

    Either 0 or 1. Indicator if the callback is a conversion (0) or a chargeback (1).

    {transaction_id}

    string

    Unique transaction ID - use for duplicate checks. For chargebacks the original tid is prepended with "r-".

    {payout_usd}

    float

    For chargebacks the original transaction ID of a conversion is prepended with "r-".

    Example Transaction IDs:

    381f99333613b41392b15183d69a7240308e8461 -> Regular Callback

    r-381f99333613b41392b15183d69a7240308e8461 -> Reversal Callback

    Available Macros for Callback URLs

    Note: If the parsing capabilities of your callback endpoint are limited, each of the parameters below is also available in a sanitized version. By suffixing any of the parameters below with _sanitized (for example {external_identifier_sanitized}), any character that is not in 0-9 a-z A-Z - _ will be removed. Whitespaces will be replaced by underscores.

    Important: To ensure each conversion is granted only once to your users, always use {transaction_id}. Occasional callback resends may occur for various reasons. Utilizing {transaction_id} prevents granting conversions more than once.

    The actual conversion payout in USD. If chargeback value is negative.

    Rewarded Video SDK for HTML5

    The ayeT-Studios Rewarded Video SDK for HTML5 allows web publishers to request and run rewarded video ads within their page.

    The table below shows all Placement & AdSlot Type combinations which allow you to utilize the Rewarded Video for Web integration.

    Placement Type
    AdSlot Type
    Eligible Integration Type
    Logo
    Logo
    Logo
    Logo
    Logo
    Logo

    Rewarded Video SDK for HTML5

    Before you start with the integration, make sure you:

    You will find more details here:

    You can find the relevant ads.txt lines that you have to add to www.your-website.com/ads.txt under "Edit Placements" in your publisher dashboard.

    We highly recommend using a CMP (Consent Management Platform) on your website.

    There are two different options for you to integrate a CMP:

    1. Self-Hosted CMP

      • Go to https://iabeurope.eu/cmp-list/

      • Look for a CMP that suits you

      • Follow the integration docs of that CMP

    2. CMP from Google AdSense (free of charge)

      • Create a Google AdSense account

      • Setup and integrate the Google CMP

    Our JavaScript library supports the following features:

    • OpenRTB header bidding with bundled prebid.js

    • Ad server functionality with custom waterfall demand sources, bid buckets and back fill

    • Consecutive waterfall VAST tag validation and fallback handling for no-bid scenarios

    • Content isolation and parent page protection using iframe playback

    • Native browser video rendering

    • Automatic detection of external CMPs and support for TCF2 / GDPR consent handling

    • Both S2S and signed client-side callbacks for user rewards

    To integrate our video SDK on your site, add the following script to the <head></head> section of your web / app or pages where videos are supposed to be played:

    The script above is around 35kb in size and will load additional required scripts (bidders, players, configuration) upon initialization.

    Next, please verify that the ads.txt on your server contains all requested entries listed for your placement in our dashboard in the Placement Details > Overview page.

    To initialize the SDK for a user, make the following asynchronous call that returns a Promise:

    externalIdentifier is a string (up to 128 chars, min. 3 characters) you set to uniquely identify your user. It might be a UUID, a hashed email address or anything that allows you to persistently identify a user.

    optionalParameter is an optional string (up to 32 chars) you can use to add an additional reporting dimension to the video statistics. It can be accessed and filtered in the video adslot statistics and the reporting API.

    To receive notifications for video playback events, the following global callbacks can be configured:

    To request a video ad for your AdSlot, make the following asynchronous call:

    Make sure not to call requestAd before the initialization of the SDK is complete, otherwise the call will fail. Also note, that after a success callback, a video ad is ready to be played. Depending on your video demand sources, successful bids will timeout after a while (usually 1-60 minutes). It's advisable to make a requestAd call just in time when a video should be played.

    After a video ad has been successfully requested, the following calls are available to play an ad. Please note, that these functions should be called from a user-interaction (for example a click event) or from the requestAd success callback which itself has been called from a user-interaction. Otherwise, video autoplay will be rejected by most browsers and we must render an additional button over the video for the user to click, which lowers the acceptance and usability.

    The different play...Ad functions will silently abort if an ad is already playing. In all other cases, they make use of the global callback handlers described in the Initialization & Global Callback Handlers section.

    Additionally, it makes sense to check if a video is ready to play, especially if there's a bigger expected delay between requestAd and play...Ad, for example:

    While a video is playing, it's possible to externally interrupt the ad and destroy the player by making a call to destroy:

    There are two ways to reward users for rewarded video views, (1) Clientside Video SDK Callbacks and (2) Server2Server Conversion Callbacks.

    The S2S Callbacks are usually sent to your server within 60 seconds after a completed & rewarded video view.

    For more information on Server2Server Conversion Callbacks please use this link:

    The Clientside SDK Callbacks are received through the global AyetVideoSdk.callbackRewarded function shown in Initialization & Global Callback Handlers:

    You can send the callback response to your server and validate the callback signature serverside. The signature can be verified serverside with your publisher API key (found in our Dashboard > Account Settings > Api Key), like the following example (in PHP). If custom parameters are present in the callback, they are also part of the signature. Signature calculation example:

    To pass custom parameters to server-side conversion callbacks and clientside callbacks, the function AyetVideoSdk.setCustomParameter('custom_n', 'value') is available.

    Where:

    custom_n can be one of these: custom_1, custom_2, custom_3, custom_4, custom_5. value is a string (up to 64 chars).

    AyetVideoSdk.setCustomParameter can be called any time with the most recent content used when a video view is completed.

    There are two different callback methods for errors in the ayetvideosdk:

    1. The global AyetVideoSdk.callbackError function that can be configured and is invoked for any type of callback errors: AyetVideoSdk.callbackError = function(e) {console.log("callbackError: "+JSON.stringify(e));};

    2. The local error function in AyetVideoSdk.requestAd(adslotName, successFunction, errorFunction); that is invoked if an ad request did not succeed

    Possible error messages for AyetVideoSdk.callbackError:

    no adTagUrl set, no video ad available.

    No ad was requested using requestAd or the request was unsuccessful.

    provided ad unit did not start.

    The player was unable to start the playback of the video.

    provided ad unit stalled.

    The video playback was interrupted for > 5 seconds and aborted (for ex. network issues).

    Possible error messages for the AyetVideoSdk.requestAd(...) error callback:

    no fill.

    This is expected behaviour: There is currently no video ad available for the device & user.

    unhandled client exception.

    Unspecified exception in the ayetvideosdk during ad request.

    invalid server response.

    Error communicating with our servers, check your internet connection & make sure ad blockers are disabled.

    Learn about:

    • Setting up callbacks

    • IP Whitelists

    • Securing callbacks using HMAC Security Hash

    • Testing callbacks

    Click on the link below:

    Website

    Eligible Placement & AdSlot Combinations

    Rewarded Video

    <script src="https://cdn.ayet.io/offerwall/js/ayetvideosdk.min.js"></script>	
    var placementId=3; // This is the numeric id of your web placement
    var externalIdentifier="{your user identifier}";
    var optionalParameter=null; // or a string(32)
    AyetVideoSdk.init(placementId, externalIdentifier, optionalParameter).then(function() {
    	console.log("finished initialization!");
    });
    /* An error occured when trying to play a video ad. After this callback, no video is being rendered and a new ad has to be requested first: */
    AyetVideoSdk.callbackError = function(e) {console.log("callbackError: "+JSON.stringify(e));};
    
    /* After this callback, a video will start playing: */
    AyetVideoSdk.callbackPlaying = function() {console.log("callbackPlaying");};
    
    /* After this callback, playing the video is finished and the player is closed: */
    AyetVideoSdk.callbackComplete = function() {console.log("callbackComplete");};
    
    /* This callback is sent once a second while a video is being played: */
    AyetVideoSdk.callbackProgress = function(remainingSeconds) {console.log("callbackProgress: "+Math.round(remainingSeconds)+"s remaining");};
    
    /* This callback is sent if a video has been completed and the impression has gone through fraud checks (see "Rewarding Users" for more details): */
    AyetVideoSdk.callbackRewarded = function(details) {appendLog("callbackRewarded: "+JSON.stringify(details));};
    AyetVideoSdk.requestAd(
    	'{your_rewarded_video_adslot_name}',
    	function() { // success callback function
    		console.log("requestAd successful");
    	},
    	function(msg) { // error callback function
    		appendLog("requestAd failed: "+msg);
    	}
    );	  
    /* Play the ad in a pre-defined div (consult your account manager to determine if size & location is appropriate for all demand partners): */
    AyetVideoSdk.playInPageAd('video_div');
    
    /* Play the ad full size (100% of your page viewport): */
    AyetVideoSdk.playFullsizeAd();
    
    /* Play the ad fullscreen (this temporarily switches the browser to fullscreen mode): */
    AyetVideoSdk.playFullscreenAd();
    /* This example assumes an ad was requested a longer time ago and we're unsure if the bid expired already */
    if (AyetVideoSdk.isAdAvailable()) {
    	AyetVideoSdk.playInPageAd('{your_html_video_div_id}');
    } else {
    	/* Either abort and notify the user or request and play a fresh ad: */
    	AyetVideoSdk.requestAd(
    		'{your_rewarded_video_adslot_name}',
    		function() { // success callback function
    			AyetVideoSdk.playInPageAd('{your_html_video_div_id}');
    		},
    		function(msg) { // error callback function
    			appendLog("requestAd failed: "+msg);
    		}
    	);
    }
    /* Interrupt a playing ad and destroy the player (to play another ad later, a new call to AyetVideoSdk.requestAd is required) */
    AyetVideoSdk.destroy();
    /* This callback is sent if a video has been completed and the impression has gone through fraud checks: */
    AyetVideoSdk.callbackRewarded = function(details) {appendLog("callbackRewarded: "+JSON.stringify(details));};
    
    /* Example output:
    callbackRewarded: {"status":"success","rewarded":true,"externalIdentifier":"your user identifier","currency":10,"conversionId":"aef8cd370cfe-video-u94-adbcec159f76","signature":"f98c35ae4facef42dce5b31f6a5f9f0e8819b8ec"}
    */
    
    /* Example output if custom parameters were set:
    callbackRewarded: {"status":"success","rewarded":true,"externalIdentifier":"your user identifier","currency":10,"conversionId":"aef8cd370cfe-video-u94-adbcec159f76","custom_1":"bar", "custom_3":"foo","signature":"e35d78be4facef42dce5b31f6a5f9f0e8821c3de"}
    */
    $signature = hash_hmac('sha1',
    	$response['externalIdentifier'] .
    	$response['currency'] .
    	$response['conversionId'] .
    	(isset($response['custom_1']) ? isset($response['custom_1'] : '') .
    	(isset($response['custom_2']) ? isset($response['custom_2'] : '') .
    	(isset($response['custom_3']) ? isset($response['custom_3'] : '') .
    	(isset($response['custom_4']) ? isset($response['custom_4'] : '') .
    	(isset($response['custom_5']) ? isset($response['custom_5'] : '')
    	, $user->publisher->user->api_key);
    /* Example of setting custom parameters: */
    AyetVideoSdk.setCustomParameter("custom_1", "bar");
    AyetVideoSdk.setCustomParameter("custom_3", "foo");
    
    /* Example of unsetting custom parameter: */
    AyetVideoSdk.setCustomParameter("custom_1", null);

    If you integrate the Rewarded Video for Web SDK while using a different Placement & AdSlot combination in the ayeT-Studios dashboard, you won't be able to send correct ad requests.

    Getting Started

    Ads.txt

    Adding an ads.txt to your domain is required (see Integration) to correctly utilize the Rewarded Video solution.

    CMP

    Without a compliant CMP and without requesting consent from affected GDPR & CCPA users, both fill rate and eCPM will be impacted significantly or no ads will be delivered at all.

    Supported Features

    Integration

    Initialization & Global Callback Handlers

    Requesting Video Ads

    Playing Video Ads

    Rewarding Users

    Since rewarding users for video views in real time is usually important for a frictionless user flow, we recommend using (1) Clientside Video SDK Callbacks!

    Server2Server Conversion Callbacks

    Clientside Video SDK Callbacks

    Please use AyetVideoSdk.callbackRewarded and not AyetVideoSdk.callbackComplete to reward users!

    Passing Custom Parameters

    Custom Parameters are up to 64 chars of length!

    Error Handling / Error Codes

    Conversion Callbacks & Currency Handling

    πŸ–₯️Dashboard Setup
    πŸ’‘Callbacks & Testing
    πŸ’‘Callbacks & Testing
    Our Team can assist with the setup

    provided ad unit is corrupt.

    The video file or companion ads are corrupted or not supported (for ex. codecs).

    all bids expired or contained invalid VAST responses, unable to render ad.

    No valid bids response was found or all bids responses are expired (please request a new ad).

    unrecoverable ad error: {message}

    Other video player or VAST parser errors that were not covered above.

    cap reached.

    The user/device video cap has been reached.

    https://www.ayetstudios.com/ayetpublisher3.6.jarwww.ayetstudios.com