I'm working on an app using the Threads API from meta. I have created the application successfully on the developer console, and am trying to test access using the Graph API Explorer. I've selected "threads.net" from the endpoint dropdown, and the application I created from the "Meta app" dropdown, but when I try to generate an access token, the approval window appears, I click continue, and then it just says "URL Blocked"

Is there something I'm missing?

What I am doing doing

  • I have the below code where the AD is Displaying
  • I am using google AD-Mob
  • AD is displaying fine

What I am trying to understand

  • onAdImpression() is not triggered when the view is rendered in the screen instead its triggered when I click the AD, GO to the designated AD and return back to the APP where the AD container is present
  • Is it supposed to work this way or onAdImpression() should be triggered as soon as the AD is rendered on the screen
@Composable fun BannerAdView(adUnitId: String) {     val context = LocalContext.current     val adView = remember { AdView(context) }          AndroidView(         factory = {             adView.apply {                 setAdSize(AdSize.BANNER)                 this.adUnitId = adUnitId                 adListener = object : AdListener() {                     override fun onAdLoaded() {                         // Called when an ad is loaded.                     }                     override fun onAdFailedToLoad(error: LoadAdError) {                         // Called when an ad fails to load.                     }                     override fun onAdOpened() {                         // Called when an ad opens an overlay that covers the screen.                     }                     override fun onAdClicked() {                         // Called when an ad is clicked.                     }                     override fun onAdClosed() {                         // Called when the user is about to return to the app after tapping on an ad.                     }                     override fun onAdImpression() {                         // Called when an ad impression is recorded.                         Log.d("AdImpression", "Ad impression recorded")                     }                 }                 loadAd(AdRequest.Builder().build())             }         },         update = {             it.loadAd(AdRequest.Builder().build())         }     ) } 

When asking adding extra permissions to the scope argument of my FB login button, those permissions aren't added to the access token.

I'm building an app (with Next.js) that let's you schedule posts to a users profile page.

The user I'm testing with has the Role of Tester in my app, so app permissions shouldn't be a problem.

This is my code:

facebook async init code

useEffect(() => {         window.fbAsyncInit = function () {             // @ts-ignore             FB.init({                 appId: process.env.NEXT_PUBLIC_FACEBOOK_APP_ID,                 cookie: true,                 xfbml: true,                 version: process.env.NEXT_PUBLIC_FACEBOOK_API_VERSION, // v20.0             });             // @ts-ignore             FB.AppEvents.logPageView();             // @ts-ignore             FB.getLoginStatus(function (response) {                 console.log('login status:', response)             });         };         (function (d, s, id) {             var js, fjs = d.getElementsByTagName(s)[0];             if (d.getElementById(id)) { return; }             js = d.createElement(s); js.id = id;             // @ts-ignore             js.src = "https://connect.facebook.net/en_US/sdk.js";             // @ts-ignore             fjs.parentNode.insertBefore(js, fjs);         }(document, 'script', 'facebook-jssdk'));     }, []); 

the login button onClick handler:

const loginWithShowListPerm = () => {         // @ts-ignore         FB.login(function (response) {             (async () => {                 console.log('login response:', response)                 if (response.status === 'connected') {                     const params: GraphApiParams = {                         accessToken: response.authResponse.accessToken,                         platformUserId: response.authResponse.userID,                     }                     await saveAccessToken(params);                     const accessTokenData = await getAccessTokenData(params);                     console.log('accessTokenData:', accessTokenData);                     // User is logged in and authorized                     // Execute your function here                 }             })();         }, { scope: 'pages_show_list' }); 

the convertToLongLivedAccessToken backend method this method is called by the server action saveAccessToken

export async function convertToLongLivedAccessToken({     userAccessToken, }: {     userAccessToken: string, }) {     try {         const response = await fetch(`https://graph.facebook.com/${process.env.NEXT_PUBLIC_FACEBOOK_API_VERSION}/oauth/access_token`, {             method: 'POST',             headers: {                 'Content-Type': 'application/json',             },             body: JSON.stringify({                 grant_type: 'fb_exchange_token',                 client_id: process.env.NEXT_PUBLIC_FACEBOOK_APP_ID,                 client_secret: process.env.FACEBOOK_APP_SECRET,                 fb_exchange_token: userAccessToken,             }),         });         const data = await response.json();         console.log('data:', data);         return data.access_token;     } catch (error) {         console.error('Error converting to Long Lived Access Token:', error);         return null;     } } 

node.js script to check token permissions:

 async function main() { try { const response = await fetch(`https://graph.facebook.com/v20.0/me/permissions?access_token=${accessToken}`);         if (!response.ok) {             throw new Error(`HTTP error! status: ${response.status}`);         }              const data = await response.json();              console.log('Data:', data);          } catch (error) {         console.error('Error fetching user permissions:', error);     } } main(); 

Even when adding { scope: 'pages_show_list' } attribute to the login button code, both the short lived and the long lived tokens return this when testing with the check permissions script:

 Data: { data: \[ { permission: 'public_profile', status: 'granted' } \] } 

as you can see, only the default granted 'public_profile' permission is included, the 'pages_show_list' is missing. I would expect there to at least be a mention of the permission, either with status 'granted' or something else.

Help would be greatly apreciated.

Hi,
I would like to test the Threads API. First, I discovered it was not possible to add the Threads API access to an existing app... so I created a new one with the use case Threads. But 2 apps were created with the same name: one with Threads access and another one without Threads access. For the first one, I am not able to test anything in the Graph Explorer Tool because when I click on "generate access token" I get the error "Facebook Login is currently unavailable for this app, since we are updating additional details for this app. Please try again later." as you can see in the enclosed screenshot.
What can I do to test it please?
Thanks in advance!