All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Added a new single data source record create endpoint for one-at-a-time ingestion workloads
- Breaking: removed
anonymous_idfrom profile payloads
- Get flow actions, flow messages, flow action IDs, and more with the Flow Actions API.
- Update flow actions within a flow, including associated message content, with the Update Flow Action endpoint.
- Retrieve a form and its definition with the Forms API.
- Use the Create Form endpoint to generate a new form by providing the status, A/B test preference, and name of the form.
- Added nil check when accessing
Retry-Afterheader
- Use the Mapped Metrics API to retrieve some or all mapped metrics in your Klaviyo account, or update a mapped metric.
- Get the metric, custom metric, or associated metric IDs for a given mapped metric.
- Use the Custom Objects API to ingest data records from other third-party sources into Klaviyo and retrieve all available data sources for an account.
- Use ingested data records to create custom objects in a Klaviyo account.
- Fixed
ApiErrorinitialization so that it doesn't swallow errors
- Removed API revision from comment on files
- Create, retrieve, update, and/or delete web feeds via the Web Feeds API.
- Create universal content blocks referencing these web feeds with our Universal Content API.
- Create, retrieve, update, and/or delete custom metrics via the Custom Metrics API.
- Report on custom metric conversions in our Campaign and Flow Reporting APIs (set the custom metric ID as the
conversion_metric_id).
🚧
Standard accounts can only have 1 custom metric. Upgrade to Klaviyo's Advanced KDP or Marketing Analytics plan to create up to 50 custom metrics. To learn more about these plans, visit our billing guide.
- Retrieve and/or delete a given push token via Get Push Token and Delete Push Token APIs.
- Include push tokens on
GET /api/profiles. - We've added relationship endpoints for both profiles and push tokens:
- Retrieve push tokens associated with a profile (
GET /api/profiles/{ID}/push-tokens). - Get IDs for push tokens associated with a profile (
GET /api/profiles/{ID}/relationships/push-tokens). - Retrieve the profile associated with a push token (
GET /api/push-tokens/{ID}/profile). - Get ID for the profile associated with a push token (
GET /api/push-tokens/{ID}/relationships/profile).
- Retrieve push tokens associated with a profile (
- Badge count settings are supported on the "campaign-message" resource for push messages.
- The following options for incrementing badge count have been added to the Campaigns API:
increment_one(increment by 1),set_count(increment by a given value), andset_property(increment by profile property).
- The following options for incrementing badge count have been added to the Campaigns API:
- We've added support for creating and updating AMP versions of an email template through an optional
ampfield (underattributes) in our Create and Update Template APIs. - This field requires AMP Email to be enabled. Refer to our AMP Email setup guide for more information.
- Get and Update Reviews APIs
- Retrieve all reviews with
Reviews.get_reviewsor return a review with a specified ID using theReviews.get_reviewendpoint. - Manage your reviews programmatically with the
Reviews.update_reviewendpoint, which allows you to change the status of a review, such as to reject or approve it. This endpoint modifies the moderation status of a review based on the provided review ID and status.
- Retrieve all reviews with
- Get and Create Flows APIs
- Return a flow with the given flow ID using the
Flows.get_flowendpoint. - Create a new flow with the
Flows.create_flowendpoint.
- Return a flow with the given flow ID using the
- Campaigns API
- Manage the images for your campaigns with a new set of endpoints for the
CampaignsAPI, including:get_image_for_campaign_message,get_image_id_for_campaign_message, andupdate_image_for_campaign_message.
- Manage the images for your campaigns with a new set of endpoints for the
- Breaking: Subscription endpoints required field
- Calls to
Profiles.bulk_subscribe_profilesandProfiles.unsubscribe_profilesnow require thesubscriptionsfield, which grants or revokes consent for the indicated message types on the specified channels, such as email or sms.
- Calls to
- Breaking: Campaigns API push notification support
- The Campaigns API now supports the push notification channel.
- Support for push notifications includes significant changes to the following endpoints:
get_campaigns,get_campaign,create_campaign,update_campaign,create_campaign_clone,get_messages_for_campaign,get_campaign_message,update_campaign_message,get_campaign_for_campaign_message,get_campaign_id_for_campaign_message. - We recommend that you review the Campaigns API Overview for more detailed information about changes to the structure and responses of these endpoints.
- Breaking: Pagination updates
- The
Flows.get_messages_for_flow_actionandFlows.get_action_id_for_flow_messageendpoints have been updated from offset pagination to cursor pagination.
- The
- Create Template API
- The
Templates.create_templateendpoint now supports the creation of hybrid templates wheneditor_typeisUSER_DRAGGABLEand hybrid template HTML is included.
- The
- Profiles API
- The following server-side APIs have been updated to an enhanced identity resolution processor to better follow the Klaviyo identity resolution identifier priority order.
Profiles.create_profileProfiles.update_profile
- The following server-side APIs have been updated to an enhanced identity resolution processor to better follow the Klaviyo identity resolution identifier priority order.
- OAuth Support
- Pass your OAuth access token to
config.access_tokento use OAuth authentication.
- Pass your OAuth access token to
- Improved Retry Logic
- To address 429 status codes, we have modified the retry logic to use exponential backoff and the
Retry-Afterheader. - Breaking: Retry logic is now enabled by default. To disable it, set
config.max_retriesto0.
- To address 429 status codes, we have modified the retry logic to use exponential backoff and the
- Universal Content API
- Read, update, and delete universal content
- For more information, see our Universal Content API overview
- Form Reporting API
- Query form performance
- For more information, see our Reporting API overview
- Segment Reporting API
- Query segment growth data
- For more information, see our Reporting API overview
- Reviews API
- Get and list reviews
- For more information, see our Reviews API overview
- Tracking Settings API
- Read and update the Tracking Settings for an account (Account -> Settings -> UTM Tracking in UI)
- For more information, see our Tracking Settings API documentation
- Metric Properties API
- Access the properties for a given metric (e.g. "Placed Order")
- For more information, see our Metric Properties API documentation
- Suppress/Unsuppress profile job APIs
- Monitor the status of jobs created by Suppress Profiles and Unsuppress Profiles requests
- For more information, see our Suppress Profiles Job API documentation
Profiles.create_or_update_profilehas been updated to an enhanced identity resolution processor to better follow the Klaviyo identity resolution identifier priority order- Added support for
$localeproperty forProfiles - Numerous methods have been renamed as part of a large renaming effort - the old methods are now deprecated aliases
- Added several method aliases based on previous operation IDs
- Forms API
- New
KlaviyoAPI::Formsclass with methods to get forms, form versions and relationships. - Webhooks API
- new
KlaviyoAPI::Webooksclass containing CRUD operations for webhooks.
ProfilesApi.subscribe()- Added
historical_importflag for importing historically consented profiles can now be optionally supplied in the payload for the Subscribe Profiles endpoint. - When using this flag, a consented_at date must be provided and must be in the past.
-
Segments Api
- New create segment endpoint
KlaviyoAPI::Segments.create_segment(). - New delete segment endpoint
KlaviyoAPI::Segments.delete_segment(). - Updated exisiting segments endpoints to include the segment definition
- For more information, see our Segments API overview.
- New create segment endpoint
-
Flows Api
- New delete flows endpoint
KlaviyoAPI::Flows.delete_flow()
- New delete flows endpoint
- Bulk Create Events API
- We have added support for creating events in bulk via the
KlaviyoAPI::Event.bulk_create_eventsmethod
- We have added support for creating events in bulk via the
- Create multiple events for new and existing profiles and/or update profile properties in a single API call. For more information, see our Events API overview.
-
Accounts Api
KlaviyoAPI::Accounts.get_accountsandKlaviyoAPI::Accounts.get_accounthave been updated to return the account's locale, e.g.en-US.
-
Breaking Subscribe API Synchronous Validation Improved
- To provide better feedback for handling SMS subscriptions, we’ve added improved validation behavior to
KlaviyoAPI::Profiles.subscribe_profilesmethod. In prior revisions, such requests may appear as 202s but will fail to update SMS consent. To handle this issue, 400 validation errors are returned for the following cases- If a profile is subscribed to SMS marketing and age-gating is enabled but age_gated_date_of_birth is not provided, or the DOB does not meet the region's requirements.
- If the account does not have a sending number in the phone number’s region.
- If the phone number is in a region not supported by Klaviyo.
- If consented_at is set and the list or global setting is double opt-in.
- To provide better feedback for handling SMS subscriptions, we’ve added improved validation behavior to
-
Use
KLAVIYO_API_REVISIONas the env var for controlling which Klaviyo API to call, instead ofAPI_REVISION. However,API_REVISIONis a fallback, to avoid making this a breaking change
-
New
Reportingallows you to request campaign and flow performance data that you can view in the Klaviyo UI. -
campaign_values_query- Request campaign analytics data, for example, a campaign performance report on the open rate over the past 30 days.
-
flow_values_query- Request flow analytics data, for example, a flow performance report on the revenue per recipient value over the past 3 months.
-
flow_series_query- Fetch flow series data for a specific interval and timeframe, for example, a flow performance report on weekly click rates over the past 12 months.
-
New
Profilesendpoint allows you to create or update a profile with a set of profile attributes.create_or_update_profile- This endpoint operates synchronously and offers an upsert pattern similar to the v1/v2 Identify API.
-
Removed the $attribution field from event_properties in get_event and get_events (breaking change).
- To include this data in your request, add include=attributions to your request.
- New Endpoints: Bulk Profile Imports:
Profiles.spawn_bulk_profile_import_jobProfiles.get_bulk_profile_import_jobProfiles.get_bulk_profile_import_jobsProfiles.get_bulk_profile_import_job_listsProfiles.get_bulk_profile_import_job_profilesProfiles.get_bulk_profile_import_job_import_errorsProfiles.get_bulk_profile_import_job_relationships_profilesProfiles.get_bulk_profile_import_job_relationships_lists
- The
relationshipsfield of Profiles.subscribe_profiles payload is now optional. (see subscribe_profiles reference for details).
-
Support for returning list suppressions via the /profiles endpoint
Rules for suppression filtering:
- You may not mix-and-match list and global filters
- You may only specify a single date filter
- You may or may not specify a reason
- You must specify a list_id to filter on any list suppression properties
Examples:
- To return profiles who were suppressed after a certain date:
{filter: "greater-than(subscriptions.email.marketing.suppression.timestamp,2023-03-01T01:00:00Z) - To return profiles who were suppressed from a specific list after a certain date:
{filter: "greater-than(subscriptions.email.marketing.list_suppressions.timestamp,2023-03-01T01:00:00Z),equals(subscriptions.email.marketing.list_suppressions.list_id,\"LIST_ID\"") - To return all profiles who were suppressed for a specific reason after a certain date:
{"filter: 'greater-than(subscriptions.email.marketing.suppression.timestamp,2023-03-01T01:00:00Z),equals(subscriptions.email.marketing.suppression.reason\"user_suppressed\"")
-
Optionally retrieve subscription status on Get List Profiles, Get Segment Profiles, Get Event Profile
- Use
{additional_fields_profile = ["subscriptions"]}on these endpoints to include subscription information.
- Use
-
Subscription object not returned by default on Get Profile / Get Profiles
- The subscription object is no longer returned by default with get profile(s) requests. However, it can be included by adding
{additional_fields_profile = ["subscriptions"]}sto the request. This change will allow us to provide a more performant experience when making requests to Get Profiles without including the subscriptions object.
- The subscription object is no longer returned by default with get profile(s) requests. However, it can be included by adding
-
Profile Subscription Fields Renamed
-
In the interest of providing more clarity and information on the subscription object, we have renamed several fields, and added several as well. This will provide more context on a contact's subscriptions and consent, as well as boolean fields to see who you can or cannot message.
For SMSMarketing:
timestampis nowconsent_timestamplast_updatedis a new field that mirrorsconsent_timestampcan_receive_sms_marketingis a new field which isTrueif the profile is consented for SMS
For EmailMarketing:
timestampis nowconsent_timestampcan_receive_email_marketingis True if the profile does not have a global suppressionsuppressionsis nowsuppressionlast_updatedis a new field that is the most recent of all the dates on the object
ImagesAPI- We now support the following operations to work with images:
get_imageget_imagesupdate_imageupload_image_from_fileupload_image_from_url
- We now support the following operations to work with images:
CouponsAPI- We now support CRUD operations for both Coupons and Coupon Codes
- Check out Coupons API guide for more information.
- Additional filtering/sorting option for Lists and Segments:
joined_group_at - New profile merge endpoint:
Profiles.merge_profiles - Increased the maximum page size limit for List and Segment Profile Relationship Endpoints to 1000
- Flow Message Templates
- You can now retrieve the templates associated with flow messages using
Flows.get_flow_message_template()orFlows.get_flow_message_relationships_template(). You’re also able to include the template HTML for a flow message usingFlows.get_flow_message(id, {"include": ["template"]}). - Create or Update Push Tokens
- We have added an endpoint to create push tokens,
Profiles.create_push_token(). This endpoint can be used to migrate profiles and their push tokens from another platform to Klaviyo. If you’re looking to register push tokens from users’ devices, please use our mobile SDKs.
- Back-In-stock APIs
- We have added support for subscribing profiles to back-in-stock notifications, for both email and SMS, using the new create_back_in_stock_subscription endpoint.
- New functionality to Campaigns API
- CRUD support for SMS campaigns is now available
- You can now also retrieve all messages for a campaign to determine performance data on campaigns where you're running A/B tests
- To support this functionality, we introduced a relationship between campaigns and campaign messages, and between campaign messages and templates
- Relationship Standardization
- We are making a number of changes across endpoints to standardize how we handle relationships in our APIs and leverage consistently typed objects across endpoints. For example, you can create a profile in our APIs in the same shape, regardless of whether you're calling the profiles endpoint or the events endpoint.
- The changes include:
- Updating 1:1 relationships to use singular tense and an object (instead of plural and an array)
- example: for get_flow_action, if you want to use the
includeparam, you would setinclude=to"flow"(instead of"flows")
- example: for get_flow_action, if you want to use the
- Moving related object IDs from the attributes payload to relationships
- example: The format for the body of create_tag has changed, with
tag_group_idpreviously atdata.attributes.tag_group_idbeing removed and replaced by adataobject containingtype+idand located atdata.relationships.tag-group.data.
- example: The format for the body of create_tag has changed, with
- Specifying a relationship between two Klaviyo objects to allow for improved consistency and greater interoperability across endpoints
- example: for create_event, you can now create/update a profile for an event in the same way you would when using the profiles API directly
- Updating 1:1 relationships to use singular tense and an object (instead of plural and an array)
- NOTE: The examples for the above relationship changes are illustrative, not comprehensive. For a complete list of ALL the endpoints that have changed and exactly how, please refer to our latest API Changelog
- For get_campaigns endpoint,
filterparam is now required, to, at minimum, filter onmessages.channel
- We removed the
company_idfrom the response for get_template and get_templates. If you need to obtain the company ID / public API key for an account, please use the Accounts API.- We removed thecompany_idfrom the response for get_template and get_templates. If you need to obtain the company ID / public API key for an account, please use the Accounts API.
- Accounts API is now available, this will allow you to access information about the Klaviyo account associated with your API key.
get_accountsget_account
Note: You will need to generate a new API key with either the Accounts scope enabled or Full Access to use these endpoints.
- All
clientendpointscreate_client_eventcreate_client_profilecreate_client_subscription
- Profiles API now returns predictive analytics when calling
get_profileandget_profilesby passing inadditional_fields_profile: ["predictive_analytics"].
- Relationship endpoints that were previously grouped together are now split into related-resource-specific endpoints.
- To migrate to this latest version, all calls to relationship endpoints need to be updated, as in the following example:
get_campaign_relationships(id, "tags")will becomeget_campaign_relationships_tags(id).
- Campagins (which were previously in our Beta API/SDKs)
- Profiles
- Fix longitude value in ProfileLocation type mapping
- Flows
- Pagination changed from page offset to cursor
- Added the following endpoints (which were previously in our Beta API/SDKs):
- Data Privacy
- All Tags endpoints, as well as the following related resource-specific endpoints:
- Get Flow Tags
- Get List Tags
- Get Segment Tags
- Support for cursor pagination
- Passing the
nextvalue from a paginated result to the following call via thepage_cursorquery string argument will now result in the cursor being parsed and set appropriately by theApiClient.
- Passing the
- Initial release
- Naming changes:
- Package name: klaviyo_sdk -> klaviyo-api-sdk
- Module name: KlaviyoBeta -> KlaviyoAPI
- Some functions have changed name
- New resources and endpoints:
- See API Changelog for full details