NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Packagist · #2064 most downloaded on Packagist
PHP SDK for Klaviyo's API.
Last release 2 months ago
15 Jul 2026
Ships fairly regularly
a new release about every 2 months
Most releases are documented
notes for 33 of 41 stable releases
Nothing withdrawn
no release was ever pulled
4 years old
41 releases · first in 2022
One column per quarter.
Full CRUD support across four groups of endpoints:
$klaviyo->CustomObjects->createObjectType(), $klaviyo->CustomObjects->getObjectType(), $klaviyo->CustomObjects->getObjectTypes(), and $klaviyo->CustomObjects->deleteObjectType().$klaviyo->CustomObjects->createObjectSchema(), $klaviyo->CustomObjects->getObjectSchema(), and $klaviyo->CustomObjects->updateObjectSchema(), plus schema versions via $klaviyo->CustomObjects->getCurrentSchemaForObjectType(), $klaviyo->CustomObjects->getDraftSchemaForObjectType(), and $klaviyo->CustomObjects->getSchemaVersionsForObjectType().$klaviyo->CustomObjects->getSourceMapping(), $klaviyo->CustomObjects->updateSourceMapping(), $klaviyo->CustomObjects->getSourceMappingForObjectSchema(), and $klaviyo->CustomObjects->getSourceMappingIdForObjectSchema().$klaviyo->CustomObjects->getObjectRecord(), $klaviyo->CustomObjects->getRecordsForObjectType(), $klaviyo->CustomObjects->getRecordIdsForObjectType(), and $klaviyo->CustomObjects->bulkDeleteObjectRecords().$klaviyo->Conversations->createConversationMessage().$klaviyo->Client->getClientIpAllowlist() to retrieve your account's client-side IP allowlist.$klaviyo->Flows->deleteFlowAction() to remove an action from a flow.$klaviyo->Profiles->getConversationForProfile() is now $klaviyo->Profiles->getConversationsForProfile() (and $klaviyo->Profiles->getConversationIdForProfile() is now $klaviyo->Profiles->getConversationIdsForProfile()), as well as the relevant relationship methods and parameters.backfill flag on $klaviyo->Events->createEvent() & $klaviyo->Events->bulkCreateEvents(), which records historical events without triggering flows.$klaviyo->Events->getEvents() now returns events with unresolvable metrics by default, matching $klaviyo->Events->getEvent(). Use the new has(metric) filter to exclude them.$klaviyo->CustomObjects->createObjectType(), $klaviyo->CustomObjects->getObjectType(), $klaviyo->CustomObjects->getObjectTypes(), and $klaviyo->CustomObjects->deleteObjectType().$klaviyo->CustomObjects->createObjectSchema(), $klaviyo->CustomObjects->getObjectSchema(), and $klaviyo->CustomObjects->updateObjectSchema(), plus schema versions via $klaviyo->CustomObjects->getCurrentSchemaForObjectType(), $klaviyo->CustomObjects->getDraftSchemaForObjectType(), and $klaviyo->CustomObjects->getSchemaVersionsForObjectType().$klaviyo->CustomObjects->getSourceMapping(), $klaviyo->CustomObjects->updateSourceMapping(), $klaviyo->CustomObjects->getSourceMappingForObjectSchema(), and $klaviyo->CustomObjects->getSourceMappingIdForObjectSchema().$klaviyo->CustomObjects->getObjectRecord(), $klaviyo->CustomObjects->getRecordsForObjectType(), $klaviyo->CustomObjects->getRecordIdsForObjectType(), and $klaviyo->CustomObjects->bulkDeleteObjectRecords().$klaviyo->Conversations->createConversationMessage().$klaviyo->Client->getClientIpAllowlist() to retrieve your account's client-side IP allowlist.$klaviyo->Flows->deleteFlowAction() to remove an action from a flow.$klaviyo->Profiles->getConversationForProfile() is now $klaviyo->Profiles->getConversationsForProfile() (and $klaviyo->Profiles->getConversationIdForProfile() is now $klaviyo->Profiles->getConversationIdsForProfile()), as well as the relevant relationship methods and parameters.backfill flag on $klaviyo->Events->createEvent() & $klaviyo->Events->bulkCreateEvents(), which records historical events without triggering flows.$klaviyo->Events->getEvents() now returns events with unresolvable metrics by default, matching $klaviyo->Events->getEvent(). Use the new has(metric) filter to exclude them.Send an outbound message to a profile with $klaviyo->Conversations->createConversationMessage() . Supports SMS and WhatsApp — the channel is determine
$klaviyo->Conversations->createConversationMessage(). Supports SMS and WhatsApp — the channel is determined automatically from the$klaviyo->Profiles->getConversationForProfile(), or include it inline on profile retrievals using include: ['conversation'] on getProfile / getProfiles.editor_type: SYSTEM_DRAGGABLE and providing a definition body (mutually exclusive with html) via$klaviyo->Templates->createTemplate(). DnD template endpoints use the SMALL rate limit tier (3 requests/second burst, 60 requests/minute steady).$klaviyo->Templates->getTemplates() and $klaviyo->Templates->getTemplate(). Use additional_fields_template: ['definition'] todefinition, name, or text independently via $klaviyo->Templates->updateTemplate().$klaviyo->Conversations->createConversationMessage(). Supports SMS and WhatsApp — the channel is determined automatically from the$klaviyo->Profiles->getConversationForProfile(), or include it inline on profile retrievals using include: ['conversation'] on getProfile / getProfiles.editor_type: SYSTEM_DRAGGABLE and providing a definition body (mutually exclusive with html) via$klaviyo->Templates->createTemplate(). DnD template endpoints use the SMALL rate limit tier (3 requests/second burst, 60 requests/minute steady).$klaviyo->Templates->getTemplates() and $klaviyo->Templates->getTemplate(). Use additional_fields_template: ['definition'] todefinition, name, or text independently via $klaviyo->Templates->updateTemplate().Added a new single data source record create endpoint for one-at-a-time ingestion workloads
anonymous_id from profile payloadsGet flow actions, flow messages, flow action IDs, and more with the Flow Actions API .
Various changes to improve support for PHP 8
SplFileObject is required for uploading an image; you can no longer use a raw stringUse the Mapped Metrics API to retrieve some or all mapped metrics in your Klaviyo account, or update a mapped metric.
[14.0.2] - revision 2025-04-15 Added Added some PHPDoc type hints
Removed API revision from comment on files
Create, retrieve, update, and/or delete web feeds via the Web Feeds API.
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.
GET /api/profiles.GET /api/profiles/{ID}/push-tokens).GET /api/profiles/{ID}/relationships/push-tokens).GET /api/push-tokens/{ID}/profile).GET /api/push-tokens/{ID}/relationships/profile).increment_one (increment by 1), set_count (increment by a given value), and set_property (increment by profile property).amp field (under attributes) in our Create and Update Template APIs.Retrieve all reviews with Reviews.getReviews or return a review with a specified ID using the Reviews.getReview endpoint.
Reviews.getReviews or return a review with a specified ID using the Reviews.getReview endpoint.Reviews.updateReview endpoint, 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.Flows.getFlow endpoint.Flows.createFlow endpoint.Campaigns API, including: getImageForCampaignMessage, getImageIdForCampaignMessage, and updateImageForCampaignMessage.Profiles.bulkSubscribeProfiles and Profiles.unsubscribeProfiles now require the subscriptions field, which grants or revokes consent for the indicated message types on the specified channels, such as email or sms.getCampaigns, getCampaign, createCampaign, updateCampaign, createCampaignClone, getMessagesForCampaign, getCampaignMessage, updateCampaignMessage, getCampaignForCampaignMessage, getCampaignIdForCampaignMessage.Flows.getMessagesForFlowAction and Flows.getActionIdForFlowMessage endpoints have been updated from offset pagination to cursor pagination.Templates.createTemplate endpoint now supports the creation of hybrid templates when editorType is USER_DRAGGABLE and hybrid template HTML is included.Profiles.createProfileProfiles.updateProfileSome methods have been renamed- the old methods are now deprecated aliases
Updated Uploading Image From File section of README
wait_seconds is now deprecated.
Retry-After header. This is now the default behavior.wait_seconds is now deprecated.Numerous methods have been renamed as part of a large renaming effort - the old methods are now deprecated aliases
Profiles.create_or_update_profile has been updated to an enhanced identity resolution processor to better follow the Klaviyo identity resolution identifier priority order$locale property for ProfilesAdded several method aliases based on previous operation IDs
$id parameter for Webhooks API functionsNew klaviyo->Forms object with methods to get forms, form versions and relationships
klaviyo->Forms object with methods to get forms, form versions and relationshipsklaviyo->Webooks class containing CRUD operations for webhooksProfiles->subscribe()historical_import flag for importing historically consented profiles can now be optionally supplied in the payload for the Subscribe Profiles endpoint.Nothing published for this version
New create segment endpoint $klaviyo->Segments->createSegment().
Segments Api
$klaviyo->Segments->createSegment().$klaviyo->Segments->deleteSegment().Flows Api
$klaviyo->Flows->deleteFlow()We have added support for creating events in bulk via the $klaviyo->Events->bulkCreateEvents method
$klaviyo->Events->bulkCreateEvents methodAccounts Api
$klaviyo->Accounts->getAccounts and $klaviyo->Accounts->getAccount have been updated to return the account's locale, e.g. en-US.Breaking Subscribe API Synchronous Validation Improved
$klaviyo->Profiles->subscribeProfiles method. 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
Patched a bug due to incorrect handling of page_cursor
Patched a bug due to colliding enum variable names
Optional $user_agent_suffix param to client instantiation
$user_agent_suffix param to client instantiation
$klaviyo = new KlaviyoAPI(
'YOUR_API_KEY',
$num_retries = 3,
$wait_seconds = 3,
$guzzle_options = [],
$user_agent_suffix = "/YOUR_APP_NAME");
Removed the $attribution field from event_properties in getEvent and getEvents (breaking change).
New Reporting allows you to request campaign and flow performance data that you can view in the Klaviyo UI.
campaignValuesQuery
flowValuesQuery
flowSeriesQuery
New Profiles endpoint allows you to create or update a profile with a set of profile attributes.
createOrUpdateProfile
Removed the $attribution field from event_properties in getEvent and getEvents (breaking change).
We have added the following endpoints to enable bulk profile imports:
We have added the following endpoints to enable bulk profile imports:
Profiles->spawnBulkProfileImportJobProfiles->getBulkProfileImportJobProfiles->getBulkProfileImportJobsProfiles->getBulkProfileImportJobListsProfiles->getBulkProfileImportJobProfilesProfiles->getBulkProfileImportJobImportErrorsProfiles->getBulkProfileImportJobRelationshipsProfilesProfiles->getBulkProfileImportJobRelationshipsListsProfiles->subscribeProfiles payload is now optionalWhen using Profiles->subscribeProfiles, the relationships field of the payload is now optional (see Profiles->subscribeProfiles reference for details).
We now support filtering on list suppression with the get profiles endpoint, which brings us to parity with v2 list suppression endpoint that was the
We now support filtering on list suppression with the get profiles endpoint, which brings us to parity with v2 list suppression endpoint that was the previously recommended solution.
Rules for suppression filtering:
Examples:
$filter="greater-than(subscriptions.email.marketing.suppression.timestamp,2023-03-01T01:00:00Z)"$filter="greater-than(subscriptions.email.marketing.list_suppressions.timestamp,2023-03-01T01:00:00Z),equals(subscriptions.email.marketing.list_suppressions.list_id,\"LIST_ID\")"$filter="greater-than(subscriptions.email.marketing.suppression.timestamp,2023-03-01T01:00:00Z),equals(subscriptions.email.marketing.suppression.reason,\"user_suppressed\")"Now you can retrieve subscription status on any endpoint that returns profiles, including Get List Profiles, Get Segment Profiles and Get Event Profile. Use $additional_fields_profile="subscriptions" on these endpoints to include subscription information.
The subscription object is no longer returned by default with get profile(s) requests. However, it can be included by adding the $additional_fields_profile="subscriptions" to the request. This change will allow us to provide a more performant experience when making requests to Get Profiles without including the subscriptions object.
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:
timestamp is now consent_timestamplast_updated is a new field that mirrors consent_timestampcan_receive_sms_marketing is a new field which is True if the profile is consented for SMSFor EmailMarketing:
timestamp is now consent_timestampcan_receive_email_marketing is True if the profile does not have a global suppressionsuppressions is now suppressionlast_updated is a new field that is the most recent of all the dates on the objectWe now support the following operations to work with images:
Images API
getImagegetImagesupdateImageuploadImageFromFileuploadImageFromUrlCoupons API
Profiles->mergeProfilesLists and Segments: joined_group_atLists->getListRelationshipsProfiles and Segments->getSegmentRelationshipsProfiles to 1000You can now retrieve the templates associated with flow messages using Flows->getFlowMessageTemplate() or Flows->getFlowMessageRelationshipsTemplate()
Flows->getFlowMessageTemplate() or Flows->getFlowMessageRelationshipsTemplate() . You’re also able to include the template HTML for a flow message using Flows->getFlowMessage($id, $include=['template']).Profiles->createPushToken(). 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.We have added support for subscribing profiles to back-in-stock notifications, for both email and SMS, using the new createBackInStockSubscription end
include param, you would set include= to "flow" (instead of "flows"); the response will be an object (previously an array)tag_group_id previously at data.attributes.tag_group_id being removed and replaced by a data object containing type+id and located at data.relationships.tag-group.data.filter param is now required, to, at minimum, filter on messages.channelcompany_id from the response for getTemplate and getTemplates. 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.
getAccountsgetAccountNote: You will need to generate a new API key with either the Accounts scope enabled or Full Access to use these endpoints.
client endpoints
createClientEventcreateClientProfilecreateClientSubscriptionNothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Fixed order of params, and added page_size, so some calls may need to be updated.
page_size, so some calls may need to be updated.Nothing published for this version
Fixed a bug that caused paging through events to periodically fail.
Added support for Campaigns (which were previously in our Beta API/SDKs).
Added the following endpoints (which were previously in our Beta API/SDKs):
Nothing published for this version
Packagist package name: klaviyo/sdk-beta → klaviyo/api
klaviyo/sdk-beta → klaviyo/apiKlaviyoBeta → KlaviyoAPIClient → KlaviyoAPI$client → $klaviyoYour coding agent can read these notes before it upgrades. Set up the MCP server →