# Klaviyo on boxd

> Klaviyo is a data-driven email and SMS marketing platform that allows e-commerce brands to deliver targeted messages, track conversions, and scale customer relationships.

- Page: https://boxd.sh/integrations/klaviyo/
- CLI: `run klaviyo` (225 commands, 15 marked common)
- SDK: `import { klaviyo } from "@boxd/run"`; every parameter and response type is at `@boxd/run/klaviyo`
- Triggers: none
- Connect: `run auth klaviyo` (API key), or https://app.boxd.sh/integrations/detail/klaviyo
- All integrations: https://boxd.sh/integrations/ (Markdown: https://boxd.sh/integrations/index.md)

## From the shell

```sh
run auth klaviyo      # once: prints a link to connect your account
run klaviyo           # list its commands
run klaviyo get-lists
```

Parameters are flags (`--flag value`); object and array parameters take a JSON string. Output is YAML, or JSON with `--json`. Calls use your own connection; `--scope <name>` uses a connection shared with your team.

## From a script

```ts
import { every, klaviyo } from "@boxd/run";

every("1 hour", async () => {
  const result = await klaviyo.getLists({});
  console.log(result);
});
```

Run it with `run klaviyo.run.ts`. Klaviyo has no triggers; `every()` polls on a schedule, keeps the script running as a job, and wakes the machine when it is due.

## Commands

Required flags are listed; `run klaviyo <command> --help` lists the optional ones. "common" marks what `run klaviyo` shows without `--all`.

| Command | SDK method | Required flags | Optional | Description |
|---|---|---|---|---|
| `add-profile-to-list` ·common | `klaviyo.addProfileToList()` | `--list-id` | 2 | Add profiles to a Klaviyo list by profile IDs or email addresses |
| `assign-campaign-message-template` | `klaviyo.assignCampaignMessageTemplate()` | `--data--id` `--data--relationships--template--data--id` | 2 | Creates a non-reusable version of the template and assigns it to the message.<br><br>*Rate limits*:<br>Burst: `10/s`<br>Steady: `150/m` Scopes: `campaigns:write` |
| `bulk-create-client-events` | `klaviyo.bulkCreateClientEvents()` | `--company-id` | 25 | Use the client-side endpoint with a public API key to track profile activity |
| `bulk-create-events` | `klaviyo.bulkCreateEvents()` | `--data--attributes--events--bulk--create--data` | 1 | Bulk create events for multiple profiles in a single request |
| `cancel-campaign-send` ·common | `klaviyo.cancelCampaignSend()` | `--campaign-send-job-id` | 1 | Cancel or revert a campaign send job |
| `create-back-in-stock-subscription` | `klaviyo.createBackInStockSubscription()` | — | 10 | Use the server-side endpoint to subscribe to restock alerts, following the Back in Stock API guide |
| `create-campaign` | `klaviyo.createCampaign()` | — | 14 | Creates a campaign given a set of parameters, then returns it.<br><br>*Rate limits*:<br>Burst: `10/s`<br>Steady: `150/m` Scopes: `campaigns:write` |
| `create-campaign-clone` | `klaviyo.createCampaignClone()` | — | 3 | Clones an existing campaign, returning a new campaign based on the original with a new ID and name.<br><br>*Rate limits*:<br>Burst: `10/s`<br>Steady: `150/m` Scopes: `campaigns:write` |
| `create-campaign-recipient-estimation-job` ·common | `klaviyo.createCampaignRecipientEstimationJob()` | `--campaign-id` | 0 | Start an asynchronous task to estimate the number of recipients for a campaign |
| `create-campaign-send-job` | `klaviyo.createCampaignSendJob()` | `--data--id` | 1 | Trigger a campaign to send asynchronously<br><br>*Rate limits*:<br>Burst: `10/s`<br>Steady: `150/m` Scopes: `campaigns:write` |
| `create-catalog-category` | `klaviyo.createCatalogCategory()` | — | 6 | Create a new catalog category.<br><br>*Rate limits*:<br>Burst: `75/s`<br>Steady: `700/m` Scopes: `catalogs:write` |
| `create-catalog-category-relationships-items` | `klaviyo.createCatalogCategoryRelationshipsItems()` | `--data` `--id` | 0 | Create a new item relationship for the given category ID.<br><br>*Rate limits*:<br>Burst: `75/s`<br>Steady: `700/m` Scopes: `catalogs:write` |
| `create-catalog-item` | `klaviyo.createCatalogItem()` | — | 13 | Create a new catalog item.<br><br>*Rate limits*:<br>Burst: `75/s`<br>Steady: `700/m` Scopes: `catalogs:write` |
| `create-catalog-item-relationships-categories` | `klaviyo.createCatalogItemRelationshipsCategories()` | `--data` `--id` | 0 | Create a new catalog category relationship for the given item ID.<br><br>*Rate limits*:<br>Burst: `75/s`<br>Steady: `700/m` Scopes: `catalogs:write` |
| `create-catalog-variant` | `klaviyo.createCatalogVariant()` | — | 17 | Create a new variant for a related catalog item.<br><br>*Rate limits*:<br>Burst: `75/s`<br>Steady: `700/m` Scopes: `catalogs:write` |
| `create-client-back-in-stock-subscription` | `klaviyo.createClientBackInStockSubscription()` | `--company-id` | 10 | Use the endpoint for client-side back in stock notifications with a public API key |
| `create-client-event2` | `klaviyo.createClientEvent2()` | `--company-id` `--metric-name` | 25 | Create a client-side event in Klaviyo to track user interactions |
| `create-client-subscription` | `klaviyo.createClientSubscription()` | `--company-id` | 27 | Endpoint manages email/SMS opt-ins using consent and requires public API key for client use |
| `create-coupon` | `klaviyo.createCoupon()` | — | 3 | Creates a new coupon.<br><br>*Rate limits*:<br>Burst: `3/s`<br>Steady: `60/m` Scopes: `coupons:write` |
| `create-coupon-code` | `klaviyo.createCouponCode()` | — | 5 | Synchronously creates a coupon code for the given coupon.<br><br>*Rate limits*:<br>Burst: `350/s`<br>Steady: `3500/m` Scopes: `coupon-codes:write` |
| `create-event` ·common | `klaviyo.createEvent()` | — | 32 | Create or update a profile event with minimum identifiers and metric name |
| `create-list` ·common | `klaviyo.createList()` | — | 2 | Create a new list.<br><br>*Rate limits*:<br>Burst: `10/s`<br>Steady: `150/m`<br>Daily: `100/d` Scopes: `lists:write` |
| `create-or-update-client-profile` | `klaviyo.createOrUpdateClientProfile()` | `--company-id` | 23 | Update user profiles without tracking using a public client-side API; use a private server-side API for identifier changes |
| `create-or-update-client-push-token` | `klaviyo.createOrUpdateClientPushToken()` | `--company-id` | 41 | This endpoint for mobile SDKs (iOS & Android) creates/updates push tokens using a public API key |
| `create-or-update-profile` ·common | `klaviyo.createOrUpdateProfile()` | — | 19 | Create or update a profile in Klaviyo with the given attributes |
| `create-or-update-push-token` | `klaviyo.createOrUpdatePushToken()` | — | 41 | Create or update a push token for mobile push notifications |
| `create-profile` ·common | `klaviyo.createProfile()` | — | 19 | Create a new profile.<br><br>*Rate limits*:<br>Burst: `75/s`<br>Steady: `700/m` Scopes: `profiles:write` |
| `create-segment` | `klaviyo.createSegment()` | — | 4 | Create a segment.<br><br>*Rate limits*:<br>Burst: `1/s`<br>Steady: `15/m`<br>Daily: `100/d` Scopes: `segments:write` |
| `create-tag` | `klaviyo.createTag()` | — | 4 | Summary: Instructions on creating a tag within an account's designated tag group with a maximum of 500 tags, with optional tag group specification |
| `create-tag-group` | `klaviyo.createTagGroup()` | — | 3 | Create tag groups up to 50 per account, defaulting to non-exclusive unless specified |
| `create-tag-relationships` | `klaviyo.createTagRelationships()` | `--data` `--related-resource` `--tag-id` | 0 | Associate a tag with other resources (flows, lists, segments, or campaigns) in Klaviyo |
| `create-template` | `klaviyo.createTemplate()` | — | 5 | Summary: Custom HTML templates can be created unless an account reaches 1,000 template limit |
| `create-template-clone` | `klaviyo.createTemplateClone()` | — | 3 | Clone a template by its ID, but cloning fails if account has 1,000+ templates |
| `create-template-render` | `klaviyo.createTemplateRender()` | — | 3 | Render an email template with specific context and sparse fieldsets, then get HTML/plain text |
| `create-webhook` | `klaviyo.createWebhook()` | — | 6 | Create a new Webhook to receive real-time notifications when specific events occur in Klaviyo (e.g., email clicks, SMS sent) |
| `delete-campaign` | `klaviyo.deleteCampaign()` | `--id` | 0 | Delete a campaign with the given campaign ID.<br><br>*Rate limits*:<br>Burst: `10/s`<br>Steady: `150/m` Scopes: `campaigns:write` |
| `delete-catalog-category` | `klaviyo.deleteCatalogCategory()` | `--id` | 0 | Delete a catalog category using the given category ID.<br><br>*Rate limits*:<br>Burst: `75/s`<br>Steady: `700/m` Scopes: `catalogs:write` |
| `delete-catalog-category-relationships-items` | `klaviyo.deleteCatalogCategoryRelationshipsItems()` | `--data` `--id` | 0 | Delete item relationships for the given category ID.<br><br>*Rate limits*:<br>Burst: `75/s`<br>Steady: `700/m` Scopes: `catalogs:write` |
| `delete-catalog-item` | `klaviyo.deleteCatalogItem()` | `--id` | 0 | Delete a catalog item with the given item ID.<br><br>*Rate limits*:<br>Burst: `75/s`<br>Steady: `700/m` Scopes: `catalogs:write` |
| `delete-catalog-item-relationships-categories` | `klaviyo.deleteCatalogItemRelationshipsCategories()` | `--data` `--id` | 0 | Delete catalog category relationships for the given item ID.<br><br>*Rate limits*:<br>Burst: `75/s`<br>Steady: `700/m` Scopes: `catalogs:write` |
| `delete-catalog-variant` | `klaviyo.deleteCatalogVariant()` | `--id` | 0 | Delete a catalog item variant with the given variant ID.<br><br>*Rate limits*:<br>Burst: `75/s`<br>Steady: `700/m` Scopes: `catalogs:write` |
| `delete-coupon` | `klaviyo.deleteCoupon()` | `--id` | 0 | Delete the coupon with the given coupon ID.<br><br>*Rate limits*:<br>Burst: `3/s`<br>Steady: `60/m` Scopes: `coupons:write` |
| `delete-coupon-code` | `klaviyo.deleteCouponCode()` | `--id` | 0 | Deletes a coupon code specified by the given identifier synchronously |
| `delete-flow` | `klaviyo.deleteFlow()` | `--id` | 0 | Delete a flow with the given flow ID.<br><br>*Rate limits*:<br>Burst: `3/s`<br>Steady: `60/m` Scopes: `flows:write` |
| `delete-list` | `klaviyo.deleteList()` | `--id` | 0 | Delete a list with the given list ID.<br><br>*Rate limits*:<br>Burst: `10/s`<br>Steady: `150/m` Scopes: `lists:write` |
| `delete-segment` | `klaviyo.deleteSegment()` | `--id` | 0 | Delete a segment with the given segment ID.<br><br>*Rate limits*:<br>Burst: `3/s`<br>Steady: `60/m` Scopes: `segments:write` |
| `delete-tag` | `klaviyo.deleteTag()` | `--id` | 0 | Delete the tag with the given tag ID |
| `delete-tag-group` | `klaviyo.deleteTagGroup()` | `--id` | 0 | Delete a specified tag group and its contents; associated resource links will be removed |
| `delete-tag-relationships` | `klaviyo.deleteTagRelationships()` | `--data` `--id` `--related-resource` | 0 | Remove a tag's association with other resources like flows, campaigns, lists, or segments |
| `delete-template` | `klaviyo.deleteTemplate()` | `--id` | 0 | Permanently delete a template from your Klaviyo account using its unique template ID |
| `delete-webhook` | `klaviyo.deleteWebhook()` | `--id` | 0 | Permanently delete a webhook subscription from your Klaviyo account |
| `get-account` | `klaviyo.getAccount()` | `--id` | 1 | Retrieve a single account object by its account ID |
| `get-accounts` | `klaviyo.getAccounts()` | — | 1 | Use a private API key to fetch an associated account's details like contact info, timezone, and currency, as well as validate the key |
| `get-bulk-create-coupon-codes-job` | `klaviyo.getBulkCreateCouponCodesJob()` | `--job-id` | 0 | Get a coupon code bulk create job with the given job ID |
| `get-bulk-delete-catalog-items-job` ·common | `klaviyo.getBulkDeleteCatalogItemsJob()` | `--job-id` | 0 | Get a catalog item bulk delete job with the given job ID |
| `get-bulk-profile-import-job` | `klaviyo.getBulkProfileImportJob()` | `--job-id` | 3 | Get a bulk profile import job with the given job ID.<br><br>*Rate limits*:<br>Burst: `10/s`<br>Steady: `150/m` Scopes: `lists:read` `profiles:read` |
| `get-bulk-profile-import-job-errors` | `klaviyo.getBulkProfileImportJobErrors()` | `--id` | 3 | Get import errors for the bulk profile import job with the given ID.<br><br>*Rate limits*:<br>Burst: `10/s`<br>Steady: `150/m` Scopes: `profiles:read` |
| `get-bulk-profile-import-job-lists` | `klaviyo.getBulkProfileImportJobLists()` | `--id` | 1 | Get list for the bulk profile import job with the given ID.<br><br>*Rate limits*:<br>Burst: `10/s`<br>Steady: `150/m` Scopes: `lists:read` |
| `get-bulk-profile-import-job-profiles` | `klaviyo.getBulkProfileImportJobProfiles()` | `--id` | 4 | Get profiles for the bulk profile import job with the given ID.<br><br>*Rate limits*:<br>Burst: `10/s`<br>Steady: `150/m` Scopes: `profiles:read` |
| `get-bulk-profile-import-job-relationships-lists` | `klaviyo.getBulkProfileImportJobRelationshipsLists()` | `--id` | 0 | Get list relationship for the bulk profile import job with the given ID.<br><br>*Rate limits*:<br>Burst: `10/s`<br>Steady: `150/m` Scopes: `lists:read` |
| `get-bulk-profile-import-job-relationships-profiles` | `klaviyo.getBulkProfileImportJobRelationshipsProfiles()` | `--id` | 2 | Get profile relationships for the bulk profile import job with the given ID.<br><br>*Rate limits*:<br>Burst: `10/s`<br>Steady: `150/m` Scopes: `profiles:read` |
| `get-bulk-profile-import-jobs` | `klaviyo.getBulkProfileImportJobs()` | — | 5 | Get all bulk profile import jobs |
| `get-bulk-update-catalog-items-job` | `klaviyo.getBulkUpdateCatalogItemsJob()` | `--job-id` | 3 | Get a catalog item bulk update job with the given job ID |
| `get-bulk-update-categories-job` ·common | `klaviyo.getBulkUpdateCategoriesJob()` | `--job-id` | 1 | Retrieve a catalog category bulk update job by its ID from Klaviyo |
| `get-bulk-update-variants-job` | `klaviyo.getBulkUpdateVariantsJob()` | `--job-id` | 1 | Retrieve a catalog variant bulk update job by its ID |
| `get-campaign` ·common | `klaviyo.getCampaign()` | `--campaign-id` | 2 | Retrieve a specific campaign by its ID from Klaviyo |
| `get-campaign-campaign-messages` | `klaviyo.getCampaignCampaignMessages()` | `--id` | 4 | Return all messages that belong to the given campaign.<br><br>*Rate limits*:<br>Burst: `10/s`<br>Steady: `150/m` Scopes: `campaigns:read` |
| `get-campaign-message` | `klaviyo.getCampaignMessage()` | `--id` | 4 | Returns a specific message based on a required id.<br><br>*Rate limits*:<br>Burst: `10/s`<br>Steady: `150/m` Scopes: `campaigns:read` |
| `get-campaign-message-campaign` | `klaviyo.getCampaignMessageCampaign()` | `--id` | 1 | Return the related campaign<br><br>*Rate limits*:<br>Burst: `10/s`<br>Steady: `150/m` Scopes: `campaigns:read` |
| `get-campaign-message-relationships-campaign` | `klaviyo.getCampaignMessageRelationshipsCampaign()` | `--id` | 0 | Returns the ID of the related campaign<br><br>*Rate limits*:<br>Burst: `10/s`<br>Steady: `150/m` Scopes: `campaigns:read` |
| `get-campaign-message-relationships-template` | `klaviyo.getCampaignMessageRelationshipsTemplate()` | `--id` | 0 | Returns the ID of the related template<br><br>*Rate limits*:<br>Burst: `10/s`<br>Steady: `150/m` Scopes: `campaigns:read` `templates:read` |
| `get-campaign-message-template` | `klaviyo.getCampaignMessageTemplate()` | `--id` | 1 | Return the related template<br><br>*Rate limits*:<br>Burst: `10/s`<br>Steady: `150/m` Scopes: `campaigns:read` `templates:read` |
| `get-campaign-recipient-estimation` | `klaviyo.getCampaignRecipientEstimation()` | `--id` | 1 | Get estimated recipients for a given campaign ID using `Create Campaign Recipient Estimation Job` |
| `get-campaign-recipient-estimation-job` | `klaviyo.getCampaignRecipientEstimationJob()` | `--id` | 1 | Retrieve the status of a recipient estimation job triggered with the `Create Campaign Recipient Estimation Job` endpoint.<br><br>*Rate limits*:<br>Burst: `10/s`<br>Steady: `150/m` Scopes… |
| `get-campaign-relationships-campaign-messages` | `klaviyo.getCampaignRelationshipsCampaignMessages()` | `--id` | 0 | Returns the IDs of all messages associated with the given campaign.<br><br>*Rate limits*:<br>Burst: `10/s`<br>Steady: `150/m` Scopes: `campaigns:read` |
| `get-campaign-relationships-tags` | `klaviyo.getCampaignRelationshipsTags()` | `--id` | 0 | Returns the IDs of all tags associated with the given campaign.<br><br>*Rate limits*:<br>Burst: `3/s`<br>Steady: `60/m` Scopes: `campaigns:read` `tags:read` |
| `get-campaign-send-job` | `klaviyo.getCampaignSendJob()` | `--id` | 1 | Get a campaign send job<br><br>*Rate limits*:<br>Burst: `10/s`<br>Steady: `150/m` Scopes: `campaigns:read` |
| `get-campaign-tags` | `klaviyo.getCampaignTags()` | `--id` | 1 | Return all tags that belong to the given campaign.<br><br>*Rate limits*:<br>Burst: `3/s`<br>Steady: `60/m` Scopes: `campaigns:read` `tags:read` |
| `get-campaigns` ·common | `klaviyo.getCampaigns()` | — | 5 | Retrieve campaigns from your Klaviyo account |
| `get-catalog-categories` | `klaviyo.getCatalogCategories()` | — | 4 | Retrieve up to 100 account catalog categories, sortable by creation date |
| `get-catalog-category` | `klaviyo.getCatalogCategory()` | `--id` | 1 | Get a catalog category with the given category ID.<br><br>*Rate limits*:<br>Burst: `350/s`<br>Steady: `3500/m` Scopes: `catalogs:read` |
| `get-catalog-category-items` | `klaviyo.getCatalogCategoryItems()` | `--id` | 6 | Retrieve up to 100 sorted items per request from a category using the category ID |
| `get-catalog-category-relationships-items` | `klaviyo.getCatalogCategoryRelationshipsItems()` | `--id` | 1 | Get all items in the given category ID |
| `get-catalog-item` | `klaviyo.getCatalogItem()` | `--id` | 3 | Get a specific catalog item with the given item ID.<br><br>*Rate limits*:<br>Burst: `350/s`<br>Steady: `3500/m` Scopes: `catalogs:read` |
| `get-catalog-item-categories` | `klaviyo.getCatalogItemCategories()` | `--id` | 4 | Retrieve the catalog categories for an item by ID, sorted by 'created' date, with a 100-category maximum per request |
| `get-catalog-item-relationships-categories` | `klaviyo.getCatalogItemRelationshipsCategories()` | `--id` | 1 | Get all catalog categories that a particular item is in |
| `get-catalog-item-variants` | `klaviyo.getCatalogItemVariants()` | `--id` | 4 | Retrieve up to 100 variants per request for a specific item ID, sortable by creation date |
| `get-catalog-items` | `klaviyo.getCatalogItems()` | — | 6 | Retrieve up to 100 sorted catalog items per account, with `$custom` integration and `$default` type |
| `get-catalog-variant` | `klaviyo.getCatalogVariant()` | `--id` | 1 | Get a catalog item variant with the given variant ID.<br><br>*Rate limits*:<br>Burst: `350/s`<br>Steady: `3500/m` Scopes: `catalogs:read` |
| `get-catalog-variants` | `klaviyo.getCatalogVariants()` | — | 4 | Retrieve up to 100 account variants per request, sortable by creation date |
| `get-coupon` | `klaviyo.getCoupon()` | `--id` | 1 | Get a specific coupon with the given coupon ID.<br><br>*Rate limits*:<br>Burst: `75/s`<br>Steady: `700/m` Scopes: `coupons:read` |
| `get-coupon-code` | `klaviyo.getCouponCode()` | `--id` | 3 | Returns a Coupon Code specified by the given identifier.<br><br>*Rate limits*:<br>Burst: `350/s`<br>Steady: `3500/m` Scopes: `coupon-codes:read` |
| `get-coupon-code-bulk-create-job` | `klaviyo.getCouponCodeBulkCreateJob()` | `--job-id` | 3 | Get a coupon code bulk create job with the given job ID.<br><br>*Rate limits*:<br>Burst: `75/s`<br>Steady: `700/m` Scopes: `coupon-codes:read` |
| `get-coupon-code-bulk-create-jobs` | `klaviyo.getCouponCodeBulkCreateJobs()` | — | 3 | Get all coupon code bulk create jobs |
| `get-coupon-code-relationships-coupon` | `klaviyo.getCouponCodeRelationshipsCoupon()` | `--id` | 1 | Gets a list of coupon code relationships associated with the given coupon id<br><br>*Rate limits*:<br>Burst: `75/s`<br>Steady: `700/m` Scopes: `coupon-codes:read` |
| `get-coupon-codes` | `klaviyo.getCouponCodes()` | — | 5 | Obtains coupon codes using necessary coupon or profile filters |
| `get-coupon-codes-for-coupon` | `klaviyo.getCouponCodesForCoupon()` | `--id` | 3 | Gets a list of coupon codes associated with the given coupon id<br><br>*Rate limits*:<br>Burst: `75/s`<br>Steady: `700/m` Scopes: `coupon-codes:read` |
| `get-coupon-for-coupon-code` | `klaviyo.getCouponForCouponCode()` | `--id` | 1 | Get the coupon associated with a given coupon code ID.<br><br>*Rate limits*:<br>Burst: `75/s`<br>Steady: `700/m` Scopes: `coupons:read` |
| `get-coupon-id-for-coupon-code` | `klaviyo.getCouponIdForCouponCode()` | `--id` | 0 | Get the coupon relationship associated with a given coupon code ID |
| `get-coupon-relationships-coupon-codes` | `klaviyo.getCouponRelationshipsCouponCodes()` | `--id` | 0 | Retrieves the coupon code relationships (resource identifiers) for a given coupon |
| `get-coupons` | `klaviyo.getCoupons()` | — | 2 | Get all coupons in an account |
| `get-create-categories-job` | `klaviyo.getCreateCategoriesJob()` | `--job-id` | 3 | Get a catalog category bulk create job with the given job ID |
| `get-create-categories-jobs` | `klaviyo.getCreateCategoriesJobs()` | — | 3 | Get all catalog category bulk create jobs |
| `get-create-items-job` | `klaviyo.getCreateItemsJob()` | `--job-id` | 3 | Get a catalog item bulk create job with the given job ID |
| `get-create-items-jobs` | `klaviyo.getCreateItemsJobs()` | — | 3 | Get all catalog item bulk create jobs |
| `get-create-variants-job` | `klaviyo.getCreateVariantsJob()` | `--job-id` | 3 | Get a catalog variant bulk create job with the given job ID |
| `get-create-variants-jobs` | `klaviyo.getCreateVariantsJobs()` | — | 3 | Get all catalog variant bulk create jobs |
| `get-delete-categories-job` | `klaviyo.getDeleteCategoriesJob()` | `--job-id` | 1 | Get a catalog category bulk delete job with the given job ID.<br><br>*Rate limits*:<br>Burst: `350/s`<br>Steady: `3500/m` Scopes: `catalogs:read` |
| `get-delete-categories-jobs` | `klaviyo.getDeleteCategoriesJobs()` | — | 3 | Get all catalog category bulk delete jobs |
| `get-delete-items-jobs` | `klaviyo.getDeleteItemsJobs()` | — | 3 | Get all catalog item bulk delete jobs |
| `get-delete-variants-job` | `klaviyo.getDeleteVariantsJob()` | `--job-id` | 1 | Get a catalog variant bulk delete job with the given job ID.<br><br>*Rate limits*:<br>Burst: `350/s`<br>Steady: `3500/m` Scopes: `catalogs:read` |
| `get-delete-variants-jobs` | `klaviyo.getDeleteVariantsJobs()` | — | 3 | Get all catalog variant bulk delete jobs |
| `get-event` | `klaviyo.getEvent()` | `--id` | 4 | Get an event with the given event ID.<br><br>*Rate limits*:<br>Burst: `10/s`<br>Steady: `150/m` Scopes: `events:read` |
| `get-event-metric` | `klaviyo.getEventMetric()` | `--id` | 1 | Get the metric for an event with the given event ID.<br><br>*Rate limits*:<br>Burst: `350/s`<br>Steady: `3500/m` Scopes: `events:read` `metrics:read` |
| `get-event-profile` | `klaviyo.getEventProfile()` | `--id` | 2 | Get the profile associated with an event with the given event ID.<br><br>*Rate limits*:<br>Burst: `350/s`<br>Steady: `3500/m` Scopes: `events:read` `profiles:read` |
| `get-event-relationships` | `klaviyo.getEventRelationships()` | `--id` `--related-resource` | 0 | Get metrics or profile relationships for a specific event |
| `get-events` ·common | `klaviyo.getEvents()` | — | 7 | Get all events in an account Requests can be sorted by the following fields: `datetime`, `timestamp` Returns a maximum of 200 events per page.<br><br>*Rate limits*:<br>Burst: `350/s`<br>Steady… |
| `get-flow` | `klaviyo.getFlow()` | `--id` | 4 | Get a flow with the given flow ID.<br><br>*Rate limits*:<br>Burst: `3/s`<br>Steady: `60/m` Scopes: `flows:read` |
| `get-flow-action` | `klaviyo.getFlowAction()` | `--id` | 4 | Get a flow action from a flow with the given flow action ID.<br><br>*Rate limits*:<br>Burst: `3/s`<br>Steady: `60/m` Scopes: `flows:read` |
| `get-flow-action-for-message` | `klaviyo.getFlowActionForMessage()` | `--id` | 1 | Get the flow action for a flow message with the given message ID.<br><br>*Rate limits*:<br>Burst: `3/s`<br>Steady: `60/m` Scopes: `flows:read` |
| `get-flow-action-messages` | `klaviyo.getFlowActionMessages()` | `--id` | 4 | Retrieve up to 50 flow messages per request by action ID, sortable by various fields, with ascending/descending options, and paginated using `page[size]` and `page[number]` |
| `get-flow-action-relationships-flow` | `klaviyo.getFlowActionRelationshipsFlow()` | `--id` | 0 | Get the parent flow associated with a given flow action ID |
| `get-flow-action-relationships-messages` | `klaviyo.getFlowActionRelationshipsMessages()` | `--id` | 4 | Retrieves up to 50 flow message relationships per request for a specified flow action ID, with cursor pagination |
| `get-flow-flow-actions` | `klaviyo.getFlowFlowActions()` | `--id` | 5 | Get all flow actions associated with the given flow ID |
| `get-flow-for-flow-action` | `klaviyo.getFlowForFlowAction()` | `--id` | 1 | Get the flow associated with the given action ID.<br><br>*Rate limits*:<br>Burst: `3/s`<br>Steady: `60/m` Scopes: `flows:read` |
| `get-flow-message` | `klaviyo.getFlowMessage()` | `--id` | 4 | Get the flow message of a flow with the given message ID.<br><br>*Rate limits*:<br>Burst: `3/s`<br>Steady: `60/m` Scopes: `flows:read` |
| `get-flow-message-relationships-action` | `klaviyo.getFlowMessageRelationshipsAction()` | `--id` | 0 | Get the flow action relationship for a specific flow message |
| `get-flow-message-relationships-template` | `klaviyo.getFlowMessageRelationshipsTemplate()` | `--id` | 0 | Returns the ID of the related template<br><br>*Rate limits*:<br>Burst: `3/s`<br>Steady: `60/m` Scopes: `templates:read` |
| `get-flow-message-template` | `klaviyo.getFlowMessageTemplate()` | `--id` | 1 | Return the related template<br><br>*Rate limits*:<br>Burst: `3/s`<br>Steady: `60/m` Scopes: `templates:read` |
| `get-flow-relationships-flow-actions` | `klaviyo.getFlowRelationshipsFlowActions()` | `--id` | 3 | Retrieve all flow action relationships for a specific flow ID, sortable by `id`, `status`, `created`, `updated` |
| `get-flow-relationships-tags` | `klaviyo.getFlowRelationshipsTags()` | `--id` | 0 | Return the tag IDs of all tags associated with the given flow.<br><br>*Rate limits*:<br>Burst: `3/s`<br>Steady: `60/m` Scopes: `flows:read` `tags:read` |
| `get-flow-tags` | `klaviyo.getFlowTags()` | `--id` | 1 | Return all tags associated with the given flow ID.<br><br>*Rate limits*:<br>Burst: `3/s`<br>Steady: `60/m` Scopes: `flows:read` `tags:read` |
| `get-flows` | `klaviyo.getFlows()` | — | 8 | Get all flows in an account |
| `get-form` | `klaviyo.getForm()` | `--id` | 3 | Get the form with the given ID.<br><br>*Rate limits*:<br>Burst: `3/s`<br>Steady: `60/m` Scopes: `forms:read` |
| `get-form-for-form-version` | `klaviyo.getFormForFormVersion()` | `--id` | 1 | Get the form associated with the given form version.<br><br>*Rate limits*:<br>Burst: `3/s`<br>Steady: `60/m` Scopes: `forms:read` |
| `get-form-id-for-form-version` | `klaviyo.getFormIdForFormVersion()` | `--id` | 0 | Get the ID of the form associated with the given form version.<br><br>*Rate limits*:<br>Burst: `3/s`<br>Steady: `60/m` Scopes: `forms:read` |
| `get-form-version` | `klaviyo.getFormVersion()` | `--id` | 1 | Retrieve detailed information about a specific form version by its ID |
| `get-forms` | `klaviyo.getForms()` | — | 5 | Get all forms in an account.<br><br>*Rate limits*:<br>Burst: `3/s`<br>Steady: `60/m` Scopes: `forms:read` |
| `get-image` | `klaviyo.getImage()` | `--id` | 1 | Get the image with the given image ID.<br><br>*Rate limits*:<br>Burst: `10/s`<br>Steady: `150/m` Scopes: `images:read` |
| `get-images` | `klaviyo.getImages()` | — | 5 | Get all images in an account.<br><br>*Rate limits*:<br>Burst: `10/s`<br>Steady: `150/m` Scopes: `images:read` |
| `get-list` | `klaviyo.getList()` | `--id` | 4 | API allows 75 req/sec and 700 req/min, but with 'profile_count' param, it's 1 req/sec and 15 req/min |
| `get-list-profiles` | `klaviyo.getListProfiles()` | `--id` | 6 | Retrieve profiles in a list by ID, filterable by email/phone/push token/join date, sortable by join date |
| `get-list-relationships` | `klaviyo.getListRelationships()` | `--id` | 2 | Get profile membership relationships for a Klaviyo list |
| `get-list-relationships-tags` | `klaviyo.getListRelationshipsTags()` | `--id` | 0 | Returns the tag IDs of all tags associated with the given list.<br><br>*Rate limits*:<br>Burst: `3/s`<br>Steady: `60/m` Scopes: `lists:read` `tags:read` |
| `get-list-tags` | `klaviyo.getListTags()` | `--id` | 1 | Return all tags associated with the given list ID.<br><br>*Rate limits*:<br>Burst: `3/s`<br>Steady: `60/m` Scopes: `lists:read` `tags:read` |
| `get-lists` ·common | `klaviyo.getLists()` | — | 4 | Retrieve marketing lists from your Klaviyo account |
| `get-metric` | `klaviyo.getMetric()` | `--id` | 1 | Get a metric with the given metric ID.<br><br>*Rate limits*:<br>Burst: `10/s`<br>Steady: `150/m` Scopes: `metrics:read` |
| `get-metrics` | `klaviyo.getMetrics()` | — | 3 | Get all metrics in an account |
| `get-profile` | `klaviyo.getProfile()` | `--id` | 5 | Get the profile with the given profile ID.<br><br>*Rate limits*:<br>Burst: `75/s`<br>Steady: `700/m` Scopes: `profiles:read` |
| `get-profile-lists` | `klaviyo.getProfileLists()` | `--id` | 2 | Get list memberships for a profile with the given profile ID.<br><br>*Rate limits*:<br>Burst: `3/s`<br>Steady: `60/m` Scopes: `lists:read` `profiles:read` |
| `get-profile-relationships` | `klaviyo.getProfileRelationships()` | `--id` `--related-resource` | 0 | Get list membership or segment membership relationships for a profile with the given profile ID |
| `get-profile-segments` | `klaviyo.getProfileSegments()` | `--id` | 1 | Get segment memberships for a profile with the given profile ID.<br><br>*Rate limits*:<br>Burst: `3/s`<br>Steady: `60/m` Scopes: `profiles:read` `segments:read` |
| `get-profiles` ·common | `klaviyo.getProfiles()` | — | 6 | Retrieve profiles from your Klaviyo account |
| `get-segment` | `klaviyo.getSegment()` | `--id` | 4 | Fetch a segment by ID with default rates of 75/s and 700/m, or with `additional-fields` at 1/s and 15/m |
| `get-segment-profiles` | `klaviyo.getSegmentProfiles()` | `--id` | 6 | Retrieve profiles in a segment by ID, filtering by email, phone, token, or join date, and sorting by join date |
| `get-segment-relationships` | `klaviyo.getSegmentRelationships()` | `--id` `--related-resource` | 1 | Get all profile membership or tag relationships for a segment |
| `get-segment-tags` | `klaviyo.getSegmentTags()` | `--id` | 1 | Return all tags associated with the given segment ID.<br><br>*Rate limits*:<br>Burst: `3/s`<br>Steady: `60/m` Scopes: `segments:read` `tags:read` |
| `get-segments` | `klaviyo.getSegments()` | — | 6 | Fetch segments from an account with filters like `name`, `created`, and `updated` |
| `get-tag` | `klaviyo.getTag()` | `--id` | 3 | Retrieve the tag with the given tag ID.<br><br>*Rate limits*:<br>Burst: `3/s`<br>Steady: `60/m` Scopes: `tags:read` |
| `get-tag-group` | `klaviyo.getTagGroup()` | `--id` | 1 | Retrieve the tag group with the given tag group ID.<br><br>*Rate limits*:<br>Burst: `3/s`<br>Steady: `60/m` Scopes: `tags:read` |
| `get-tag-group-relationships-tags` | `klaviyo.getTagGroupRelationshipsTags()` | `--id` | 0 | Returns the tag IDs of all tags inside the given tag group.<br><br>*Rate limits*:<br>Burst: `3/s`<br>Steady: `60/m` Scopes: `tags:read` |
| `get-tag-group-tags` | `klaviyo.getTagGroupTags()` | `--id` | 1 | Return the tags for a given tag group ID.<br><br>*Rate limits*:<br>Burst: `3/s`<br>Steady: `60/m` Scopes: `tags:read` |
| `get-tag-groups` | `klaviyo.getTagGroups()` | — | 4 | Retrieve up to 25 tag groups per account, sortable/filterable by specific attributes |
| `get-tag-relationships` | `klaviyo.getTagRelationships()` | `--id` `--related-resource` | 0 | Retrieve relationship IDs for a tag |
| `get-tag-tag-group` | `klaviyo.getTagTagGroup()` | `--id` | 1 | Returns the tag group resource for a given tag ID.<br><br>*Rate limits*:<br>Burst: `3/s`<br>Steady: `60/m` Scopes: `tags:read` |
| `get-tags` | `klaviyo.getTags()` | — | 6 | Retrieve up to 50 account tags at once, filterable/sortable by name or id, with cursor pagination |
| `get-template` | `klaviyo.getTemplate()` | `--id` | 1 | Get a template with the given template ID.<br><br>*Rate limits*:<br>Burst: `10/s`<br>Steady: `150/m` Scopes: `templates:read` |
| `get-templates` | `klaviyo.getTemplates()` | — | 4 | Retrieve account templates with sorting options (`id`, `name`, `created`, `updated`) |
| `get-update-categories-jobs` | `klaviyo.getUpdateCategoriesJobs()` | — | 3 | Get all catalog category bulk update jobs |
| `get-update-items-job` | `klaviyo.getUpdateItemsJob()` | `--job-id` | 3 | Get a catalog item bulk update job with the given job ID |
| `get-update-items-jobs` | `klaviyo.getUpdateItemsJobs()` | — | 3 | Get all catalog item bulk update jobs |
| `get-update-variants-jobs` | `klaviyo.getUpdateVariantsJobs()` | — | 3 | Get all catalog variant bulk update jobs |
| `get-variant-ids-for-catalog-item` | `klaviyo.getVariantIdsForCatalogItem()` | `--id` | 3 | Get all variant IDs related to a given catalog item ID |
| `get-version-ids-for-form` | `klaviyo.getVersionIdsForForm()` | `--id` | 0 | Get the IDs of the form versions for the given form.<br><br>*Rate limits*:<br>Burst: `3/s`<br>Steady: `60/m` Scopes: `forms:read` |
| `get-versions-for-form` | `klaviyo.getVersionsForForm()` | `--id` | 5 | Get the form versions for the given form.<br><br>*Rate limits*:<br>Burst: `3/s`<br>Steady: `60/m` Scopes: `forms:read` |
| `get-webhook` | `klaviyo.getWebhook()` | `--id` | 2 | Get the webhook with the given ID.<br><br>*Rate limits*:<br>Burst: `1/s`<br>Steady: `15/m` Scopes: `webhooks:read` |
| `get-webhook-topic` | `klaviyo.getWebhookTopic()` | `--id` | 0 | Retrieve details of a specific webhook topic by its ID |
| `get-webhook-topics` | `klaviyo.getWebhookTopics()` | — | 0 | Get all webhook topics in a Klaviyo account.<br><br>*Rate limits*:<br>Burst: `1/s`<br>Steady: `15/m` Scopes: `webhooks:read` |
| `get-webhooks` | `klaviyo.getWebhooks()` | — | 2 | Get all webhooks in an account.<br><br>*Rate limits*:<br>Burst: `1/s`<br>Steady: `15/m` Scopes: `webhooks:read` |
| `merge-profiles` | `klaviyo.mergeProfiles()` | `--data--id` `--data--relationships--profiles--data` | 1 | Merge one or more source profiles into a destination profile |
| `query-campaign-values` | `klaviyo.queryCampaignValues()` | `--data--attributes--conversion--metric--id` | 5 | Returns the requested campaign analytics values data<br><br>*Rate limits*:<br>Burst: `1/s`<br>Steady: `2/m`<br>Daily: `225/d` Scopes: `campaigns:read` |
| `query-flow-series` | `klaviyo.queryFlowSeries()` | `--data--attributes--conversion--metric--id` `--data--attributes--interval` `--data--attributes--statistics` `--data--attributes--timeframe` | 3 | Returns time-series analytics data for flows, enabling performance tracking over time intervals |
| `query-flow-values` | `klaviyo.queryFlowValues()` | `--data--attributes--conversion-metric-id` | 5 | Returns the requested flow analytics values data<br><br>*Rate limits*:<br>Burst: `1/s`<br>Steady: `2/m`<br>Daily: `225/d` Scopes: `flows:read` |
| `query-metric-aggregates` | `klaviyo.queryMetricAggregates()` | — | 12 | The Klaviyo endpoint fetches metric events, handling JSON requests for custom data queries, sorting, and filtering; offers grouping and time-based filters; requires adherence to rate limits (3… |
| `remove-profile-from-list` | `klaviyo.removeProfileFromList()` | `--list-id` | 2 | Remove profiles from a Klaviyo list by profile IDs or email addresses |
| `request-profile-deletion` | `klaviyo.requestProfileDeletion()` | — | 5 | To delete a profile, use only one identifier: email, phone number, or ID |
| `spawn-bulk-profile-import-job` | `klaviyo.spawnBulkProfileImportJob()` | — | 3 | Initiate a job to create/update a batch of profiles, up to 10,000 with a max size of 5MB per request |
| `spawn-coupon-code-bulk-create-job` | `klaviyo.spawnCouponCodeBulkCreateJob()` | `--data--attributes--coupon--codes--data` | 1 | Create a coupon-code-bulk-create-job to bulk create a list of coupon codes |
| `spawn-create-categories-job` | `klaviyo.spawnCreateCategoriesJob()` | — | 2 | Create bulk job for up to 100 catalog categories with a 5MB size limit and a max of 500 concurrent jobs |
| `spawn-create-items-job` | `klaviyo.spawnCreateItemsJob()` | — | 2 | Create batches of up to 100 catalog items with a 5MB size limit using the bulk job, which allows 500 concurrent jobs |
| `spawn-create-variants-job` | `klaviyo.spawnCreateVariantsJob()` | — | 2 | Initiate a job to bulk create up to 100 catalog variants, with a 5MB payload size limit |
| `spawn-delete-categories-job` | `klaviyo.spawnDeleteCategoriesJob()` | `--data--attributes--categories--data` | 1 | Delete multiple catalog categories in bulk, with a limit of 100 per request and a 5MB payload size |
| `spawn-delete-items-job` | `klaviyo.spawnDeleteItemsJob()` | `--data--attributes--items--data` | 1 | Delete batches of catalog items with a bulk job, max 100 items/request, 5MB size limit, and up to 500 concurrent jobs |
| `spawn-delete-variants-job` | `klaviyo.spawnDeleteVariantsJob()` | `--data--attributes--variants--data` | 1 | Delete multiple catalog variants with a bulk job, max 100 per request, 5MB size limit |
| `spawn-update-categories-job` | `klaviyo.spawnUpdateCategoriesJob()` | — | 2 | Create a job to bulk update up to 100 categories, with a 5MB size limit and a maximum of 500 concurrent jobs |
| `spawn-update-items-job` | `klaviyo.spawnUpdateItemsJob()` | — | 2 | You can bulk update up to 100 catalog items with a 5MB payload limit |
| `spawn-update-variants-job` | `klaviyo.spawnUpdateVariantsJob()` | — | 2 | Create a job to bulk update up to 100 catalog variants with a 5MB payload limit |
| `subscribe-profiles` | `klaviyo.subscribeProfiles()` | — | 6 | The API supports double opt-in for marketing, with 'historical_import' bypassing consent |
| `suppress-profiles` | `klaviyo.suppressProfiles()` | — | 6 | Suppress profiles by email, segment, or list ID to stop email marketing, regardless of consent |
| `unregister-client-push-token` | `klaviyo.unregisterClientPushToken()` | `--company-id` | 27 | This endpoint unsubscribes a push token, for use with Klaviyo's mobile SDKs and a public API key |
| `unsubscribe-profiles` | `klaviyo.unsubscribeProfiles()` | — | 4 | Opt-out profiles from email or SMS marketing |
| `unsubscribe-profiles-bulk` | `klaviyo.unsubscribeProfilesBulk()` | `--emails` `--list-id` | 0 | Unsubscribe one or more profiles from a Klaviyo list |
| `unsuppress-profiles` | `klaviyo.unsuppressProfiles()` | — | 6 | Remove 'USER_SUPPRESSED' blocks on profiles manually via email, segment, or list ID |
| `unsuppress-profiles-bulk` | `klaviyo.unsuppressProfilesBulk()` | `--suppressions` | 0 | Unsuppress one or more profiles from email marketing by email address |
| `update-campaign` ·common | `klaviyo.updateCampaign()` | `--campaign-id` | 12 | Update a campaign with the specified attributes |
| `update-campaign-message` | `klaviyo.updateCampaignMessage()` | `--id` | 8 | Update a campaign message<br><br>*Rate limits*:<br>Burst: `10/s`<br>Steady: `150/m` Scopes: `campaigns:write` |
| `update-catalog-category` | `klaviyo.updateCatalogCategory()` | `--id` | 4 | Update a catalog category with the given category ID.<br><br>*Rate limits*:<br>Burst: `75/s`<br>Steady: `700/m` Scopes: `catalogs:write` |
| `update-catalog-category-relationships` | `klaviyo.updateCatalogCategoryRelationships()` | `--data` `--id` `--related-resource` | 0 | Update item relationships for a catalog category |
| `update-catalog-category-relationships-items` | `klaviyo.updateCatalogCategoryRelationshipsItems()` | `--data` `--id` | 0 | Update item relationships for the given category ID.<br><br>*Rate limits*:<br>Burst: `75/s`<br>Steady: `700/m` Scopes: `catalogs:write` |
| `update-catalog-item` | `klaviyo.updateCatalogItem()` | `--id` | 11 | Update a catalog item with the given item ID.<br><br>*Rate limits*:<br>Burst: `75/s`<br>Steady: `700/m` Scopes: `catalogs:write` |
| `update-catalog-item-relationships-categories` | `klaviyo.updateCatalogItemRelationshipsCategories()` | `--data` `--id` | 0 | Update catalog category relationships for the given item ID.<br><br>*Rate limits*:<br>Burst: `75/s`<br>Steady: `700/m` Scopes: `catalogs:write` |
| `update-catalog-variant` | `klaviyo.updateCatalogVariant()` | `--id` | 13 | Update a catalog item variant with the given variant ID.<br><br>*Rate limits*:<br>Burst: `75/s`<br>Steady: `700/m` Scopes: `catalogs:write` |
| `update-coupon` | `klaviyo.updateCoupon()` | `--id` | 3 | Update an existing coupon's properties |
| `update-coupon-code` | `klaviyo.updateCouponCode()` | `--id` | 4 | Updates a coupon code specified by the given identifier synchronously |
| `update-flow-status` | `klaviyo.updateFlowStatus()` | `--data--attributes--status` `--id` | 2 | Update the status of a flow with the given flow ID, and all actions in that flow |
| `update-image` | `klaviyo.updateImage()` | `--id` | 4 | Update the image with the given image ID.<br><br>*Rate limits*:<br>Burst: `10/s`<br>Steady: `150/m` Scopes: `images:write` |
| `update-list` | `klaviyo.updateList()` | `--id` | 3 | Update the name of a list with the given list ID.<br><br>*Rate limits*:<br>Burst: `10/s`<br>Steady: `150/m` Scopes: `lists:write` |
| `update-profile` | `klaviyo.updateProfile()` | `--id` | 22 | Update profiles with the provided ID |
| `update-segment` | `klaviyo.updateSegment()` | `--id` | 5 | Update a segment with the given segment ID.<br><br>*Rate limits*:<br>Burst: `1/s`<br>Steady: `15/m`<br>Daily: `100/d` Scopes: `segments:write` |
| `update-tag` | `klaviyo.updateTag()` | `--data--attributes--name` `--id` | 2 | Update the tag with the given tag ID |
| `update-tag-group` | `klaviyo.updateTagGroup()` | `--id` | 4 | Update the tag group with the given tag group ID |
| `update-template` | `klaviyo.updateTemplate()` | `--id` | 5 | Update an existing email template by ID |
| `update-webhook` | `klaviyo.updateWebhook()` | `--id` | 8 | Update the webhook with the given ID.<br><br>*Rate limits*:<br>Burst: `1/s`<br>Steady: `15/m` Scopes: `webhooks:write` |
| `upload-image-from-file` | `klaviyo.uploadImageFromFile()` | `--file` | 2 | Upload an image from a file |
| `upload-image-from-url` | `klaviyo.uploadImageFromUrl()` | — | 4 | Import an image from a url or data uri |

## Docs

- [run CLI](https://docs.boxd.sh/cli/run): Call connected integrations from the shell, connect new ones, and run automations.
- [Quickstart](https://docs.boxd.sh/guides/integrations/quickstart): Connect an integration, call it from the shell, and turn a script into an automation.
- [Connections](https://docs.boxd.sh/guides/integrations/connections): Connect an account once, for yourself or for your whole organization.
- [Scripts](https://docs.boxd.sh/guides/automations/scripts): Typed integrations, triggers, schedules and state in a .run.ts file.
- [Jobs](https://docs.boxd.sh/guides/automations/jobs): How a script becomes a background job: states, retries, sleep and wake.
- [Beyond the catalog](https://docs.boxd.sh/guides/automations/beyond-the-catalog): Reach your own APIs, databases and cloud accounts from a script.
