Search code examples
facebook-marketing-apifacebook-java-api

AdSets api call Facebook


I am using Java SDK for marketing API from Facebook. I have problems with reading the Insights. I call the adsets of my account and for each adset I call the getInsights() function. Between requests for insights of tow different adsets I have a Thread.sleep(5000). But however, I still get error 17 : "User request limit reached". I use this code:

public static final APIContext context = new APIContext(
            "ACCESS TOKEN",
            "SECRET KEY"
    );
public static void main(String[] args) throws APIException, ParseException
{

    String sDate1="2018-04-01"; 
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd");

    Calendar c = Calendar.getInstance();
    String finala="2018-07-16";  
    Date datefinal=new SimpleDateFormat("yyyy-MM-dd").parse(finala); 
    System.out.println(datefinal);
    c.setTime(df.parse(sDate1));

    sDate1=df.format(c.getTime());
    System.out.println(c.getTime());

    while(!datefinal.before(c.getTime())) {
            System.out.println(df.format(c.getTime()));
    try {   
        AdAccount account = new AdAccount("ACCOUNT ID", context);
            try {
            APINodeList<AdSet> adsets = account.getAdSets().setTimeRange("{\"since\":\""+sDate1+"\",\"until\":\""+sDate1+"\"}").requestAllFields().execute();
            adsets = adsets.withAutoPaginationIterator(true);
            for(AdSet adset : adsets) {
                System.out.println(adset.getFieldName());
                Thread.sleep(5000);
                //System.out.println(adset.getFieldId());
                APINodeList<AdsInsights> adsInsightss = adset.getInsights()
                      .setTimeRange("{\"since\":\""+sDate1+"\",\"until\":\""+sDate1+"\"}")
                      .requestField("campaign_name")
                      .requestField("clicks")
                      .requestField("cpc")
                      .requestField("cpm")
                      .requestField("cpp")
                      .requestField("ctr")
                      .requestField("date_start")
                      .requestField("date_stop")
                      .requestField("frequency")
                      .requestField("impressions")
                      .requestField("reach")
                      .requestField("spend")
                      .requestField("unique_clicks")
                      .requestField("unique_ctr")
                      .requestField("website_ctr")
                      .requestField("website_purchase_roas")
                      .execute();
                if(adsInsightss.size()>0) {
                    System.out.println(adset.getFieldName());

                    }

            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    } catch (ClassNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    c.setTime(df.parse(sDate1));
    c.add(Calendar.DATE, 1);

    sDate1=df.format(c.getTime());

    }
}

I would like to get only the ad sets that have at least one impression in the date range I specify. Or at least get all the insights in one call. Thanks!


Solution

  • I resolved it by replacing the code from try block with :

    APINodeList<AdsInsights> adsInsightss = account.getInsights().setTimeRange("{\"since\":\""+sDate1+"\",\"until\":\""+sDate1+"\"}").setLevel(AdsInsights.EnumLevel.VALUE_ADSET).setParam("limit", 1000).requestField("adset_name")
                              .requestField("campaign_name")
                              .requestField("clicks")
                              .requestField("cpc")
                              .requestField("cpm")
                              .requestField("cpp")
                              .requestField("ctr")
                              .requestField("date_start")
                              .requestField("date_stop")
                              .requestField("frequency")
                              .requestField("impressions")
                              .requestField("reach")
                              .requestField("spend")
                              .requestField("unique_clicks")
                              .requestField("unique_ctr")
                              .requestField("website_ctr")
                              .requestField("website_purchase_roas")
                              .requestField("action_values").execute();