I have created this code to fetch leads from Facebook:

import pandas as pd from facebook_business.api import FacebookAdsApi from facebook_business.adobjects.adaccount import AdAccount from facebook_business.adobjects.ad import Ad from facebook_business.adobjects.user import User from facebook_business.adobjects.lead import Lead import requests from datetime import datetime import time # Permanent Access Token access_token = "my_token" facebook_api = FacebookAdsApi.init(access_token=access_token) start_date = '2023-07-01'  end_date = '2023-07-31'  account_id = "my_ad_account_id" lead_fields = ['campaign_name',"created_time","field_data"] lead_params = {                 'filtering': [{'field': 'time_created', 'operator': 'GREATER_THAN', 'value': start_date},                               {'field': 'time_created', 'operator': 'LESS_THAN', 'value': end_date}                              ]               } leads_list = [] # Getting ads ad_account = AdAccount(account_id) ads = ad_account.get_ads() for ad in ads:   leads = ad.get_leads(fields=lead_fields,params=lead_params)   for lead in leads:     lead_dic = {}     lead_dic["campaign_name"] = lead["campaign_name"]     lead_dic["created_time"] = lead["created_time"]     field_data = lead["field_data"]     for field in field_data:       lead_dic[field["name"]] = field["values"][0]     leads_list.append(lead_dic) print(leads_list) 

It works for my test account that has few ads, but I get an limit error when I try to use it with my main account.

I figure that I should use batch request, but I could not make it work. Can someone please help to to adapt this code so it does not get limit errors?

Tag:facebook, facebook-business-sdk, facebook-graph-api, facebook-opengraph, facebook-python-business-sdk

3 comments.

  1. Jeevan ebi

    Basically, batch requests allow you to group multiple requests and send them as a single HTTP request, reducing the chance of exceeding the rate limits.

    it works for my test account that has few ads, but I get an limit error when I try to use it with my main account.

    Updated implementation with batch request:

    import pandas as pd from facebook_business.api import FacebookAdsApi from facebook_business.adobjects.adaccount import AdAccount from facebook_business.adobjects.ad import Ad from facebook_business.adobjects.lead import Lead from facebook_business.exceptions import FacebookRequestError from facebook_business.adobjects.batch import Batch import requests from datetime import datetime import time # Permanent Access Token access_token = "YOUR_TOKEN" FacebookAdsApi.init(access_token=access_token) start_date = '2023-07-01' end_date = '2023-07-31' account_id = "YOUR_AD_ACCOUNT_ID" lead_fields = ['campaign_name', "created_time", "field_data"] lead_params = { 'filtering': [ {'field': 'time_created', 'operator': 'GREATER_THAN', 'value': start_date}, {'field': 'time_created', 'operator': 'LESS_THAN', 'value': end_date} ] } leads_list = [] # Getting ads ad_account = AdAccount(account_id) ads = ad_account.get_ads() batch = Batch(FacebookAdsApi.get_default_api(), 'GET', '', [], [lead_fields]) for ad in ads: batch.add_request( ad.get_leads(fields=lead_fields, params=lead_params) ) if len(batch) >= 50: # Facebook batch limit is 50 requests per batch try: batch.execute() for response in batch: if response.is_success(): for lead in response.json(): lead_dic = {} lead_dic["campaign_name"] = lead.get("campaign_name") lead_dic["created_time"] = lead.get("created_time") field_data = lead.get("field_data", []) for field in field_data: lead_dic[field["name"]] = field["values"][0] leads_list.append(lead_dic) else: print(f"Error: {response.error()}") except FacebookRequestError as e: print(f"Facebook Request Error: {e.api_error_code()}, {e.api_error_message()}") batch = Batch(FacebookAdsApi.get_default_api(), 'GET', '', [], [lead_fields]) # Execute any remaining requests in the batch if len(batch) > 0: try: batch.execute() for response in batch: if response.is_success(): for lead in response.json(): lead_dic = {} lead_dic["campaign_name"] = lead.get("campaign_name") lead_dic["created_time"] = lead.get("created_time") field_data = lead.get("field_data", []) for field in field_data: lead_dic[field["name"]] = field["values"][0] leads_list.append(lead_dic) else: print(f"Error: {response.error()}") except FacebookRequestError as e: print(f"Facebook Request Error: {e.api_error_code()}, {e.api_error_message()}") print(leads_list)

    Refer:

    https://github.com/facebook/facebook-python-business-sdk https://github.com/facebook/facebook-python-business-sdk/blob/main/examples/batch_create.py
    1. user3347814

      Thank you so much for your answer. I will test the code and award you bounty soon. Meanwhile, could please you explain what the parameters of this function do? batch = Batch(FacebookAdsApi.get_default_api(), 'GET', '', [], [lead_fields]) and where in the documentation I can find a description of who this work?

    2. user3347814

      When I try to run this code I get this error: No module named 'facebook_business.adobjects.batch'. Could you please help me?

Add a new comment.