NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev
Banner, native, interstitial, rewarded, video and carousel ads for Flutter apps, served by adPluga. No traffic minimum; a test key shows real ads with no charges.
Last release today
07 Oct 2026
Ships fairly regularly
a new release about every 2 weeks
Nearly every release is documented
notes for 11 of 11 stable releases
Nothing withdrawn
no release was ever pulled
2 months old
11 releases · first in 2026
One column per month.
Fires a mediation bidder's own impression and click trackers (impression_trackers, click_trackers on the serve response) with ours. The SSP counts the
impression_trackers, click_trackers on the serve response) with ours.
The SSP counts the impression it pays for from its VAST <Impression> or
native imptrackers, which were never fired before./v1/serve (X-Device-User-Agent) so a
mediation bid request carries a real device.ua; SSPs drop or discount
requests whose UA reads as a server.platform_mediation was read as unknown; it is now
AdSource.platformMediation.example/: a banner and an interstitial with the public demo key.
example/: a banner and an interstitial with the public demo key.homepage points to the SDK documentation; pub.dev topics added.ConsentState.gdpr and tcfString were stored but never sent, so mediation
bid requests left without them. They now go with every ad request (gdpr=1
and the X-Consent-String header).alt_text on the served creative, announced in place of the image. An ad is never decorative — it carries meaning and opens a destination — so renderin
alt_text on the served creative, announced in place of the image. An ad is
never decorative — it carries meaning and opens a destination — so rendering
it unlabelled left the tap target with no accessible name at all, failing
WCAG 2.2 SC 1.1.1 and SC 2.4.4 (both level A). Where the advertiser wrote no
alternative text the renderer falls back to the creative's title, and a
carousel card with no copy of its own inherits the ad's label.A slot that failed to fill stayed blank for the rest of the session. Only the success path armed the next attempt, so a transient miss — or a widget t
conversion() sent type/value; the API reads conv_type/value_cents, so both were dropped. The old argument names still work, deprecated.
IndexedStack
page or inside a collapsed viewport kept a valid rect and billed as fully
viewable. It now consults Visibility.of and every ancestor paint clip,
matching what the Android and iOS SDKs already did.initialize with a different publisher key now fails instead of quietly
returning the existing instance. Rotating a key revokes the previous one at
once, so the silent path left an app serving with a dead key. The same key
stays idempotent; call destroy() first to re-initialize deliberately.conversion() sent type/value; the API reads conv_type/value_cents,
so both were dropped. The old argument names still work, deprecated.width/height, the banner now adopts the served
creative's aspect ratio instead of pinning the box to its pixel size, so the
fit is exact and a creative wider than the screen no longer overflows. A host
that passes both dimensions still wins.endpoint accepts null to mean "use the default", and kDefaultEndpoint is
exported, so a host reading the endpoint from configuration no longer has to
hardcode an AdPluga hostname.AdPlugaCarousel renders type=carousel decks in a PageView. The deck is one advertiser and one auction: every card reports the same click and no card t
AdPlugaCarousel renders type=carousel decks in a PageView. The deck is
one advertiser and one auction: every card reports the same click and no card
triggers another serve, so swiping costs no decisions and no extra impression.Slide model and Ad.slides, parsed in the order the advertiser arranged;
a slide without a creative is dropped rather than drawn blank.pk_test_ key and every
30s on a live one — it never stops rotating.Slot rotation: banners now re-serve on the cadence the publisher configures for the slot (refresh_after_seconds on the serve response). Long-lived app
refresh_after_seconds on the serve response). Long-lived app
screens no longer show a single frozen creative — the mobile equivalent of a
web page reload.kMinRefreshSeconds), and the timer is cancelled on dispose and while
backgrounded.rq) so refreshed impressions stay
segregable from the initial render, as the MRC guidelines require.Test-mode badge: creatives served by a pk_test_ (sandbox) key now render a small non-interactive "TEST" marker at the top-left of every ad surface (ba
pk_test_ (sandbox) key now render a
small non-interactive "TEST" marker at the top-left of every ad surface
(banner, native, HTML, video, interstitial, rewarded). Driven by the new
test boolean on the serve response ad object (Ad.isTest). The badge is
wrapped in IgnorePointer so it never intercepts taps.Audio and video_rewarded ad kinds render via AdPlugaVideo widget in AdPlugaBanner, enabling autoplay for all video/audio formats.
AdPlugaVideo widget in
AdPlugaBanner, enabling autoplay for all video/audio formats.AdPluga.maybeInstance?.endpoint → AdPluga.maybeInstance?.config.endpoint
in AdPlugaVideo widget (2 occurrences).fix(sdk): iOS Package.swift version bump and Flutter format
fix(sdk): iOS Package.swift version bump and Flutter format
AdPluga.fireViewable(resp, slotId) posts
/v1/track/viewable with the served track token. Banner, native,
interstitial and rewarded widgets fire it from the same viewability
callback that already recorded the impression.fix(sdk-flutter): drop lint removed in Dart 3.3 — analyze gate was fa…
fix(sdk-flutter): drop lint removed in Dart 3.3 — analyze gate was fa…
webview_flutter.video_player with VAST-style
quartile beacons.http/https schemes).AdPluga.initialize gate — SDK operations now throw a clear
StateError if invoked before initialization.Your coding agent can read these notes before it upgrades. Set up the MCP server →