Pipory
Node reference

Klaviyo

Klaviyo node reference - all 203 operations, the credential it needs, and a worked example.

Klaviyo API (Email marketing). 203 operations: profiles, upsert and merge, bulk import; subscriptions and suppressions; lists, segments and their members; events, metrics and metric aggregates; campaigns, messages, sends and recipient estimates; flows and flow actions; templates, rendering and universal content; forms; catalog items, variants, categories and bulk jobs; back-in-stock; coupons and coupon codes; tags and tag groups; campaign, flow, form and segment reporting; reviews; images; webhooks; conversations; data-privacy deletion; account.

Credential: Klaviyo private API key - see Credentials.

Scopes

Each operation below lists the scope it needs. Scopes are ticked on the private API key when it is created, at klaviyo.com/settings/account/api-keys. Klaviyo keys are NOT all-or-nothing: the creation dialog is a per-resource read/write matrix (profiles, lists, segments, campaigns, flows, events, metrics, catalogs, coupons, coupon-codes, tags, templates, forms, reviews, images, webhooks, conversations, subscriptions, data-privacy, accounts), and the scope set is FIXED at creation - there is no incremental consent and no way to widen an existing key, so a refusal can only be fixed by minting a new one. Three things this catches people out on: coupon CODES sit under their own coupon-codes:* namespace rather than coupons:*, so a key with full coupon access still cannot mint a customer's code; creating, updating or deleting a TAG or tag group needs tags:read AS WELL AS tags:write, which is Klaviyo's own spec and not a typo here; and any operation that reads across two resources needs both halves granted (a relationship read like getSegmentsForProfile needs profiles:read AND segments:read, and a tagging write needs the resource's :write alongside tags:write). Two further gates are not scopes at all: Conversations must be enabled on the account before createConversationMessage resolves, and reviews require the Klaviyo Reviews product. If a run fails with a permission error, the node names the missing scope in the error - grant it and re-run; you do not need to rebuild the workflow.

Operations (203)

Profiles

OperationWhat it doesScope
getProfilesGet profilesprofiles:read
getProfileGet profileprofiles:read
createProfileCreate profileprofiles:write
updateProfileUpdate profileprofiles:write
upsertProfileCreate or update profile (upsert)profiles:write
mergeProfilesMerge profilesprofiles:write
getListsForProfileGet lists for a profilelists:read + profiles:read
getSegmentsForProfileGet segments for a profileprofiles:read + segments:read
getConversationsForProfileGet conversations for a profileconversations:read + profiles:read
bulkImportProfilesBulk import profileslists:write + profiles:write
getBulkImportJobGet bulk import joblists:read + profiles:read
getBulkImportErrorsGet bulk import errorsprofiles:read

Subscriptions & suppressions

OperationWhat it doesScope
subscribeProfileSubscribe profilelists:write + profiles:write + subscriptions:write
bulkSubscribeProfilesBulk subscribe profileslists:write + profiles:write + subscriptions:write
unsubscribeProfileUnsubscribe profilelists:write + profiles:write + subscriptions:write
bulkUnsubscribeProfilesBulk unsubscribe profileslists:write + profiles:write + subscriptions:write
suppressProfileSuppress profileprofiles:write + subscriptions:write
bulkSuppressProfilesBulk suppress profilesprofiles:write + subscriptions:write
unsuppressProfileUnsuppress profilesubscriptions:write
getSuppressionJobGet suppression jobsubscriptions:read
getUnsuppressionJobGet unsuppression jobsubscriptions:read

Lists

OperationWhat it doesScope
getListsGet listslists:read
createListCreate listlists:write
getListGet listlists:read
updateListUpdate listlists:write
deleteListDelete listlists:write
getProfilesForListGet profiles in a listlists:read + profiles:read
addProfileToListAdd profile to listlists:write + profiles:write
addProfilesToListAdd many profiles to listlists:write + profiles:write
removeProfileFromListRemove profile from listlists:write + profiles:write
removeProfilesFromListRemove many profiles from listlists:write + profiles:write
getTagsForListGet tags on a listlists:read + tags:read
getFlowsTriggeredByListGet flows triggered by a listflows:read + lists:read

Segments

OperationWhat it doesScope
getSegmentsGet segmentssegments:read
createSegmentCreate segmentsegments:write
getSegmentGet segmentsegments:read
updateSegmentUpdate segmentsegments:write
deleteSegmentDelete segmentsegments:write
getSegmentMembersGet segment membersprofiles:read + segments:read
getTagsForSegmentGet tags on a segmentsegments:read + tags:read
getFlowsTriggeredBySegmentGet flows triggered by a segmentflows:read + segments:read

Events

OperationWhat it doesScope
createEventCreate eventevents:write
getEventsGet eventsevents:read
getEventGet eventevents:read
bulkCreateEventsBulk create eventsevents:write

Metrics

OperationWhat it doesScope
getMetricsGet metricsmetrics:read
getMetricGet metricmetrics:read
getMetricPropertiesGet properties for a metricmetrics:read
getMetricPropertyGet metric propertymetrics:read
queryMetricAggregatesQuery metric aggregatesmetrics:read
getFlowsTriggeredByMetricGet flows triggered by a metricflows:read + metrics:read
getCustomMetricsGet custom metricsmetrics:read
createCustomMetricCreate custom metricmetrics:write
getCustomMetricGet custom metricmetrics:read
updateCustomMetricUpdate custom metricmetrics:write
deleteCustomMetricDelete custom metricmetrics:write

Campaigns

OperationWhat it doesScope
getCampaignsGet campaignscampaigns:read
createCampaignCreate campaigncampaigns:write
getCampaignGet campaigncampaigns:read
updateCampaignUpdate campaigncampaigns:write
deleteCampaignDelete campaigncampaigns:write
cloneCampaignClone campaigncampaigns:write
getCampaignMessagesGet messages for a campaigncampaigns:read
getCampaignMessageGet campaign messagecampaigns:read
updateCampaignMessageUpdate campaign messagecampaigns:write
assignTemplateToCampaignMessageAssign template to a messagecampaigns:write
getTemplateForCampaignMessageGet template for a messagecampaigns:read + templates:read
triggerCampaignSendTrigger campaign sendcampaigns:write
getCampaignSendJobGet campaign send jobcampaigns:read
cancelCampaignSendCancel or revert a sendcampaigns:write
refreshCampaignRecipientEstimationRefresh recipient estimatecampaigns:write
getCampaignRecipientEstimationGet recipient estimatecampaigns:read
getTagsForCampaignGet tags on a campaigncampaigns:read + tags:read

Flows

OperationWhat it doesScope
getFlowsGet flowsflows:read
createFlowCreate flowflows:write
getFlowGet flowflows:read
updateFlowStatusUpdate flow statusflows:write
deleteFlowDelete flowflows:write
getFlowActionsGet actions in a flowflows:read
getFlowActionGet flow actionflows:read
updateFlowActionUpdate flow actionflows:write
deleteFlowActionDelete flow actionflows:write
getFlowActionMessagesGet messages in a flow actionflows:read
getFlowMessageGet flow messageflows:read
getTagsForFlowGet tags on a flowflows:read + tags:read

Templates

OperationWhat it doesScope
getTemplatesGet templatestemplates:read
createTemplateCreate templatetemplates:write
getTemplateGet templatetemplates:read
updateTemplateUpdate templatetemplates:write
deleteTemplateDelete templatetemplates:write
renderTemplateRender templatetemplates:read
cloneTemplateClone templatetemplates:write
getUniversalContentBlocksGet universal content blockstemplates:read
createUniversalContentCreate universal content blocktemplates:write
getUniversalContentGet universal content blocktemplates:read
updateUniversalContentUpdate universal content blocktemplates:write
deleteUniversalContentDelete universal content blocktemplates:write

Forms

OperationWhat it doesScope
getFormsGet formsforms:read
createFormCreate formforms:write
getFormGet formforms:read
deleteFormDelete formforms:write
getFormVersionsGet versions of a formforms:read
getFormVersionGet form versionforms:read

Catalog items

OperationWhat it doesScope
getCatalogItemsGet catalog itemscatalogs:read
createCatalogItemCreate catalog itemcatalogs:write
getCatalogItemGet catalog itemcatalogs:read
updateCatalogItemUpdate catalog itemcatalogs:write
deleteCatalogItemDelete catalog itemcatalogs:write
getCategoriesForCatalogItemGet categories for an itemcatalogs:read
addCategoriesToCatalogItemAdd categories to an itemcatalogs:write
updateCategoriesForCatalogItemReplace an item's categoriescatalogs:write
removeCategoriesFromCatalogItemRemove categories from an itemcatalogs:write
getVariantsForCatalogItemGet variants for an itemcatalogs:read

Catalog variants

OperationWhat it doesScope
getCatalogVariantsGet catalog variantscatalogs:read
createCatalogVariantCreate catalog variantcatalogs:write
getCatalogVariantGet catalog variantcatalogs:read
updateCatalogVariantUpdate catalog variantcatalogs:write
deleteCatalogVariantDelete catalog variantcatalogs:write

Catalog categories

OperationWhat it doesScope
getCatalogCategoriesGet catalog categoriescatalogs:read
createCatalogCategoryCreate catalog categorycatalogs:write
getCatalogCategoryGet catalog categorycatalogs:read
updateCatalogCategoryUpdate catalog categorycatalogs:write
deleteCatalogCategoryDelete catalog categorycatalogs:write
getItemsForCatalogCategoryGet items in a categorycatalogs:read
addItemsToCatalogCategoryAdd items to a categorycatalogs:write
updateItemsForCatalogCategoryReplace a category's itemscatalogs:write
removeItemsFromCatalogCategoryRemove items from a categorycatalogs:write

Catalog bulk jobs

OperationWhat it doesScope
bulkCreateCatalogItemsBulk create catalog itemscatalogs:write
getBulkCreateCatalogItemsJobGet bulk create items jobcatalogs:read
bulkUpdateCatalogItemsBulk update catalog itemscatalogs:write
getBulkUpdateCatalogItemsJobGet bulk update items jobcatalogs:read
bulkDeleteCatalogItemsBulk delete catalog itemscatalogs:write
getBulkDeleteCatalogItemsJobGet bulk delete items jobcatalogs:read
bulkCreateCatalogVariantsBulk create catalog variantscatalogs:write
getBulkCreateCatalogVariantsJobGet bulk create variants jobcatalogs:read
bulkUpdateCatalogVariantsBulk update catalog variantscatalogs:write
getBulkUpdateCatalogVariantsJobGet bulk update variants jobcatalogs:read
bulkDeleteCatalogVariantsBulk delete catalog variantscatalogs:write
getBulkDeleteCatalogVariantsJobGet bulk delete variants jobcatalogs:read
bulkCreateCatalogCategoriesBulk create catalog categoriescatalogs:write
getBulkCreateCatalogCategoriesJobGet bulk create categories jobcatalogs:read
bulkUpdateCatalogCategoriesBulk update catalog categoriescatalogs:write
getBulkUpdateCatalogCategoriesJobGet bulk update categories jobcatalogs:read
bulkDeleteCatalogCategoriesBulk delete catalog categoriescatalogs:write
getBulkDeleteCatalogCategoriesJobGet bulk delete categories jobcatalogs:read

Back in stock

OperationWhat it doesScope
createBackInStockSubscriptionCreate back-in-stock subscriptioncatalogs:write + profiles:write

Coupons

OperationWhat it doesScope
getCouponsGet couponscoupons:read
createCouponCreate couponcoupons:write
getCouponGet couponcoupons:read
updateCouponUpdate couponcoupons:write
deleteCouponDelete couponcoupons:write
getCouponCodesGet coupon codescoupon-codes:read
createCouponCodeCreate coupon codecoupon-codes:write
getCouponCodeGet coupon codecoupon-codes:read
updateCouponCodeUpdate coupon codecoupon-codes:write
deleteCouponCodeDelete coupon codecoupon-codes:write
getCouponCodesForCouponGet codes for a couponcoupon-codes:read
bulkCreateCouponCodesBulk create coupon codescoupon-codes:write
getBulkCreateCouponCodesJobGet bulk create codes jobcoupon-codes:read

Tags

OperationWhat it doesScope
getTagsGet tagstags:read
createTagCreate tagtags:read + tags:write
getTagGet tagtags:read
updateTagUpdate tagtags:read + tags:write
deleteTagDelete tagtags:read + tags:write
getTagGroupsGet tag groupstags:read
createTagGroupCreate tag grouptags:read + tags:write
getTagGroupGet tag grouptags:read
updateTagGroupUpdate tag grouptags:read + tags:write
deleteTagGroupDelete tag grouptags:read + tags:write
getTagsForTagGroupGet tags in a tag grouptags:read
tagCampaignsTag campaignscampaigns:write + tags:write
untagCampaignsUntag campaignscampaigns:write + tags:write
tagFlowsTag flowsflows:write + tags:write
untagFlowsUntag flowsflows:write + tags:write
tagListsTag listslists:write + tags:write
untagListsUntag listslists:write + tags:write
tagSegmentsTag segmentssegments:write + tags:write
untagSegmentsUntag segmentssegments:write + tags:write

Reporting

OperationWhat it doesScope
queryCampaignValuesCampaign performance reportcampaigns:read
queryFlowValuesFlow performance reportflows:read
queryFlowSeriesFlow performance time seriesflows:read
queryFormValuesForm performance reportforms:read
queryFormSeriesForm performance time seriesforms:read
querySegmentValuesSegment size reportsegments:read
querySegmentSeriesSegment size time seriessegments:read

Reviews

OperationWhat it doesScope
getReviewsGet reviewsreviews:read
getReviewGet reviewreviews:read
updateReviewModerate reviewreviews:write

Images

OperationWhat it doesScope
getImagesGet imagesimages:read
getImageGet imageimages:read
uploadImageFromUrlUpload image from a URLimages:write
updateImageUpdate imageimages:write

Webhooks

OperationWhat it doesScope
getWebhooksGet webhookswebhooks:read
createWebhookCreate webhookwebhooks:write
getWebhookGet webhookwebhooks:read
updateWebhookUpdate webhookwebhooks:write
deleteWebhookDelete webhookwebhooks:write
getWebhookTopicsGet webhook topicswebhooks:read
getWebhookTopicGet webhook topicwebhooks:read

Conversations

OperationWhat it doesScope
createConversationMessageSend a conversation messageconversations:write

Data privacy

OperationWhat it doesScope
requestProfileDeletionRequest profile deletiondata-privacy:write

Account

OperationWhat it doesScope
getAccountsGet accountsaccounts:read
getAccountGet accountaccounts:read

Example

Record the event a flow is waiting on

Klaviyo flows are triggered by metrics, not by writing to a profile — so the way a workflow makes Klaviyo do something is usually to record an event. This is the node's default operation and creates the profile if it does not exist yet, which means a single node both identifies the person and fires the flow.

Set Operation to createEvent, then fill in:

FieldValueNotes
eventNamePlaced OrderThe metric name a flow trigger listens for; it appears in Klaviyo the first time you send it
email{{ myTrigger.email }}Identifies the profile; created if new
value{{ myTrigger.totalUsd }}The monetary value Klaviyo attributes to the event
propertiesJson{"OrderId": "{{ myTrigger.orderId }}", "Items": ["{{ myTrigger.sku }}"]}Anything a flow or segment needs to branch on later

Sets {{purchase.status}} — Klaviyo answers this endpoint with 202 and no body, so there is no event id to read back. Confirm receipt in Klaviyo's activity feed, not from the node output.