Search code examples
pythontwitterads-api

Campaign cost (total spend) from Twitter Ads API


I am trying to pull campaign costs/total spend from the API I am 100% new to the API and I am not able to crack it through

I want to : 1- get cost per campaign 2- get campaign ids that showup on the GUI not just the kind of weird codes ie 8cdfn vs 1448530943

here is my python code so far

    from twitter_ads.client import Client
    from twitter_ads.cursor import Cursor
    from twitter_ads.http import Request
    from twitter_ads.error import Error
    import time
    from twitter_ads.campaign import LineItem
    from twitter_ads.enum import METRIC_GROUP
    from twitter_ads.enum import GRANULARITY
    client = Client(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
    account = client.accounts(ACCOUNT_ID)
    cids = map(lambda x: x.id, account.campaigns())
    resource = ‘/2/stats/accounts/{account_id}/’.format(account_id=account.id)
    params = { ‘entity’:‘CAMPAIGN’,
    ‘entity_ids’:cids,
    ‘start_time’: ‘2017-12-10’,
    ‘end_time’:‘2017-12-16’,
    ‘granularity’:‘TOTAL’,
    ‘metric_groups’: ‘BILLING’,
    ‘placement’: ‘PUBLISHER_NETWORK’}

    try, build and execute the request with error handling
    try:
    response = Request(client, ‘get’, resource, params=params).perform()
    print(response.body[‘data’])
    except Error as e:
    # see twitter_ads.error for more details
    print e.details
    raise

Solution

  • Here is the solution that worked for me the trick is that passing multiple placements doesn't work in the API

    from datetime import date,timedelta
    import datetime
    import logging
    import sys
    import os
    import gzip
    import shutil
    import csv
    import requests
    import json
    from twitter_ads.client import Client
    from twitter_ads.cursor import Cursor
    from twitter_ads.http import Request
    from twitter_ads.error import Error
    from twitter_ads.client import Client
    from twitter_ads.campaign import LineItem
    from twitter_ads.enum import METRIC_GROUP
    from twitter_ads.enum import GRANULARITY
    import twitter_ads
    import time
    client = Client(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
    
    
    
    # load the advertiser account instance
      account = client.accounts(ACCOUNT_ID)
      cids = list(map(lambda x: x.id.encode('utf-8'), account.campaigns()))
      campaigns = list(map(lambda x: [x.id.encode('utf-8'),x.name.encode('utf-8'), int(x.id,36)] , account.campaigns()))
      resource = '/2/stats/accounts/{account_id}/'.format(account_id=account.id)
      spend=[]
      for c in campaigns:
        for p in ['ALL_ON_TWITTER', 'PUBLISHER_NETWORK']:
          params = { 'entity':'CAMPAIGN',
      'entity_ids':c[0], #cids,
      'start_time': target_date,
      'end_time':target_date+timedelta(1),
      'granularity':'DAY',
      'metric_groups': ['BILLING','ENGAGEMENT'],
             'placement': p
               }
    
    # try, build and execute the request with error handling
          try:
            req =Request(client, 'get', resource, params=params)
            response = req.perform()
            val = response.body['data']
            val.append(p)
            val.append(c[0])
            val.append(c[1])
            val.append(c[2])
            spend.append(val)
          except Error as e:
            # see twitter_ads.error for more details
            print e.details
            raise
      ddd= json.loads(json.dumps(spend))
      with open(target_path+row['account_id']+'_campaign_spend.csv', "w") as output:
        writer = csv.writer(output, lineterminator='\n')
        writer.writerow(['time_id','campaign_id_36', 'campaign_id','campaign_desc','placement','spend_micro', 'account_id'])
        for val in ddd:
            if (val[0]["id_data"][0]["metrics"]['billed_charge_local_micro'] and val[0]["id_data"][0]["metrics"]['billed_charge_local_micro'][0]):
              writer.writerow([str(target_date).replace("/","-"),val[2],val[4],val[3],val[1], val[0]["id_data"][0]["metrics"]['billed_charge_local_micro'][0], ACCOUNT_ID])