{"id":22930551,"url":"https://github.com/tanzilzubair/google_mobile_ads_manager","last_synced_at":"2025-04-15T19:41:13.956Z","repository":{"id":65659117,"uuid":"596723420","full_name":"tanzilzubair/google_mobile_ads_manager","owner":"tanzilzubair","description":"This package provides a simple, concise, and fully managed way of interacting with the AdMobSDK for Dart.","archived":false,"fork":false,"pushed_at":"2024-04-23T20:50:24.000Z","size":29,"stargazers_count":5,"open_issues_count":1,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-29T00:22:49.234Z","etag":null,"topics":["admob","admob-ads","admob-app-open","admob-banner","admob-interstitial","admob-rewarded","flutter-package"],"latest_commit_sha":null,"homepage":"https://pub.dev/packages/google_mobile_ads_manager","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tanzilzubair.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2023-02-02T19:52:36.000Z","updated_at":"2024-09-26T07:31:30.000Z","dependencies_parsed_at":"2023-02-18T00:01:46.193Z","dependency_job_id":null,"html_url":"https://github.com/tanzilzubair/google_mobile_ads_manager","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tanzilzubair%2Fgoogle_mobile_ads_manager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tanzilzubair%2Fgoogle_mobile_ads_manager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tanzilzubair%2Fgoogle_mobile_ads_manager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tanzilzubair%2Fgoogle_mobile_ads_manager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tanzilzubair","download_url":"https://codeload.github.com/tanzilzubair/google_mobile_ads_manager/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249140400,"owners_count":21219289,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["admob","admob-ads","admob-app-open","admob-banner","admob-interstitial","admob-rewarded","flutter-package"],"created_at":"2024-12-14T10:28:44.615Z","updated_at":"2025-04-15T19:41:13.932Z","avatar_url":"https://github.com/tanzilzubair.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"This package provides a simple, concise, and fully managed way of interacting with the AdMobSDK for Dart provided by [google_mobile_ads](https://pub.dev/packages/google_mobile_ads).\n\n## Features\n- 🚀 Automatic efficient ad preloading and queueing\n-  💪 Smart request retrying on fail\n- 🛡 Error handling\n- ⚙️ Automatic ad disposal after show\n- ⚡ Efficient optional probabilistic ad showing, to enhance user experiences\n- ❤️ Concise, intuitive API separated by ad type\n- 🔋 Batteries included :)\n\n## Initialization Strategies\nAds can be initialized in **2** ways:\n- When initializing the AdMob SDK, through a list of Initializer objects provided at startup \n- At any time, by providing an Initializer object of the relevant type to the appropriate method in `MobileAdsManager.instance`\n\nAll types of Ads have automatic retry mechanisms in place that will retry for a set number of times on a failed load (except for App Open ads), before throwing an error. \nApp Open ads do not retry because in most cases, retrying the load will take too long, and it is better to skip it in favor of a better experience for the user.\n\n## MobileAdsManager\nThe MobileAdsManager is the class that manages everything, and is accessible everywhere through the static instance getter. **A call to** `initializeSDK` **must be done before using any of the other methods provided by the class.**\n\n```dart  \n// Getting the instance\nfinal adManager = MobileAdsManager.instance;  \n\n// Initializing the SDK, with no ads and default configs. \n// Note that this method does not need to be in a try-catch\n// block\n// Errors can be handled by providing appropriate callbacks to \n// this function, or are otherwise automatically suppressed\nMobileAdsManager.instance.initializeSDK();\n```  \n\nMobileAdsManager can also be initialized with custom configuration, to make things easier and more convenient:\n\n```dart  \nMobileAdsManager.instance.initializeSDK(  \n  loadingStrategy: LoadingStrategy.fastLoading,  \n  appOpenAd: AppOpenAdInitializer(adUnitId: '\u003cAd Unit ID\u003e'),  \n  interstitialAds: \u003cInterstitialAdInitializer\u003e[  \n    /// Iniitalizes 3 Interstitial ads each, of \u003cAd Unit ID 1\u003e, and \n    /// \u003cAd Unit ID 2\u003e\n    InterstitialAdInitializer(adUnitId: '\u003cAd Unit ID 1\u003e', count: 3),  \n    InterstitialAdInitializer(adUnitId: '\u003cAd Unit ID 2\u003e', count: 3),  \n  ],  \n  rewardedAds: \u003cRewardedAdInitializer\u003e[  \n    /// Initializes 2 Rewarded ads each, of \u003cAd Unit ID 3\u003e, and \n    /// \u003cAd Unit ID 4\u003e\n    RewardedAdInitializer(adUnitId: '\u003cAd Unit ID 3\u003e', count: 2),  \n    RewardedAdInitializer(adUnitId: '\u003cAd Unit ID 4\u003e', count: 2),  \n  ],  \n  bannerAds: \u003cBannerAdInitializer\u003e[  \n    /// Iniitalizes 2 Banner ads, of \u003cAd Unit ID 5\u003e, and \n    /// \u003cAd Unit ID 6\u003e\n    BannerAdInitializer(  \n      adUnitId: '\u003cAd Unit ID 5\u003e',  \n      bannerAdSize: AdSize.banner,  \n    ),  \n    BannerAdInitializer(  \n      adUnitId: '\u003cAd Unit ID 6\u003e',  \n      bannerAdSize: AdSize.banner,  \n    ),  \n  ],  \n  onSDKInitializationError: (Object? error, StackTrace stackTrace) {  \n    // Handle errors associated with initializing the AdMob SDK  \n  },  \n  onAdsInitializationError: (Object? error, StackTrace stackTrace) {  \n    // Handle errors associated with initializing any Ads  \n  },  \n);\n```  \n\n**Note:**\n- Initializing Ads through `initializeSDK` is purely a convenience feature; every type of ad except for App Open Ads can also be separately initialized — at any time after calling `initializeSDK` first — through the methods on `MobileAdsManager` mentioned below.\n\n## App Open Ads  \nApp Open ads are interacted with through a fully self-managing instance of `ManagedAppOpenAd`.\n\nThe instance manages initializing the ad with the provided callbacks, loading the ad, and disposing it on load failure or after its shown.\n`ManagedAppOpenAd`s can be initialized by providing an instance of `AppOpenAdInitializer`  to  `initializeSDK`  during SDK initialization. They **cannot** be initialized any time after.\n\nThis single instance of  `ManagedAppOpenAd` can be retrieved at any time from `MobileAdsManager.instance.getManagedAppOpenAd()`, and can be shown by calling `showAppOpenAd()` on the `ManagedAppOpenAd` instance. \n\n```dart  \n// Initializing the App Open Ad with a simple\n// AppOpenAdInitializer configuration\nMobileAdsManager.instance.initializeSDK(  \n  appOpenAd: AppOpenAdInitializer(adUnitId: '\u003cAd Unit ID\u003e'),  \n);\n\n// Getting the initialized App Open Ad\nManagedAppOpenAd ad =  MobileAdsManager.instance.getManagedAppOpenAd()!;\n\n// Showing the ad, and automatically disposing it after\n// its done showing\nad.showAppOpenAd();\n```  \n\nApp Open Ads can be shown based on a probabilistic method (for example, when an App Open Ad should be shown 60% of the time a user opens the app) by passing the probability, ranging from `0.0` to `1.0` to `AppOpenAdInitializer.loadChance`.\n\n**Note:**\n- Depending on what `ManagedAppOpenAd.loadChance` is, the `ManagedAppOpenAd` may be null. Passing no value results in a `loadChance` of `1.0`,  which guarantees the `ManagedAppOpenAd` will always be loaded.\n\n```dart  \n// Initializing the App Open Ad with an AppOpenAdInitializer configuration\n// that leads to the Ad being loaded only 70% of the time.\nMobileAdsManager.instance.initializeSDK(  \n  appOpenAd: AppOpenAdInitializer(  \n    adUnitId: '\u003cAd Unit ID\u003e',  \n    loadChance: 0.7,  \n  ),  \n);\n\n// Getting the initialized App Open Ad, which can be null \nManagedAppOpenAd? ad = MobileAdsManager.instance.getManagedAppOpenAd();  \n  \n// Showing the ad if it is not null, with automatic disposal, if its shown  \nad?.showAppOpenAd();\n```  \n\nThe `ManagedAppOpenAd` instance also provides a `dispose` method, to allow for the ad to be manually disposed, in the event it is **not** shown.  This method does **not** need to be called in normal usage.\n\n```dart  \n// Getting the initialized App Open Ad\nManagedAppOpenAd ad =  MobileAdsManager.instance.getManagedAppOpenAd()!;\n\n// Disposing the ad manually, because it is not\n// to be shown\n//\n// Note that calling `dispose` disposes the ad as well as the ManagedAppOpenAd\n// instance, and MobileAdsManager.instance.getManagedAppOpenAd() returns null\n// afterwards.\nad.dispose();\n```  \n\n## Interstitial Ads  \nInterstitial Ads are interacted with through a fully self-managing queue instance of  `ManagedInterstitialAdQueue`,  similar to Rewarded Ads. The queue contains a number of `InterstitialAd`s determined by `InterstitialAdInitializer.count`, and automatically disposes an Ad once it's shown, and loads another in its place.\nIn this way, a small number of ads are always preloaded and ready to be shown, cutting down on waiting times.\n\nThe queue can be initialized by providing an instance of `InterstitialAdInitializer` to `initializeSDK` during SDK initialization, Alternatively, they can also be initialized at any time by calling \n`MobileAdsManager.instance.initializeInterstitialAds`.\n\nAny particular instance of `ManagedInterstitialAdQueue` can be retrieved at any time from `MobileAdsManager.instance.getManagedInterstitialAdQueue()`, and an ad from the queue can be shown by calling `showInterstitialAd()` on the `ManagedInterstitialAdQueue` instance, which also handles disposing the ad and loading another in its place.\n\n**Note:**\n- Always initialize only **one** queue per Interstitial Ad Unit ID. If you need many ads preloaded, because you use one Ad Unit Id throughout your app, for example, consider bumping up the value of `InterstitialAdInitializer.count` to increase the number of ads in the queue\n\n```dart  \n// Initializing 2 instances of ManagedInterstitialAdQueue, one for  \n// each Ad Unit ID, when initializing the SDK  \nMobileAdsManager.instance.initializeSDK(  \n  interstitialAds: \u003cInterstitialAdInitializer\u003e[  \n    // Initializes 3 Interstitial ads each, of \u003cAd Unit ID 1\u003e, and  \n    // \u003cAd Unit ID 2\u003e    \n    InterstitialAdInitializer(adUnitId: '\u003cAd Unit ID 1\u003e', count: 3),  \n    InterstitialAdInitializer(adUnitId: '\u003cAd Unit ID 2\u003e', count: 3),  \n  ],  \n);  \n  \n/// Initializing a 3rd instance of ManagedInterstitialAdQueue, for  \n/// \u003cAd Unit ID 3\u003e, and assigning it to ad3\nManagedInterstitialAdQueue queue3 =  \n    await MobileAdsManager.instance.initializeInterstitialAds(  \n  interstitialAdInitializer: InterstitialAdInitializer(  \n    adUnitId: '\u003cAd Unit ID 3\u003e',  \n    count: 3,  \n  ),  \n);\n  \n// Getting the initialized ManagedInterstitialAdQueue for \u003cAd Unit ID 2\u003e,  \n// if it exists  \nManagedInterstitialAdQueue? queue2 =  \n    MobileAdsManager.instance.getManagedInterstitialAdQueue(  \n  adUnitId: '\u003cAd Unit ID 2\u003e',  \n);  \n  \n// Showing the ad (if it is not null) with a chance to show of 65%,  \n// and automatically disposing it after, if it shows  \nqueue2?.showInterstitialAd(showChance: 0.65);\n\n// Getting all initialized instances of ManagedInterstitialAdQueue, so,  \n// in this example, instances of \u003cAd Unit ID 1\u003e, \u003cAd Unit ID 2\u003e and  \n// \u003cAd Unit ID 3\u003e  \n// \n// Note, if no initialized instances exist, the list will be empty\nList\u003cManagedInterstitialAdQueue\u003e queues =  \n    MobileAdsManager.instance.getAllManagedInterstitialAdQueues();\n```  \n\nEach `ManagedInterstitialAdQueue` instance also provides a `dispose` method, to allow for the queue to be disposed when it is no longer needed (which is unlikely, for normal use-cases).\n\n```dart  \n// Getting the initialized ManagedInterstitialAdQueue for \u003cAd Unit ID 1\u003e,  \n// if it exists  \nManagedInterstitialAdQueue? queue =  \n    MobileAdsManager.instance.getManagedInterstitialAdQueue(  \n  adUnitId: '\u003cAd Unit ID 1\u003e',  \n);  \n  \n// Disposing the queue (if it exists).  \n// Note that calling `dispose` disposes the queue as well as the ManagedInterstitialAdQueue  \n// instance, and MobileAdsManager.instance.getManagedInterstitialAdQueue(adUnitId: '\u003cAd Unit ID 2\u003e');  \n// returns null afterwards.  \nqueue?.dispose();\n```  \n\n**Note:**\n- Calling `dispose` **does not dispose an individual ad**, and rather disposes the entire queue of ads for that Ad Unit ID, as well as the ManagedInterstitialAdQueue instance. Individual ads will be automatically disposed once they're shown, or if they ever fail to load.\n\n## Rewarded Ads  \nRewarded Ads are interacted with through a fully self-managing queue instance of `ManagedRewardedAdQueue`,  similar to Interstitial Ads. The queue contains a number of `RewardedAd`s determined by `RewardedAdInitializer.count`, and automatically disposes an Ad once it's shown, and loads another in its place.  \nIn this way, a small number of ads are always preloaded and ready to be shown, cutting down on waiting times.  \n  \nThe queue can be initialized by providing an instance of `RewardedAdInitializer` to `initializeSDK` during SDK initialization, Alternatively, they can also be initialized at any time by calling  \n`MobileAdsManager.instance.initializeRewardedAds`.  \n  \nAny particular instance of `ManagedRewardedAdQueue` can be retrieved at any time from `MobileAdsManager.instance.getManagedRewardedAdQueue()`, and an ad from the queue can be shown by calling `showRewardedAd()` on the `ManagedRewardedAdQueue` instance, which also handles disposing the ad and loading another in its place.  \n  \n**Note:**  \n- Always initialize only **one** queue per Rewarded Ad Unit ID. If you need many ads preloaded, because you use one Ad Unit Id throughout your app, for example, consider bumping up the value of `RewardedAdInitializer.count` to increase the number of ads in the queue  \n  \n```dart  \n// Initializing 2 instances of ManagedRewardedAdQueue, one for  \n// each Ad Unit ID, when initializing the SDK  \nMobileAdsManager.instance.initializeSDK(  \n  rewardedAds: \u003cRewardedAdInitializer\u003e[  \n    // Initializes 2 Rewarded ads each, of \u003cAd Unit ID 1\u003e, and  \n    // \u003cAd Unit ID 2\u003e    RewardedAdInitializer(adUnitId: '\u003cAd Unit ID 1\u003e', count: 2),  \n    RewardedAdInitializer(adUnitId: '\u003cAd Unit ID 2\u003e', count: 2),  \n  ],  \n);  \n  \n// Initializing a 3rd instance of ManagedRewardedAdQueue, for  \n// \u003cAd Unit ID 3\u003e, and assigning it to ad3  \nManagedRewardedAdQueue queue3 =  \n    await MobileAdsManager.instance.initializeRewardedAds(  \n  rewardedAdInitializer: RewardedAdInitializer(  \n    adUnitId: '\u003cAd Unit ID 3\u003e',  \n    count: 3,  \n  ),  \n);  \n  \n// Getting the initialized ManagedRewardedAdQueue for \u003cAd Unit ID 2\u003e,  \n// if it exists  \nManagedRewardedAdQueue? queue2 =  \n    MobileAdsManager.instance.getManagedRewardedAdQueue(  \n  adUnitId: '\u003cAd Unit ID 2\u003e',  \n);  \n  \n// Showing the ad (if it is not null) with a chance to show of 65%,  \n// and automatically disposing it after, if it shows  \nqueue2?.showRewardedAd(  \n  showChance: 0.65,  \n  onUserEarnedReward: (AdWithoutView ad, RewardItem reward) {  \n    // Give the user a reward  \n  },  \n);  \n  \n// Getting all initialized instances of ManagedRewardedAdQueue, so,  \n// in this example, instances of \u003cAd Unit ID 1\u003e, \u003cAd Unit ID 2\u003e and  \n// \u003cAd Unit ID 3\u003e  \n//  \n// Note, if no initalized instances exist, the list will be empty  \nList\u003cManagedRewardedAdQueue\u003e queues =  \n    MobileAdsManager.instance.getAllManagedRewardedAdQueues();\n```    \n\nEach `ManagedRewardedAdQueue` instance also provides a `dispose` method, to allow for the queue to be disposed when it is no longer needed (which is unlikely, for normal use-cases).  \n  \n```dart  \n// Getting the initialized ManagedRewardedAdQueue for \u003cAd Unit ID 1\u003e,  \n// if it exists  \nManagedRewardedAdQueue? queue =  \n    MobileAdsManager.instance.getManagedRewardedAdQueue(  \n  adUnitId: '\u003cAd Unit ID 1\u003e',  \n);  \n  \n// Disposing the queue (if it exists).  \n// Note that calling `dispose` disposes the queue as well as the ManagedRewardedAdQueue  \n// instance, and MobileAdsManager.instance.getManagedRewardedAdQueue(adUnitId: '\u003cAd Unit ID 2\u003e');  \n// returns null afterwards.  \nqueue?.dispose();\n```    \n\n**Note:**  \n- Calling `dispose` **does not dispose an individual ad**, and rather disposes the entire queue of ads for that Ad Unit ID, as well as the ManagedRewardedAdQueue instance. Individual ads will be automatically disposed once they're shown, or if they ever fail to load.\n\n## Banner Ads\nBanner ads are interacted with through a self-managing instance of `ManagedBannerAd`. \n\nThe instance manages initializing the ad with the provided callbacks, loading the ad, and disposing it on load failure. The actual `BannerAd` itself, for display by an `AdWidget` provided by ` google_mobile_ads`, can be retrieved with a call to `ManagedBannerAd.getAd()`.\n\n`ManagedBannerAd`s can be initialized by providing an instance of `BannerAdInitializer` to `initializeSDK` during SDK initialization. Alternatively, they can also be initialized at any time by calling  \n`MobileAdsManager.instance.initializeBannerAds`.  \n\nAny particular instance of `ManagedBannerAd` can also be retrieved at any time from `MobileAdsManager.instance.getManagedBannerAd` by passing it the Ad Unit ID. \nA `List` of all `ManagedBannerAd`s can be retrieved from `MobileAdsManager.instance.getAllManagedBannerAds`.\n\n```dart  \n// Initializing 2 instances of ManagedBannerAd, one for  \n// each Ad Unit ID, when initializing the SDK  \nMobileAdsManager.instance.initializeSDK(  \n  bannerAds: \u003cBannerAdInitializer\u003e[  \n    BannerAdInitializer(  \n      adUnitId: '\u003cAd Unit ID 1\u003e',  \n      bannerAdSize: AdSize.banner,  \n    ),  \n    BannerAdInitializer(  \n      adUnitId: '\u003cAd Unit ID 2\u003e',  \n      bannerAdSize: AdSize.banner,  \n    ),  \n  ],  \n);  \n  \n// Initializing the 3rd instance of ManagedBannerAd, for  \n// \u003cAd Unit ID 3\u003e, when initializing the SDK  \nManagedBannerAd ad3 = await MobileAdsManager.instance.initializeBannerAds(  \n  bannerAdInitializer: BannerAdInitializer(  \n    adUnitId: '\u003cAd Unit ID 3\u003e',  \n    bannerAdSize: AdSize.banner,  \n  ),  \n);  \n  \n// Getting the initialized ManagedBannerAd for \u003cAd Unit ID 2\u003e,  \n// if it exists  \nManagedBannerAd? ad2 = MobileAdsManager.instance.getManagedBannerAd(  \n  adUnitId: '\u003cAd Unit ID 2\u003e',  \n);  \n  \n// Configuring the ad widget, which is how the banner ad is actually shown.  \n// This is part of the google_mobile_ads package.  \nWidget adWidget = AdWidget(ad: ad2!.getAd());  \n  \n// Getting all initialized instances of ManagedBannerAd, so,  \n// in this example, instances of \u003cAd Unit ID 1\u003e, \u003cAd Unit ID 2\u003e and  \n// \u003cAd Unit ID 3\u003e  \n//  \n// Note, if no initialized instances exist, the list will be empty  \nList\u003cManagedBannerAd\u003e ads = MobileAdsManager.instance.getAllManagedBannerAds();\n```\n\nThe `ManagedBannerAd` instance also provides a `dispose` method, to be called when the `AdWidget` is removed from the widget tree. This method will almost always need to be called at some point when using `ManagedBannerAd`s. (If, for example your app only has one static screen, then the `AdWidget` is never removed from the widget tree, and `dispose` is never called).\n\n```dart  \n/// .... Other Widget code, including ad2's initialization  \n@override  \nvoid dispose() {  \n  /// Disposing the banner ad via the dispose method  \n  /// on the ManagedBannerAd instance  \n  ///  \n  /// Note that undefined behavior will result if dispose \n  /// is called on the banner ad itself  \n  ad2.dispose();  \n  \n  super.dispose();  \n}  \n/// .... Other Widget code\n```    \n\n**Note:**\n- As per the AdMob [docs](https://developers.google.com/admob/flutter/banner/get-started), the `BannerAd` should be disposed when the `AdWidget` is removed from the widget tree. When using `ManagedBannerAd` to manage banner ads, instead of calling `dispose` on the `BannerAd` itself, `dispose` **must** be called on the instance of `ManagedBannerAd`. If this is not done, undefined behavior may result, with `MobileAdManager` referencing already disposed banner ads, and returning them in response to queries.\n- If no instances of `ManagedBannerAd`s exist, then an empty `List` of type `ManagedBannerAd` is returned from `MobileAdsManager.instance.getAllManagedBannerAds`\n- Always initialize only **one** banner ad per banner Ad Unit ID. If you need many ads preloaded, consider using different banner Ad Unit IDs.\n\n## License\nThis package is licensed under the Apache License, Version 2.0\n\n```\nCopyright 2023 Tanzil Zubair Bin Zaman\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftanzilzubair%2Fgoogle_mobile_ads_manager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftanzilzubair%2Fgoogle_mobile_ads_manager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftanzilzubair%2Fgoogle_mobile_ads_manager/lists"}