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.
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.
| Operation | What it does | Scope |
|---|
getProfiles | Get profiles | profiles:read |
getProfile | Get profile | profiles:read |
createProfile | Create profile | profiles:write |
updateProfile | Update profile | profiles:write |
upsertProfile | Create or update profile (upsert) | profiles:write |
mergeProfiles | Merge profiles | profiles:write |
getListsForProfile | Get lists for a profile | lists:read + profiles:read |
getSegmentsForProfile | Get segments for a profile | profiles:read + segments:read |
getConversationsForProfile | Get conversations for a profile | conversations:read + profiles:read |
bulkImportProfiles | Bulk import profiles | lists:write + profiles:write |
getBulkImportJob | Get bulk import job | lists:read + profiles:read |
getBulkImportErrors | Get bulk import errors | profiles:read |
| Operation | What it does | Scope |
|---|
subscribeProfile | Subscribe profile | lists:write + profiles:write + subscriptions:write |
bulkSubscribeProfiles | Bulk subscribe profiles | lists:write + profiles:write + subscriptions:write |
unsubscribeProfile | Unsubscribe profile | lists:write + profiles:write + subscriptions:write |
bulkUnsubscribeProfiles | Bulk unsubscribe profiles | lists:write + profiles:write + subscriptions:write |
suppressProfile | Suppress profile | profiles:write + subscriptions:write |
bulkSuppressProfiles | Bulk suppress profiles | profiles:write + subscriptions:write |
unsuppressProfile | Unsuppress profile | subscriptions:write |
getSuppressionJob | Get suppression job | subscriptions:read |
getUnsuppressionJob | Get unsuppression job | subscriptions:read |
| Operation | What it does | Scope |
|---|
getLists | Get lists | lists:read |
createList | Create list | lists:write |
getList | Get list | lists:read |
updateList | Update list | lists:write |
deleteList | Delete list | lists:write |
getProfilesForList | Get profiles in a list | lists:read + profiles:read |
addProfileToList | Add profile to list | lists:write + profiles:write |
addProfilesToList | Add many profiles to list | lists:write + profiles:write |
removeProfileFromList | Remove profile from list | lists:write + profiles:write |
removeProfilesFromList | Remove many profiles from list | lists:write + profiles:write |
getTagsForList | Get tags on a list | lists:read + tags:read |
getFlowsTriggeredByList | Get flows triggered by a list | flows:read + lists:read |
| Operation | What it does | Scope |
|---|
getSegments | Get segments | segments:read |
createSegment | Create segment | segments:write |
getSegment | Get segment | segments:read |
updateSegment | Update segment | segments:write |
deleteSegment | Delete segment | segments:write |
getSegmentMembers | Get segment members | profiles:read + segments:read |
getTagsForSegment | Get tags on a segment | segments:read + tags:read |
getFlowsTriggeredBySegment | Get flows triggered by a segment | flows:read + segments:read |
| Operation | What it does | Scope |
|---|
createEvent | Create event | events:write |
getEvents | Get events | events:read |
getEvent | Get event | events:read |
bulkCreateEvents | Bulk create events | events:write |
| Operation | What it does | Scope |
|---|
getMetrics | Get metrics | metrics:read |
getMetric | Get metric | metrics:read |
getMetricProperties | Get properties for a metric | metrics:read |
getMetricProperty | Get metric property | metrics:read |
queryMetricAggregates | Query metric aggregates | metrics:read |
getFlowsTriggeredByMetric | Get flows triggered by a metric | flows:read + metrics:read |
getCustomMetrics | Get custom metrics | metrics:read |
createCustomMetric | Create custom metric | metrics:write |
getCustomMetric | Get custom metric | metrics:read |
updateCustomMetric | Update custom metric | metrics:write |
deleteCustomMetric | Delete custom metric | metrics:write |
| Operation | What it does | Scope |
|---|
getCampaigns | Get campaigns | campaigns:read |
createCampaign | Create campaign | campaigns:write |
getCampaign | Get campaign | campaigns:read |
updateCampaign | Update campaign | campaigns:write |
deleteCampaign | Delete campaign | campaigns:write |
cloneCampaign | Clone campaign | campaigns:write |
getCampaignMessages | Get messages for a campaign | campaigns:read |
getCampaignMessage | Get campaign message | campaigns:read |
updateCampaignMessage | Update campaign message | campaigns:write |
assignTemplateToCampaignMessage | Assign template to a message | campaigns:write |
getTemplateForCampaignMessage | Get template for a message | campaigns:read + templates:read |
triggerCampaignSend | Trigger campaign send | campaigns:write |
getCampaignSendJob | Get campaign send job | campaigns:read |
cancelCampaignSend | Cancel or revert a send | campaigns:write |
refreshCampaignRecipientEstimation | Refresh recipient estimate | campaigns:write |
getCampaignRecipientEstimation | Get recipient estimate | campaigns:read |
getTagsForCampaign | Get tags on a campaign | campaigns:read + tags:read |
| Operation | What it does | Scope |
|---|
getFlows | Get flows | flows:read |
createFlow | Create flow | flows:write |
getFlow | Get flow | flows:read |
updateFlowStatus | Update flow status | flows:write |
deleteFlow | Delete flow | flows:write |
getFlowActions | Get actions in a flow | flows:read |
getFlowAction | Get flow action | flows:read |
updateFlowAction | Update flow action | flows:write |
deleteFlowAction | Delete flow action | flows:write |
getFlowActionMessages | Get messages in a flow action | flows:read |
getFlowMessage | Get flow message | flows:read |
getTagsForFlow | Get tags on a flow | flows:read + tags:read |
| Operation | What it does | Scope |
|---|
getTemplates | Get templates | templates:read |
createTemplate | Create template | templates:write |
getTemplate | Get template | templates:read |
updateTemplate | Update template | templates:write |
deleteTemplate | Delete template | templates:write |
renderTemplate | Render template | templates:read |
cloneTemplate | Clone template | templates:write |
getUniversalContentBlocks | Get universal content blocks | templates:read |
createUniversalContent | Create universal content block | templates:write |
getUniversalContent | Get universal content block | templates:read |
updateUniversalContent | Update universal content block | templates:write |
deleteUniversalContent | Delete universal content block | templates:write |
| Operation | What it does | Scope |
|---|
getForms | Get forms | forms:read |
createForm | Create form | forms:write |
getForm | Get form | forms:read |
deleteForm | Delete form | forms:write |
getFormVersions | Get versions of a form | forms:read |
getFormVersion | Get form version | forms:read |
| Operation | What it does | Scope |
|---|
getCatalogItems | Get catalog items | catalogs:read |
createCatalogItem | Create catalog item | catalogs:write |
getCatalogItem | Get catalog item | catalogs:read |
updateCatalogItem | Update catalog item | catalogs:write |
deleteCatalogItem | Delete catalog item | catalogs:write |
getCategoriesForCatalogItem | Get categories for an item | catalogs:read |
addCategoriesToCatalogItem | Add categories to an item | catalogs:write |
updateCategoriesForCatalogItem | Replace an item's categories | catalogs:write |
removeCategoriesFromCatalogItem | Remove categories from an item | catalogs:write |
getVariantsForCatalogItem | Get variants for an item | catalogs:read |
| Operation | What it does | Scope |
|---|
getCatalogVariants | Get catalog variants | catalogs:read |
createCatalogVariant | Create catalog variant | catalogs:write |
getCatalogVariant | Get catalog variant | catalogs:read |
updateCatalogVariant | Update catalog variant | catalogs:write |
deleteCatalogVariant | Delete catalog variant | catalogs:write |
| Operation | What it does | Scope |
|---|
getCatalogCategories | Get catalog categories | catalogs:read |
createCatalogCategory | Create catalog category | catalogs:write |
getCatalogCategory | Get catalog category | catalogs:read |
updateCatalogCategory | Update catalog category | catalogs:write |
deleteCatalogCategory | Delete catalog category | catalogs:write |
getItemsForCatalogCategory | Get items in a category | catalogs:read |
addItemsToCatalogCategory | Add items to a category | catalogs:write |
updateItemsForCatalogCategory | Replace a category's items | catalogs:write |
removeItemsFromCatalogCategory | Remove items from a category | catalogs:write |
| Operation | What it does | Scope |
|---|
bulkCreateCatalogItems | Bulk create catalog items | catalogs:write |
getBulkCreateCatalogItemsJob | Get bulk create items job | catalogs:read |
bulkUpdateCatalogItems | Bulk update catalog items | catalogs:write |
getBulkUpdateCatalogItemsJob | Get bulk update items job | catalogs:read |
bulkDeleteCatalogItems | Bulk delete catalog items | catalogs:write |
getBulkDeleteCatalogItemsJob | Get bulk delete items job | catalogs:read |
bulkCreateCatalogVariants | Bulk create catalog variants | catalogs:write |
getBulkCreateCatalogVariantsJob | Get bulk create variants job | catalogs:read |
bulkUpdateCatalogVariants | Bulk update catalog variants | catalogs:write |
getBulkUpdateCatalogVariantsJob | Get bulk update variants job | catalogs:read |
bulkDeleteCatalogVariants | Bulk delete catalog variants | catalogs:write |
getBulkDeleteCatalogVariantsJob | Get bulk delete variants job | catalogs:read |
bulkCreateCatalogCategories | Bulk create catalog categories | catalogs:write |
getBulkCreateCatalogCategoriesJob | Get bulk create categories job | catalogs:read |
bulkUpdateCatalogCategories | Bulk update catalog categories | catalogs:write |
getBulkUpdateCatalogCategoriesJob | Get bulk update categories job | catalogs:read |
bulkDeleteCatalogCategories | Bulk delete catalog categories | catalogs:write |
getBulkDeleteCatalogCategoriesJob | Get bulk delete categories job | catalogs:read |
| Operation | What it does | Scope |
|---|
createBackInStockSubscription | Create back-in-stock subscription | catalogs:write + profiles:write |
| Operation | What it does | Scope |
|---|
getCoupons | Get coupons | coupons:read |
createCoupon | Create coupon | coupons:write |
getCoupon | Get coupon | coupons:read |
updateCoupon | Update coupon | coupons:write |
deleteCoupon | Delete coupon | coupons:write |
getCouponCodes | Get coupon codes | coupon-codes:read |
createCouponCode | Create coupon code | coupon-codes:write |
getCouponCode | Get coupon code | coupon-codes:read |
updateCouponCode | Update coupon code | coupon-codes:write |
deleteCouponCode | Delete coupon code | coupon-codes:write |
getCouponCodesForCoupon | Get codes for a coupon | coupon-codes:read |
bulkCreateCouponCodes | Bulk create coupon codes | coupon-codes:write |
getBulkCreateCouponCodesJob | Get bulk create codes job | coupon-codes:read |
| Operation | What it does | Scope |
|---|
getTags | Get tags | tags:read |
createTag | Create tag | tags:read + tags:write |
getTag | Get tag | tags:read |
updateTag | Update tag | tags:read + tags:write |
deleteTag | Delete tag | tags:read + tags:write |
getTagGroups | Get tag groups | tags:read |
createTagGroup | Create tag group | tags:read + tags:write |
getTagGroup | Get tag group | tags:read |
updateTagGroup | Update tag group | tags:read + tags:write |
deleteTagGroup | Delete tag group | tags:read + tags:write |
getTagsForTagGroup | Get tags in a tag group | tags:read |
tagCampaigns | Tag campaigns | campaigns:write + tags:write |
untagCampaigns | Untag campaigns | campaigns:write + tags:write |
tagFlows | Tag flows | flows:write + tags:write |
untagFlows | Untag flows | flows:write + tags:write |
tagLists | Tag lists | lists:write + tags:write |
untagLists | Untag lists | lists:write + tags:write |
tagSegments | Tag segments | segments:write + tags:write |
untagSegments | Untag segments | segments:write + tags:write |
| Operation | What it does | Scope |
|---|
queryCampaignValues | Campaign performance report | campaigns:read |
queryFlowValues | Flow performance report | flows:read |
queryFlowSeries | Flow performance time series | flows:read |
queryFormValues | Form performance report | forms:read |
queryFormSeries | Form performance time series | forms:read |
querySegmentValues | Segment size report | segments:read |
querySegmentSeries | Segment size time series | segments:read |
| Operation | What it does | Scope |
|---|
getReviews | Get reviews | reviews:read |
getReview | Get review | reviews:read |
updateReview | Moderate review | reviews:write |
| Operation | What it does | Scope |
|---|
getImages | Get images | images:read |
getImage | Get image | images:read |
uploadImageFromUrl | Upload image from a URL | images:write |
updateImage | Update image | images:write |
| Operation | What it does | Scope |
|---|
getWebhooks | Get webhooks | webhooks:read |
createWebhook | Create webhook | webhooks:write |
getWebhook | Get webhook | webhooks:read |
updateWebhook | Update webhook | webhooks:write |
deleteWebhook | Delete webhook | webhooks:write |
getWebhookTopics | Get webhook topics | webhooks:read |
getWebhookTopic | Get webhook topic | webhooks:read |
| Operation | What it does | Scope |
|---|
createConversationMessage | Send a conversation message | conversations:write |
| Operation | What it does | Scope |
|---|
requestProfileDeletion | Request profile deletion | data-privacy:write |
| Operation | What it does | Scope |
|---|
getAccounts | Get accounts | accounts:read |
getAccount | Get account | accounts:read |
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:
| Field | Value | Notes |
|---|
eventName | Placed Order | The 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.