From klaviyo-pack
Installs Klaviyo Node.js SDK, configures private API key auth in .env, initializes resource-specific API clients, and verifies connection. Supports Python SDK.
How this skill is triggered — by the user, by Claude, or both
Slash command
/klaviyo-pack:klaviyo-install-authThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Set up the official `klaviyo-api` Node.js SDK and configure private API key authentication against Klaviyo's REST API (revision `2024-10-15`).
Set up the official klaviyo-api Node.js SDK and configure private API key authentication against Klaviyo's REST API (revision 2024-10-15).
# Node.js (official SDK -- NOT @klaviyo/sdk, that's deprecated)
npm install klaviyo-api
# Python
pip install klaviyo-api
Important: The npm package is
klaviyo-api, not@klaviyo/sdk. The SDK exports per-resource API classes (ProfilesApi, EventsApi, etc.) that each take anApiKeySession.
# .env (NEVER commit to git)
KLAVIYO_PRIVATE_KEY=pk_***********************************
KLAVIYO_PUBLIC_KEY=UXxxXx # Only for client-side endpoints
# .gitignore -- ensure secrets are excluded
echo '.env' >> .gitignore
echo '.env.local' >> .gitignore
Klaviyo uses two key types:
| Key Type | Prefix | Use Case | Header |
|---|---|---|---|
| Private API Key | pk_ | Server-side REST API | Authorization: Klaviyo-API-Key pk_*** |
| Public API Key | 6-char | Client-side Track/Identify | Query param company_id |
// src/klaviyo/client.ts
import { ApiKeySession, ProfilesApi, EventsApi, ListsApi } from 'klaviyo-api';
// Create a session with your private API key
const session = new ApiKeySession(process.env.KLAVIYO_PRIVATE_KEY!);
// Instantiate per-resource API clients
export const profilesApi = new ProfilesApi(session);
export const eventsApi = new EventsApi(session);
export const listsApi = new ListsApi(session);
// src/klaviyo/verify.ts
import { ApiKeySession, AccountsApi } from 'klaviyo-api';
async function verifyKlaviyoConnection(): Promise<void> {
const session = new ApiKeySession(process.env.KLAVIYO_PRIVATE_KEY!);
const accountsApi = new AccountsApi(session);
try {
const accounts = await accountsApi.getAccounts();
const account = accounts.body.data[0];
console.log(`Connected to Klaviyo account: ${account.attributes.contactInformation.organizationName}`);
console.log(`Account ID: ${account.id}`);
} catch (error: any) {
if (error.status === 401) {
console.error('Invalid API key. Check KLAVIYO_PRIVATE_KEY in your .env file.');
} else if (error.status === 403) {
console.error('API key lacks required scopes. Generate a new key with full access.');
} else {
console.error(`Connection failed: ${error.status} ${error.message}`);
}
process.exit(1);
}
}
verifyKlaviyoConnection();
All Klaviyo API requests require a revision header. The SDK handles this automatically, but if using raw HTTP:
# Direct cURL test
curl -X GET "https://a.klaviyo.com/api/profiles/" \
-H "Authorization: Klaviyo-API-Key pk_***" \
-H "revision: 2024-10-15" \
-H "Accept: application/vnd.api+json"
klaviyo-api package installed in node_modules.env file with KLAVIYO_PRIVATE_KEY set| Error | Status | Cause | Solution |
|---|---|---|---|
Authentication failed | 401 | Invalid or expired private key | Regenerate key at Settings > API Keys |
Forbidden | 403 | Key missing required scopes | Create key with appropriate scopes (e.g., profiles:read) |
Rate limited | 429 | Exceeded 75 req/s burst or 700 req/min steady | Honor Retry-After header; see klaviyo-rate-limits |
MODULE_NOT_FOUND | N/A | Wrong package name | Use klaviyo-api, not @klaviyo/sdk |
ENOTFOUND a.klaviyo.com | N/A | DNS/network failure | Check internet connectivity, firewall rules |
# pip install klaviyo-api
from klaviyo_api import KlaviyoAPI
klaviyo = KlaviyoAPI(
api_key="pk_***",
max_delay=60, # Max retry delay in seconds
max_retries=3 # Number of retries on 429/5xx
)
# Verify connection
accounts = klaviyo.Accounts.get_accounts()
print(f"Connected: {accounts['data'][0]['attributes']['contact_information']['organization_name']}")
| Scope | Required For |
|---|---|
profiles:read / profiles:write | Create/read/update profiles |
events:read / events:write | Track events, query metrics |
lists:read / lists:write | Manage lists, subscribe profiles |
segments:read | Query segments and members |
campaigns:read / campaigns:write | Create and send campaigns |
flows:read / flows:write | Manage flow actions |
templates:read / templates:write | Create/edit email templates |
data-privacy:write | GDPR/CCPA deletion requests |
After successful auth, proceed to klaviyo-hello-world for your first profile + event API call.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin klaviyo-packApplies production-ready patterns for klaviyo-api Node.js SDK: singleton sessions, type-safe wrappers, lazy API clients, and error handling. For Klaviyo integrations in TypeScript projects.
Installs customerio-node SDK and configures Track/App API authentication using env vars and TypeScript singleton clients for Node.js projects.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.