Floxis Maven/Documentation

Floxis SDK testing and troubleshooting guide#

This guide helps you check a Floxis SDK integration before release and find out why Floxis ads are not showing. It covers every Floxis SDK: Android with AdMob (classic and Next-Gen), Google Ad Manager, AppLovin MAX and Unity LevelPlay, and iOS with AdMob.

Setup for each integration is in its own guide: In-app SDK (Android), In-app SDK (iOS, AdMob), In-app SDK (Google Ad Manager), In-app SDK (AppLovin MAX) and In-app SDK (Unity LevelPlay). Consent rules are in SDK privacy and consent, and every class and status is listed in SDK API reference.

Only the Android AdMob artifacts (floxis-sdk and floxis-sdk-nextgen) are released today. The Google Ad Manager, AppLovin MAX, Unity LevelPlay and iOS SDKs are available from the next release; contact your Floxis account manager for early access.

How a Floxis ad gets to the screen#

Most problems sit at one of these four steps, so check them in order:

  1. Initialise. The SDK connects to the Floxis endpoint for your seat and region. Until this finishes, ad loads skip Floxis and your ad server loads on its own.
  2. Auction. Before each load, the SDK asks Floxis for a bid. The result is BID, NO_BID, TIMEOUT, ERROR or a skip.
  3. Ad server picks. A winning bid carries its price tier (hb_pb, for example 0.70). Your AdMob Custom Event, Ad Manager line item, MAX placement or LevelPlay instance for that tier has to win in the ad server.
  4. Render. The Prebid adapter shows the Floxis creative.

A BID result only proves step 2. Step 3 needs a matching entry for every price tier in your ad server.

1. Turn on test mode and logs#

SDKTest trafficLogs
Android: AdMob, Next-Gen, Ad Manager, MAXFloxisConfig(..., debug = true, testMode = true)adb logcat -s Floxis
iOSFloxisConfiguration(..., debug: true, testMode: true)Xcode console lines that start with Floxis, or Floxis.shared.onDiagnostic
Unity LevelPlayNo test switch: every LevelPlay auction is live.LevelPlay callbacks and LevelPlay.setAdaptersDebug(true)

Android, in a debug build:

Floxis.initialize(
    applicationContext,
    FloxisConfig(seat = "YOUR_SEAT", region = "us-e", debug = true, testMode = true),
) { status, description -> Log.d("FloxisTest", "init $status $description") }

iOS, in a build you run from Xcode:

let configuration = try FloxisConfiguration(seat: "YOUR_SEAT", region: "us-e", debug: true, testMode: true)
Floxis.shared.onDiagnostic = { diagnostic in print("Floxis", diagnostic.code, diagnostic.message) }
Floxis.shared.initialize(configuration) { status, detail in print("Floxis init:", status, detail ?? "") }

What test mode does:

  • It sets the OpenRTB test flag on each auction, which asks buyers to treat the auction as not billable. Not every buyer honours the flag, so keep test builds to test devices. Many buyers do not bid on test traffic, so **few or no Floxis wins in a test build is normal**.
  • It only works in a debuggable build. On Android that is a build with android:debuggable set, which debug builds have by default. On iOS it is the Simulator, or a device build signed with a development profile. A release, App Store or TestFlight build ignores testMode and logs FLX-105, so the setting can never send test traffic from production.
  • It does not change what the SDK does with a bid. A test win goes through your ad server exactly like a live one.

What debug does:

  • Android: turns on the debug log lines below and raises Prebid Mobile's log level to debug. Warnings log even when debug is off.
  • iOS: prints every diagnostic to the console. onDiagnostic receives them whether debug is on or off.
  • It never changes what is sent to Floxis. Turn it off before release to keep the log quiet.

Before you release, set testMode back to false and remove any test device IDs you added to your ad server SDK.

2. Read the log#

Android#

Every Floxis line has the tag Floxis and starts with a code. Lines marked warning always log; debug lines need debug = true.

CodeLevelMeaning
FLX-100debugInitialisation started. Shows the auction and status URLs for your seat.
FLX-101debugInitialisation finished, with SUCCEEDED, SERVER_STATUS_WARNING or FAILED.
FLX-102warningenabled = false in FloxisConfig, so Floxis did not start.
FLX-103warningInitialisation threw an error, or the bundled scripts could not be put in place. A failed start without an error shows as FLX-101 FAILED.
FLX-104warningRetrying a failed initialisation (at most every 30 seconds, on the next ad load).
FLX-105warningtestMode ignored because the app is not debuggable.
FLX-200debugOne auction finished. Shows the full result.
FLX-201debugAuction skipped, with the reason.
FLX-202warningA Floxis bid expired before the ad server load.
FLX-203warningAuction error.
FLX-204warningA rewarded video bid was turned down because Prebid Mobile cannot play it.
FLX-300 to FLX-303debug (FLX-302 warning)Banner refresh: fired, deferred (app in background or banner not visible), failed, stopped.
FLX-400warningA full-screen show was refused, with the reason.

A healthy start in a debug build looks like this:

D Floxis  : FLX-100 auction=https://...?seat=YOUR_SEAT status=...
D Floxis  : FLX-101 SUCCEEDED ...
D Floxis  : FLX-200 AuctionOutcome(status=BID, priceBucket=0.70, latencyMs=312, detail=null, responseId=...)
D Floxis  : FLX-200 AuctionOutcome(status=NO_BID, priceBucket=null, latencyMs=280, detail=null, responseId=null)

The AdMob, Next-Gen and MAX SDKs write an FLX-200 line for every auction that runs, and FLX-201 for every skipped one. The Ad Manager SDK writes only the initialisation lines and FLX-204; read its auction result from the Prebid listener instead (see section 3).

To see what Prebid Mobile did as well, filter on both tags:

adb logcat | grep -E "Floxis|PrebidMobile"

iOS#

With debug: true, each diagnostic prints as Floxis <code> <message>. Auction and show messages include the format and your configID.

CodeMeaning
FLX-101Initialisation finished.
FLX-103Initialisation failed.
FLX-105testMode ignored: the app is not a development-signed build.
FLX-201Auction skipped (disabled, personalised ads off, or not initialised yet).
FLX-202A loaded Floxis bid expired before show.
FLX-203Auction timed out or failed.
FLX-400A Floxis win was refused at show because Floxis was disabled or consent was withdrawn.
FLX-500The AdMob load failed. The message has AdMob's error. For a banner, it is written only when you pass AdMob's error to adMobDidFailToLoad(_:).

iOS writes nothing for BID and NO_BID. Read those from the load completion (see section 3).

Unity LevelPlay#

The LevelPlay adapter has no log tag of its own. Every failure reaches LevelPlay's load, show or init callback with a message from section 6. Turn on LevelPlay.setAdaptersDebug(true) in a debug build to see LevelPlay's adapter log.

3. Confirm that Floxis won and rendered#

AdMob on Android (classic and Next-Gen)#

Full-screen ads tell you directly:

override fun onAdLoaded(ad: FloxisInterstitialAd) {
    Log.d("FloxisTest", "auction=${ad.auction.status} tier=${ad.auction.priceBucket} floxisWon=${ad.isFloxisWinner}")
}

FloxisRewardedAd, FloxisNextGenInterstitialAd and FloxisNextGenRewardedAd have the same auction and isFloxisWinner properties.

For a classic banner, use the auction listener and AdMob's own listener on the AdView:

adView.adListener = object : AdListener() {
    override fun onAdLoaded() {
        Log.d("FloxisTest", "served by ${adView.responseInfo?.loadedAdapterResponseInfo?.adapterClassName}")
    }
}

When Floxis won, the class is org.prebid.mobile.admob.PrebidBannerAdapter. For a Next-Gen banner, pass a loadListener to FloxisNextGenBannerAd and read ad.getResponseInfo().loadedAdSourceResponseInfo?.adapterClassName in onBannerLoaded.

AdMob on iOS#

interstitial.load { outcome, error in
    print("auction:", outcome.status, outcome.priceBucket ?? "-", "floxisWon:", interstitial.isFloxisWinner)
}

FloxisRewardedAd works the same way. For a banner, load(completion:) gives you the auction outcome, and the banner's responseInfo?.loadedAdNetworkResponseInfo?.adNetworkClassName ends in PrebidAdMobBannerAdapter when Floxis won. If isFloxisWinner stays false while Ad Inspector shows the Floxis Custom Event filled, tell support your Google Mobile Ads version.

The Ad Manager SDK uses Prebid Mobile's listeners. In onAdLoaded, the Floxis bid is on the ad unit:

override fun onAdLoaded(interstitialAdUnit: InterstitialAdUnit) {
    val response = interstitialAdUnit.bidResponse
    Log.d("FloxisTest", "Floxis bid=${response?.winningBid?.price ?: "none"} hb_pb=${response?.targeting?.get("hb_pb")}")
}

A banner exposes the same bidResponse on the BannerView in BannerViewListener.onAdLoaded. A bid there means Floxis bid; whether your line item for that tier then won is decided in Ad Manager (section 4).

AppLovin MAX#

The auction listener on load gives the Floxis result, and MAX's own listener tells you which network filled:

FloxisMaxInterstitialAd(this, interstitial, "level_end_interstitial").load { outcome ->
    Log.d("FloxisTest", "auction=${outcome.status} tier=${outcome.priceBucket}")
}

// In your MaxAdListener:
override fun onAdLoaded(ad: MaxAd) {
    Log.d("FloxisTest", "filled by ${ad.networkName} placement ${ad.networkPlacement}")
}

When Floxis won, networkName is the name you gave the Floxis custom network in MAX.

Unity LevelPlay#

A Floxis fill reaches your LevelPlay listener as an ordinary load from the Floxis custom network instance. A Floxis no-bid or privacy block reaches the waterfall as a no-fill, and LevelPlay moves on to the next instance.

In the dashboard (AdMob)#

Open the app's endpoint on the Supply page. Under the integration panel, the AdMob price tier check shows, for each placement and hb_pb tier over the Auction dates (UTC) you pick:

  • Returned: bids the device received at this tier.
  • Won in AdMob: AdMob called the Custom Event for this tier and the ad loaded.
  • Rendered: the creative's impression pixel fired.

A tier flagged Step missing in AdMob got bids but never won, while its neighbours did. That is almost always a missing Custom Event.

4. Use your ad server's debugging tools#

AdMob (and Ad Manager): Ad Inspector#

Ad Inspector shows each ad request, the waterfall and which ad source filled. Open it from a test device:

MobileAds.openAdInspector(activity) { error -> Log.d("FloxisTest", "Ad Inspector closed: $error") }

On Next-Gen, call MobileAds.openAdInspector with an OnAdInspectorClosedListener. On iOS, call MobileAds.shared.presentAdInspector(from: viewController) { error in }.

Register your phone as a test device first, in the AdMob or Ad Manager UI or in code:

MobileAds.setRequestConfiguration(
    RequestConfiguration.Builder().setTestDeviceIds(listOf("YOUR_TEST_DEVICE_ID")).build()
)

On Next-Gen, the same RequestConfiguration.Builder().setTestDeviceIds(...) comes from com.google.android.libraries.ads.mobile.sdk.common. On iOS, set MobileAds.shared.requestConfiguration.testDeviceIdentifiers = ["YOUR_TEST_DEVICE_ID"]. Google prints your device ID in the log the first time an ad loads.

Keep in mind:

  • Google's demo ad unit IDs have no Floxis Custom Events, so they can never show a Floxis ad. Test with your own ad units that have the Custom Events from the setup sheet.
  • Mediated ads, Floxis included, do not carry Google's "Test Ad" label.
  • In Ad Inspector, a Floxis fill shows as the Custom Event row with the label from your setup sheet.

Use Ad Inspector on the device, and Ad Manager's delivery troubleshooting in the web UI, to see which line item served a request. A Floxis win serves your Floxis line item for that hb_pb tier, and its creative hands the ad back to the SDK to render. If the line item never serves, check its targeting: Floxis sends hb_pb, hb_bidder=floxis, hb_env=mobile-app and, when the bid has a size, hb_size. It never sends hb_format, so a line item that targets hb_format never matches.

AppLovin MAX: Mediation Debugger and test mode#

val config = AppLovinSdkInitializationConfiguration.builder("YOUR_SDK_KEY", this)
    .setMediationProvider(AppLovinMediationProvider.MAX)
    .setTestDeviceAdvertisingIds(listOf("YOUR_GAID"))
    .build()
AppLovinSdk.getInstance(this).settings.setVerboseLogging(true)
AppLovinSdk.getInstance(this).initialize(config) {
    AppLovinSdk.getInstance(this).showMediationDebugger()
}

Run this from the Floxis.initialize callback, whatever its status, as in the In-app SDK (AppLovin MAX) guide: Prebid's MAX adapter needs Floxis initialised first. In the Mediation Debugger, check that MAX found the adapter com.applovin.mediation.adapters.PrebidMaxMediationAdapter for your Floxis custom network. Remove the test device IDs before release.

Unity LevelPlay: integration test suite#

LevelPlay.setMetaData("is_test_suite", "enable")   // before LevelPlay init
LevelPlay.setAdaptersDebug(true)
// after LevelPlay init:
LevelPlay.launchTestSuite(this)

The test suite shows the networks LevelPlay set up for the app. If Floxis is missing, check that the Floxis custom network is added with the network key from your account manager, and that custom adapters are enabled on your LevelPlay account (Unity support enables them). Remove both test settings before release.

5. Common problems#

What you seeLikely causeFix
FLX-201 SKIPPED_NOT_INITIALIZED on the first loadsAds load before Floxis.initialize has called back.Load ads from the initialisation callback, or accept that the first loads go to your ad server alone.
FLX-101 FAILED or FLX-103No network, a wrong seat or region, or a blocked connection.Check the seat and region against your endpoint's integration panel. The SDK retries on a later ad load, at most every 30 seconds.
FLX-101 SERVER_STATUS_WARNINGThe status check did not answer as expected.Auctions still run. If it persists, contact support with the log.
FLX-102, or every auction SKIPPED_DISABLEDenabled = false, or Floxis.setEnabled(false) from your remote config.Call Floxis.setEnabled(true) when Floxis should run.
Every auction SKIPPED_NO_CONSENTpersonalizedAds = false, or Floxis.setPersonalizedAds(false).Expected: Floxis does not bid on non-personalised requests. Update the flag when consent changes.
Mostly NO_BID in a test buildTest traffic gets few bids.Normal. Check a release build with live traffic, together with your account manager.
Mostly NO_BID from the EUBuyers rarely bid on EU traffic without a TCF consent string.Run your CMP and grant consent on the test device, or test from outside the EU.
TIMEOUT with no response within 1500msThe device's network is slow or the timeout is short.Test on a good connection. If many live users time out, raise timeoutMs (200–10,000). Your ad server waits that long before loading.
BID in the log, but the ad comes from another sourceThe ad server has no entry for that tier, the entry's parameter does not match exactly, or another source beat its eCPM.Create every row of the setup sheet. The parameter must be exactly {"hb_pb":"0.70"} for tier 0.70. Re-export the sheet after changing price tiers. Check the AdMob price tier check.
AdMob never calls the Custom EventThe ad unit is not in the mediation group, the group is for another platform or format, or the class name is wrong.Add the ad unit to a mediation group for its platform and format, and copy the class name from the setup sheet. Confirm in Ad Inspector.
Floxis ads show on Android but not on iOSiOS uses different Custom Event class names.Pick iOS as the platform in the setup sheet and create those rows in an iOS mediation group.
Two auctions per banner refresh, or a Floxis banner replaced too soonAdMob's own banner refresh is on.Turn off automatic refresh on the AdMob banner ad unit. The Floxis banner refreshes itself (30–120 s).
Banner never refreshesThe app is in the background, or the banner is not on screen. On Android that also covers a screen that is off or a banner less than half visible (FLX-301); on iOS, a banner that is not in a window.Expected: refresh waits for the banner to be on screen.
show returns EXPIREDThe ad was loaded too long before it was shown. Android uses the bid's expiry (5 minutes by default) and logs FLX-400 EXPIRED; iOS allows one hour and logs FLX-202.Load closer to the moment you show, and reload when show returns EXPIRED.
show returns DISABLED, with FLX-400Floxis was turned off with setEnabled(false) after a Floxis ad loaded. On iOS, turning personalised ads off does the same.Expected. Load a new ad.
FLX-204 on a rewarded adThe buyer's rewarded video had neither a click-through nor an end card, which Prebid Mobile cannot play.Nothing to fix: the bid is turned down and your ad server loads without it.
Next-Gen interstitial or rewarded loads but never showsMobileAds.initialize got an application context from an activity that was already running.Pass it an Activity, or call it from Application.onCreate.
Gradle: capability conflict between Floxis artifactsTwo Floxis artifacts that cannot share an app: floxis-sdk with floxis-sdk-nextgen, or floxis-sdk-nextgen with floxis-sdk-gam.Keep one of them. The setup guides list the allowed combinations.
R8 release build fails on LoudnessCodecControllerThe app compiles against API 34.Set compileSdk = 35.
Floxis works in debug but not in a minified release buildYour build ignores keep rules from libraries.The SDK ships its own R8 rules, so most apps add none. If your build skips library rules, add the rules below.
Ad Manager: GAM ad slot already loaded; create a new wrapper for each requestload() was called twice on one Floxis Ad Manager object.Create a new FloxisGamBannerAd, FloxisGamInterstitialAd or FloxisGamRewardedAd for each request.
Ad Manager line item never servesIt targets a key Floxis does not send, such as hb_format, or no line item exists for the tier.Target hb_pb for each tier, as in the In-app SDK (Google Ad Manager) guide.
MAX adapter fails to initialiseMAX started before Floxis finished initialising.Initialise MAX from the Floxis.initialize callback.
MAX banner throws IllegalArgumentExceptionFloxisMaxBannerAd only takes FloxisSize(320, 50) or FloxisSize(300, 250).Use one of those two sizes.
LevelPlay: Invalid Floxis seat, region, or timeoutMsAn app-level field of the Floxis custom network is wrong.Type plain values: seat from your endpoint, region such as us-e, timeoutMs a whole number from 200 to 10,000. Leave the last two blank for the defaults.
LevelPlay: Missing configIdAn instance has no configId.Set configId on each instance.
LevelPlay: Advertising restricted by privacy signalsLevelPlay consent is false, GDPR applies without Purpose 1 consent, or a US privacy or GPP opt-out is recorded.Expected. See SDK privacy and consent.
LevelPlay: Prebid already initialized for another auction host or account, or Prebid auction host or account changedAnother Floxis SDK in the app uses a different seat or region.Use the same seat and region everywhere in the app.
LevelPlay logs failed to load <name>The custom network was added with a key that does not belong to Floxis, or the adapter is not in the app.Add floxis-sdk-levelplay and use the network key from your account manager.
Battery, dark-mode and session signals missing from requestsThe consent gate is closed: they need personalised ads on, Purpose 1 consent where GDPR applies, and no opt-out in the US privacy string or an applicable GPP US section.Expected. See SDK privacy and consent.
Android: the battery and dark-mode fields are not in device.ext of a request you captured on the devicePrebid Mobile on Android drops device.ext from what the SDK hands it, so the SDK sends these fields in user.ext.floxis.device. The exchange moves them into device.ext before buyers see the request.Look under user.ext.floxis.device. iOS sends them in device.ext directly.
user.ext.impdepth is back at 1On Android, more than 30 minutes without a Floxis auction that carried the signals starts a new session.Expected. See SDK privacy and consent.
A constructor throws IllegalArgumentExceptionA blank configId or ad unit ID, an empty size list, or a seat, region or timeout outside the allowed range.Fix the argument. The SDK checks arguments when you create objects; failures during a load are caught and logged.

R8 rules, only if your build skips the rules shipped inside the SDK:

-keep class com.floxis.sdk.** { public *; }
-keep class org.prebid.mobile.admob.** { *; }
-keepnames interface com.floxis.sdk.internal.GmaBridge
-keep class * implements com.floxis.sdk.internal.GmaBridge { <init>(); }

For Ad Manager, add -keep class org.prebid.mobile.eventhandlers.** { *; }. For MAX, add -keep class com.applovin.mediation.adapters.PrebidMaxMediationAdapter { *; }. For LevelPlay, keep the four com.ironsource.adapters.custom.floxis classes listed in the In-app SDK (Unity LevelPlay) guide.

6. Status and error reference#

Auction results (Android AuctionStatus, iOS FloxisAuctionStatus)#

AndroidiOSMeaningYour ad server still loads?
BID.bidFloxis bid. priceBucket is the hb_pb tier.Yes, with the Floxis tier.
NO_BID.noBidNo buyer bid, or a bid was turned down (detail says why).Yes.
TIMEOUT.timeoutNo answer within timeoutMs.Yes.
ERROR.errorSomething failed. detail has the reason.Yes.
SKIPPED_DISABLED.skippedDisabledFloxis is switched off (enabled = false or setEnabled(false)). On iOS, also any load before initialize is called.Yes.
SKIPPED_NO_CONSENT.skippedNoConsentPersonalised ads are off.Yes. AdMob and Ad Manager requests carry npa=1.
SKIPPED_NOT_INITIALIZED.skippedNotInitializedInitialisation has not finished, or failed.Yes.

On Android, AuctionOutcome also has latencyMs and, for a BID, responseId. Include the responseId when you contact support about a specific ad.

Initialisation results#

Android FloxisInitStatusiOS FloxisInitializationStatusMeaning
SUCCEEDED.succeededReady.
SERVER_STATUS_WARNING.serverStatusWarningReady; the status check answered unexpectedly.
FAILED.failedNot ready. Retried on a later ad load.
DISABLED.disabledenabled is false.

On iOS, calling initialize again with a different seat or region returns .failed with Floxis is already configured for another seat or region.

Full-screen show results (FloxisShowResult)#

These come from show on the AdMob and Next-Gen interstitial and rewarded ads, on Android and iOS. The Ad Manager show() returns true or false, and MAX and LevelPlay report show results through their own listeners.

ResultMeaningCode passed to your show-failure callback (Android)
SHOWNThe ad is showing.—
ALREADY_SHOWNThis ad was already shown. Load a new one.1
DESTROYEDdestroy() was called.2
EXPIREDThe bid expired. Load a new one.3
DISABLEDFloxis was turned off after the load (on iOS, also personalised ads).4
notReady (iOS only)No ad is loaded yet.—

On Android, a refused show also calls your onAdFailedToShowFullScreenContent with the domain com.floxis.sdk (FloxisShowError.DOMAIN) and the code above. On Next-Gen, the error's code is INTERNAL_ERROR and the Floxis domain and code are on its mediationAdError. Use FloxisShowError.codeFor(result) to compare.

Unity LevelPlay messages#

CallbackCodeMessage
Init failed1002 (missing params)Invalid Floxis seat, region, or timeoutMs
Init failed1000 (internal)Floxis process already configured for a different seat, region, or timeout
Init failed1000Prebid already initialized for another auction host or account
Init failed1000Prebid auction host or account differs from Floxis configuration
Init failed1000Prebid Mobile's initialisation error, or Prebid initialization failed
Load failed1000Floxis not initialized
Load failed1000Prebid auction host or account changed
Load failed1000Floxis configuration differs from initialized network
Load failed1002Missing configId
Load failed1002Invalid banner size
Load failed, no fill10001Advertising restricted by privacy signals
Load failed, no fill10001No buyer bid (Prebid Mobile's no-bids message)
Load failed, no fill1000declined: rewarded VAST without ClickThrough or companion end card
Show failed1001 (expired)Floxis interstitial unavailable or Floxis rewarded unavailable: the ad expired, was already shown, or consent was withdrawn

7. FAQ#

Does test mode cost me or buyers money? Test mode sets the OpenRTB test flag, which asks buyers to treat the auction as not billable. Not every buyer honours it, so run test builds on test devices only. It only works in debuggable builds, so production traffic is never marked as test.

Can I leave debug = true in a release build? It never changes what is sent, but turn it off. On Android it also raises Prebid Mobile's log level, which writes far more to the device log.

Why don't I see a "Test Ad" label on Floxis ads? Google only labels its own test ads. Mediated ads, Floxis included, show the real creative.

Can I test with Google's demo ad units? You can check that the SDK initialises and runs auctions, but a Floxis ad can only show through your own ad units that have the Floxis Custom Events.

The auction says BID, so why is no impression counted? A bid is not an impression. Your ad server must pick the Floxis entry for that tier, and the creative must render. Check the AdMob price tier check and Ad Inspector.

How long can I keep a loaded interstitial or rewarded ad? On Android, until the bid expires (the buyer's expiry, 5 minutes by default). On iOS, one hour. show returns EXPIRED after that.

Do I need to add R8 or ProGuard rules? No, unless your build skips the rules that come inside the SDK.

8. Contact support#

First check that you are on the newest release: https://maven.floxis.tech lists the published versions of each Android artifact.

Email [email protected], or your Floxis account manager. Include:

  1. The app's package name or bundle ID, and the endpoint name on the Supply page.
  2. The SDK and version (on Android, Floxis.SDK_VERSION returns it; on iOS, Floxis.sdkVersion), and your ad server SDK and version.
  3. The platform, device model and OS version.
  4. The placement configId and the ad unit ID.
  5. A log from app start to the problem, with debug = true:
    • Android: adb logcat -d | grep -E "Floxis|PrebidMobile" > floxis-log.txt
    • iOS: the Xcode console lines starting with Floxis, or your onDiagnostic output.
    • LevelPlay: the load and show callback messages and the LevelPlay adapter log.
  6. For a specific ad, the responseId from the auction result and the time it happened, with the time zone.
  7. A screenshot of Ad Inspector, the MAX Mediation Debugger or the LevelPlay test suite, if you used one.

Remove user identifiers, consent strings and advertising IDs from logs before you send them.