Campaign Monitor is a service where we can send emails to a set of subscribers. We can create multiple lists within Campaign Monitor and add the required users to these lists as subscribers(to whom we can send personalised emails). So, here I am trying to send a set of customers’ details like their name, emails, total_bookings, and first_booking to the campaign monitor’s list using the API in Python so that I can send emails to this set of users. More details on campaign monitor: https://www.campaignmonitor.com/api/v3-3/subscribers/
I am new to using Campaign Monitor. I have searched documentation, a lot of posts and blogs for examples on how to push data with multiple custom fields to Campaign Monitor using Python. By default, a list in Campaign Monitor will have a name and an email that can be added, but I want to add other details for each subscriber(here I want to add total_bookings and first_booking data) and Campaign Monitor provides custom fields to achieve this.
For instance:
I have my data stored in a redshift table named customer_details
with the fields name, email, total_bookings, first_booking. I was able to retrieve this data from redshift table using Python with the following code.
# Get the data from the above table: cursor = connection.cursor() cursor.execute("select * from customer_details") creator_details = cursor.fetchall() # Now I have the data as a list of sets in creator_details
Now I want to push this data to a list in the Campaign Monitor using API like request.put('https://api.createsend.com/api/../.../..')
. But I am not sure on how to do this. Can someone please help me here.
Advertisement
Answer
400 indicated invalid parameters
we can first see the request is POST not PUT
so first change requests.put
to requests.post
the next thing is that all the variables need to be sent either as www-formdata or as json body data not sure which
and lastly you almost certainly cannot verify with basic auth … but maybe
something like the following
some_variables = some_values ... header = {"Authorization": f"Bearer {MY_API_KEY}"} data = {"email":customer_email,"CustomFields":[{"key":"total_bookings","value":customer_details2}]} url = f'https://api.createsend.com/api/v3.3/subscribers/{my_list_id}.json' res = requests.post(url,json=data,headers=header) print(res.status_code) try: print(res.json()) except: print(res.content)
after looking more into the API docs it looks like this is the expected request
{ "EmailAddress": "subscriber@example.com", "Name": "New Subscriber", "MobileNumber": "+5012398752", "CustomFields": [ { "Key": "website", "Value": "http://example.com" }, { "Key": "interests", "Value": "magic" }, { "Key": "interests", "Value": "romantic walks" } ], "Resubscribe": true, "RestartSubscriptionBasedAutoresponders": true, "ConsentToTrack":"Yes" }
which we can see has "EmailAddress"
not "email"
so you would need to do
data = {"EmailAddress":customer_email,"CustomFields":[{"key":"total_bookings","value":customer_details2}]}
Im not sure if all of the fields are required or not … so you may also need to provide "Name","MobileNumber",Resubscribe",etc
and looking at “Getting Started” it looks like the publish a python package to make interfacing simpler
http://campaignmonitor.github.io/createsend-python/
which makes it as easy as
import createsend cli = createsend.CreateSend({"api_key":MY_API_KEY}) cli.subscriber.add(list_id,"user@email.com","John Doe",custom_fields,True,"No")
(which I found here https://github.com/campaignmonitor/createsend-python/blob/master/test/test_subscriber.py#L70)