The issue: update/adding values to one custom fields removes values to all other previously set custom fields. How do add custom field values without the API clearing all other custom fields?
Background:
I have created three custom fields that are "dates". These dates represent the dates when the user has taken actions (e.g., "registered" and "subscribed"). API put call to the contacts endpoint
https://api.cc.email/v3/contacts/<<contact_id>>
with the custom fields JSON in the body does update the contact record, e.g.,
"custom_fields": [{"custom_field_id": "161d4560-ff1f-11ed-8035-fa163e1233be","value": "5/31/2023"}]
However, when a subsequent call to the contacts endpoint to add/update another custom field, does add the custom field value, but it deletes all other custom field values that were previously set. Here is the custom field request, e.g.,
"custom_fields": [{"custom_field_id": "eb96fd80-4434-11e9-86fd-d4ae529a863c","value": "6/1/2024"}]
It's not my code. I confirmed this behavior using the "try" capability in the developer reference:
https://developer.constantcontact.com/api_reference/index.html#!/Contacts/putContact
Solved! Go to Solution.
Hello josephineo,
Thank you for reaching out to Constant Contact API Developer Support. My team is here to assist outside software developers with questions about building into Constant Contact's API.
When Updating an existing contact using PUT /Contacts, we need to append the new information to the old information and send all of it back in the request, because when you update a contact using a PUT, all properties are updated, overwriting all existing property values. Any properties left blank or not included in the PUT will be overwritten with a null value.
Here's the flow you'll want to use to ensure that data is not overwritten for existing contacts:
First, check to see if the contact exists in the account using the email query parameter to search for a contact using a specific email address.
For the GET /contacts call, this is how we'll want to format the request URL to make sure we're checking for deleted or unsubscribed contacts, rather than just active ones, and ensure that we are retrieving all of the existing contact data to send back with the new contact data
GET
{
"contact_id": "1618ae62-4752-11e9-9c8a-fa163e6b01c1",
"email_address": {
"address": "dlang@example.com",
"permission_to_send": "implicit",
"created_at": "2016-03-03T15:53:04.000+00:00",
"updated_at": "2016-03-03T15:56:29.000+00:00",
"opt_in_source": "Contact",
"opt_in_date": "2016-01-23T13:48:44.108Z",
"confirm_status": "confirmed"
},
"first_name": "Debora",
"last_name": "Lang",
"update_source": "Contact",
"create_source": "Account",
"created_at": "2016-01-23T13:48:44.108Z",
"updated_at": "2016-01-23T13:48:44.108Z",
"deleted_at": "2016-07-08",
"custom_fields": [
{
"custom_field_id": "1618ae62-4752-11e9-9c8a-fa163e6b01c1",
"value": "Existing Custom Field Value"
}
],
[ … ]
You need to append the returned data with the new data and send all of it back with PUT to update the contact.
So, from that response body, the "contact_id" is going to go in our PUT /contacts URL, and then you'll take the rest of the data from the response to build your request body like so:
PUT
https://api.cc.email/v3/contacts/1618ae62-4752-11e9-9c8a-fa163e6b01c1
{
"email_address": {
"address": "dlang@example.com",
"permission_to_send": "implicit",
"created_at": "2016-03-03T15:53:04.000+00:00",
"updated_at": "2016-03-03T15:56:29.000+00:00",
"opt_in_date": "2016-01-23T13:48:44.108Z",
"confirm_status": "confirmed"
},
"first_name": "Debora",
"last_name": "Lang",
"update_source": "Account",
"custom_fields": [
{
"custom_field_id": "1618ae62-4752-11e9-9c8a-fa163e6b01c1",
"value": "Existing Custom Field Value"
},
{
"custom_field_id": "f1a83568-b41c-11eb-839c-fa163ed93e4f",
"value": "New Custom Field value 1"
},
{
"custom_field_id": "f1a83568-b41c-11eb-839c-fa163ed93e4f",
"value": "New Custom Field value 2"
}
],
[...]
PUT (update) a Contact
https://v3.developer.constantcontact.com/api_reference/index.html#!/Contacts/putContact
Alternately, you could instead use our Bulk Activities endpoints, which work similarly to uploading a spreadsheet within the UI, and only adds/updates the data that you provide:
V3 Bulk Activity - Import Contacts
https://v3.developer.constantcontact.com/api_guide/import_contacts.html
Please have a look and let us know if you have any other questions!
Hello josephineo,
Thank you for reaching out to Constant Contact API Developer Support. My team is here to assist outside software developers with questions about building into Constant Contact's API.
When Updating an existing contact using PUT /Contacts, we need to append the new information to the old information and send all of it back in the request, because when you update a contact using a PUT, all properties are updated, overwriting all existing property values. Any properties left blank or not included in the PUT will be overwritten with a null value.
Here's the flow you'll want to use to ensure that data is not overwritten for existing contacts:
First, check to see if the contact exists in the account using the email query parameter to search for a contact using a specific email address.
For the GET /contacts call, this is how we'll want to format the request URL to make sure we're checking for deleted or unsubscribed contacts, rather than just active ones, and ensure that we are retrieving all of the existing contact data to send back with the new contact data
GET
{
"contact_id": "1618ae62-4752-11e9-9c8a-fa163e6b01c1",
"email_address": {
"address": "dlang@example.com",
"permission_to_send": "implicit",
"created_at": "2016-03-03T15:53:04.000+00:00",
"updated_at": "2016-03-03T15:56:29.000+00:00",
"opt_in_source": "Contact",
"opt_in_date": "2016-01-23T13:48:44.108Z",
"confirm_status": "confirmed"
},
"first_name": "Debora",
"last_name": "Lang",
"update_source": "Contact",
"create_source": "Account",
"created_at": "2016-01-23T13:48:44.108Z",
"updated_at": "2016-01-23T13:48:44.108Z",
"deleted_at": "2016-07-08",
"custom_fields": [
{
"custom_field_id": "1618ae62-4752-11e9-9c8a-fa163e6b01c1",
"value": "Existing Custom Field Value"
}
],
[ … ]
You need to append the returned data with the new data and send all of it back with PUT to update the contact.
So, from that response body, the "contact_id" is going to go in our PUT /contacts URL, and then you'll take the rest of the data from the response to build your request body like so:
PUT
https://api.cc.email/v3/contacts/1618ae62-4752-11e9-9c8a-fa163e6b01c1
{
"email_address": {
"address": "dlang@example.com",
"permission_to_send": "implicit",
"created_at": "2016-03-03T15:53:04.000+00:00",
"updated_at": "2016-03-03T15:56:29.000+00:00",
"opt_in_date": "2016-01-23T13:48:44.108Z",
"confirm_status": "confirmed"
},
"first_name": "Debora",
"last_name": "Lang",
"update_source": "Account",
"custom_fields": [
{
"custom_field_id": "1618ae62-4752-11e9-9c8a-fa163e6b01c1",
"value": "Existing Custom Field Value"
},
{
"custom_field_id": "f1a83568-b41c-11eb-839c-fa163ed93e4f",
"value": "New Custom Field value 1"
},
{
"custom_field_id": "f1a83568-b41c-11eb-839c-fa163ed93e4f",
"value": "New Custom Field value 2"
}
],
[...]
PUT (update) a Contact
https://v3.developer.constantcontact.com/api_reference/index.html#!/Contacts/putContact
Alternately, you could instead use our Bulk Activities endpoints, which work similarly to uploading a spreadsheet within the UI, and only adds/updates the data that you provide:
V3 Bulk Activity - Import Contacts
https://v3.developer.constantcontact.com/api_guide/import_contacts.html
Please have a look and let us know if you have any other questions!
Thanks. Seems easiest to use a JSON payload POSTed to the V3 Bulk Activity - Import Contacts URL. That is one step vs GETting, parsing, editing, and PUTting the contact data.
eg
{"import_data":[{"email":"dlang@example.com", "cf:subscription_start_date":"06/05/2023", "cf:subscription_end_date":"06/06/2024"}], "list_ids":["5cdc68f8-5bce-11e9-b67a-d4ae52754950","3def8714-3fbb-11ea-b726-d4ae529cddd3","67842e9e-c500-11e9-9e9a-d4ae529a863c"]}
Announcements
Join our list to be notified of new features and updates to our V3 API.
Sign Up