Search code examples
python-2.7api-designconstantcontact

How to successfully load bulk contacts into constant contact API via python?


I need to bulk load contacts to particular list via Constant Contact API (http://developer.constantcontact.com/docs/contacts-api/contacts-collection.html?method=POST).

I can successfully add contacts using the same JSON string as below into the following API GUI website(https://constantcontact.mashery.com/io-docs (find Tab POST 'add contact' to collection):

update_contact = {"lists": [{"id": "1"}],"email_addresses": [{"email_address": "yasmin1.abob19955@gmail.com"}],"first_name": "Ronald","last_name": "Martone"}

However when I run the same JSON string in my python code I get error 400 with the error message from my response object as the following:

  [{"error_key":"query.param.invalid","error_message":"The query parameter first_name is not supported."},
{"error_key":"query.param.invalid","error_message":"The query parameter last_name is not supported."},{"error_key":"query.param.invalid","error_message":"The query parameter lists is not supported."},{"error_key":"query.param.invalid","error_message":"The query parameter email_addresses is not supported."}]

How can two of the same API calls produce different results?and how do I get my python code to work?

code:

import requests

    headers = {

            'Authorization': 'Bearer X',
            'X-Originating-Ip': '1',
            'Content-Type': 'application/json'

        }
    update_contact = {"lists": [{"id": "1"}],"email_addresses": [{"email_address": "yasmin1.abob19955@gmail.com"}],"first_name": "Ronald","last_name": "Martone"}

    r_2 = requests.post('https://api.constantcontact.com/v2/contacts?action_by=ACTION_BY_OWNER&api_key=x', headers=headers ,params = update_contact)

    print(r_2.text)

Solution

  • You will need to change params to data

    r_2 = requests.post('https://api.constantcontact.com/v2/contacts?action_by=ACTION_BY_OWNER&api_key=x', headers=headers ,data = update_contact)
    

    Additionally, you can use a multipart endpoint to upload contacts as well. I have found this to be very easy especially if your contacts are in a csv file.

    A sample code would look like this:

    import requests as r
    import csv
    from datetime import datetime
    
    url = 'https://api.constantcontact.com/v2/activities/addcontacts?api_key=<your_api_key>'
    
    headers = {'Authorization': 'Bearer <access_token>',
               'X-Originating-Ip': '<ip>', 
               'content-type': 'multipart/form-data'}
    
    files = {'file_name': 'Book1.csv', 
             'data': ('Book1.csv', open('Book1.csv', 'rb'), 
             'application/vnd.ms-excel', {'Expires': '0'}),
             'lists':('<insert_listIds_seperated_by_commas>')}
    
    response = r.post(url, headers=headers, files=files)
    with open('CC_Upload_Response_Data.csv', 'a', newline='') as f:
        writer = csv.writer(f)
        time_stamp = datetime.now().strftime('%m-%d-%Y %H:%M')
        row = [response, response.text, time_stamp]
        writer.writerow(row)
    

    The headers of your csv file need to be like so: "First Name" "Last Name" "Email Address" "Custom Field 1" "Custom Field 2" and so on. You can find a complete list of column names here: http://developer.constantcontact.com/docs/bulk_activities_api/bulk-activities-import-contacts.html

    The csv file that this code appends acts like a log if you are going to schedule you .py file to run nightly. The log records the response code, response text and adds a timestamp.

    Mess around with it a little and get it the way you like.