instantly-debug-bundle
Automates the collection of diagnostic data from Instantly.ai, including campaign state and error logs, for technical support.
Install
mkdir -p .claude/skills/instantly-debug-bundle && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/3390" && unzip -o skill.zip -d .claude/skills/instantly-debug-bundle && rm skill.zipInstalls to .claude/skills/instantly-debug-bundle
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Collect Instantly.ai debug evidence for support tickets and troubleshooting.Key capabilities
- →Collect Instantly workspace information and campaign states
- →Retrieve Instantly email account details and warmup analytics
- →Gather Instantly webhook configurations and event summaries
- →List recent Instantly background jobs and lead counts per campaign
- →Generate a JSON report of Instantly diagnostic data
- →Identify broken email accounts with SMTP/IMAP/DNS status
How it works
The skill collects various data points from the Instantly API, including workspace, campaigns, accounts, webhooks, and background jobs, then compiles them into a JSON report and provides a console summary.
Inputs & outputs
When to use instantly-debug-bundle
- →Collecting evidence for Instantly support tickets
- →Auditing campaign warmup and health metrics
- →Investigating failed webhook deliveries
- →Generating environment state reports for debugging
About this skill
Instantly Debug Bundle
Overview
Collect a comprehensive debug bundle from your Instantly workspace: campaign state, account health, warmup metrics, lead stats, webhook delivery status, and recent errors. Output is a JSON report suitable for support tickets or internal audits.
Prerequisites
- Completed
instantly-install-authsetup - API key with
all:readscope (or individual read scopes for each resource)
Instructions
Step 1: Collect Full Debug Bundle
import { instantly } from "./src/instantly";
import { writeFileSync } from "fs";
interface DebugBundle {
timestamp: string;
workspace: unknown;
campaigns: unknown[];
accounts: unknown[];
warmup_analytics: unknown[];
webhooks: unknown[];
webhook_event_summary: unknown;
background_jobs: unknown[];
lead_count_by_campaign: Record<string, number>;
errors: string[];
}
async function collectDebugBundle(): Promise<DebugBundle> {
const bundle: DebugBundle = {
timestamp: new Date().toISOString(),
workspace: null,
campaigns: [],
accounts: [],
warmup_analytics: [],
webhooks: [],
webhook_event_summary: null,
background_jobs: [],
lead_count_by_campaign: {},
errors: [],
};
// Workspace info
try {
bundle.workspace = await instantly("/workspaces/current");
} catch (e: any) {
bundle.errors.push(`workspace: ${e.message}`);
}
// All campaigns with status
try {
bundle.campaigns = await instantly("/campaigns?limit=100");
} catch (e: any) {
bundle.errors.push(`campaigns: ${e.message}`);
}
// All email accounts
try {
bundle.accounts = await instantly("/accounts?limit=100");
} catch (e: any) {
bundle.errors.push(`accounts: ${e.message}`);
}
// Warmup analytics for all accounts
try {
const accounts = bundle.accounts as Array<{ email: string }>;
if (accounts.length > 0) {
bundle.warmup_analytics = await instantly("/accounts/warmup-analytics", {
method: "POST",
body: JSON.stringify({ emails: accounts.map((a) => a.email) }),
});
}
} catch (e: any) {
bundle.errors.push(`warmup_analytics: ${e.message}`);
}
// Webhooks
try {
bundle.webhooks = await instantly("/webhooks?limit=50");
} catch (e: any) {
bundle.errors.push(`webhooks: ${e.message}`);
}
// Webhook event delivery summary
try {
bundle.webhook_event_summary = await instantly("/webhook-events/summary");
} catch (e: any) {
bundle.errors.push(`webhook_events: ${e.message}`);
}
// Recent background jobs
try {
bundle.background_jobs = await instantly("/background-jobs?limit=20");
} catch (e: any) {
bundle.errors.push(`background_jobs: ${e.message}`);
}
// Lead counts per campaign
for (const c of (bundle.campaigns as Array<{ id: string; name: string }>).slice(0, 10)) {
try {
const analytics = await instantly<{ total_leads: number }>(
`/campaigns/analytics?id=${c.id}`
);
bundle.lead_count_by_campaign[c.name] = analytics.total_leads;
} catch {
bundle.lead_count_by_campaign[c.name] = -1; // error
}
}
return bundle;
}
Step 2: Save and Analyze
async function main() {
console.log("Collecting Instantly debug bundle...\n");
const bundle = await collectDebugBundle();
// Save to file
const filename = `instantly-debug-${Date.now()}.json`;
writeFileSync(filename, JSON.stringify(bundle, null, 2));
console.log(`Saved debug bundle to ${filename}`);
// Print summary
const campaigns = bundle.campaigns as Array<{ name: string; status: number }>;
const accounts = bundle.accounts as Array<{ email: string; status: number }>;
console.log("\n=== Debug Summary ===");
console.log(`Campaigns: ${campaigns.length}`);
console.log(` Active: ${campaigns.filter((c) => c.status === 1).length}`);
console.log(` Paused: ${campaigns.filter((c) => c.status === 2).length}`);
console.log(` Unhealthy: ${campaigns.filter((c) => c.status === -1).length}`);
console.log(` Bounce Protected: ${campaigns.filter((c) => c.status === -2).length}`);
console.log(`\nAccounts: ${accounts.length}`);
console.log(`Webhooks: ${(bundle.webhooks as any[]).length}`);
console.log(`Background Jobs: ${(bundle.background_jobs as any[]).length}`);
if (bundle.errors.length > 0) {
console.log(`\nErrors during collection:`);
bundle.errors.forEach((e) => console.log(` - ${e}`));
}
}
main().catch(console.error);
Step 3: Account Vitals Deep Dive
async function accountVitalsDiagnostic() {
const accounts = await instantly<Array<{ email: string }>>(
"/accounts?limit=100"
);
const vitals = await instantly("/accounts/test/vitals", {
method: "POST",
body: JSON.stringify({ accounts: accounts.map((a) => a.email) }),
}) as Array<{ email: string; smtp_status: string; imap_status: string; dns_status: string }>;
console.log("\n=== Account Vitals ===");
const broken = vitals.filter((v) => v.smtp_status !== "ok" || v.imap_status !== "ok");
const healthy = vitals.filter((v) => v.smtp_status === "ok" && v.imap_status === "ok");
console.log(`Healthy: ${healthy.length} | Broken: ${broken.length}`);
for (const v of broken) {
console.log(` BROKEN: ${v.email} — SMTP=${v.smtp_status} IMAP=${v.imap_status} DNS=${v.dns_status}`);
}
}
Step 4: Curl-Based Quick Diagnostic
set -euo pipefail
echo "=== Instantly Quick Diagnostic ==="
echo "Timestamp: $(date -u +%Y-%m-%dT%H:%M:%SZ)"
echo -e "\n--- Campaigns ---"
curl -s https://api.instantly.ai/api/v2/campaigns?limit=100 \
-H "Authorization: Bearer $INSTANTLY_API_KEY" | \
jq '[.[] | {name, status, id}] | length as $total |
{total: $total,
active: [.[] | select(.status==1)] | length,
paused: [.[] | select(.status==2)] | length,
unhealthy: [.[] | select(.status==-1)] | length}'
echo -e "\n--- Accounts ---"
curl -s https://api.instantly.ai/api/v2/accounts?limit=100 \
-H "Authorization: Bearer $INSTANTLY_API_KEY" | \
jq 'length as $total | {total: $total, accounts: [.[:5][] | {email, status}]}'
echo -e "\n--- Webhooks ---"
curl -s https://api.instantly.ai/api/v2/webhooks?limit=50 \
-H "Authorization: Bearer $INSTANTLY_API_KEY" | \
jq '[.[] | {name, event_type, target_hook_url}]'
echo -e "\n--- Recent Background Jobs ---"
curl -s https://api.instantly.ai/api/v2/background-jobs?limit=5 \
-H "Authorization: Bearer $INSTANTLY_API_KEY" | \
jq '[.[] | {id, status, timestamp_created}]'
Output
instantly-debug-{timestamp}.json— full debug bundle- Console summary with campaign/account/webhook counts
- Broken account identification with SMTP/IMAP status
- Errors collected during diagnostic
Error Handling
| Error | Cause | Solution |
|---|---|---|
403 on workspace endpoint | Key missing workspace scope | Add all:read scope to API key |
| Empty warmup analytics | No accounts have warmup enabled | Enable warmup first |
| Partial bundle | Some endpoints failed | Check errors array in bundle output |
| Large bundle (>10MB) | 100+ campaigns and accounts | Reduce limits or collect per-campaign |
Resources
- Instantly Help Center
- Instantly API v2 Docs
- Background Jobs API
Next Steps
For error resolution patterns, see instantly-common-errors.
When not to use it
- →When the API key lacks `all:read` scope for all resources
- →When only a partial bundle is needed due to size constraints
Prerequisites
Limitations
- →API key must have `all:read` scope for full bundle collection
- →Warmup analytics may be empty if no accounts have warmup enabled
- →Bundle size can be large with many campaigns and accounts
How it compares
This skill automates the collection of specific Instantly.ai diagnostic data into a structured report, which is more efficient than manually querying each API endpoint.
Compared to similar skills
instantly-debug-bundle side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| instantly-debug-bundle (this skill) | 1 | 25d | Review | Beginner |
| godot | 1,044 | 5mo | Review | Intermediate |
| python-testing-patterns | 77 | 2mo | Review | Intermediate |
| error-handling-patterns | 35 | 2mo | No flags | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by jeremylongshore
View all by jeremylongshore →You might also like
godot
bfollington
This skill should be used when working on Godot Engine projects. It provides specialized knowledge of Godot's file formats (.gd, .tscn, .tres), architecture patterns (component-based, signal-driven, resource-based), common pitfalls, validation tools, code templates, and CLI workflows. The `godot` command is available for running the game, validating scripts, importing resources, and exporting builds. Use this skill for tasks involving Godot game development, debugging scene/resource files, implementing game systems, or creating new Godot components.
python-testing-patterns
wshobson
Implement comprehensive testing strategies with pytest, fixtures, mocking, and test-driven development. Use when writing Python tests, setting up test suites, or implementing testing best practices.
error-handling-patterns
wshobson
Master error handling patterns across languages including exceptions, Result types, error propagation, and graceful degradation to build resilient applications. Use when implementing error handling, designing APIs, or improving application reliability.
chrome-devtools
mrgoonie
Browser automation, debugging, and performance analysis using Puppeteer CLI scripts. Use for automating browsers, taking screenshots, analyzing performance, monitoring network traffic, web scraping, form automation, and JavaScript debugging.
unreal-engine-cpp-pro
sickn33
Expert guide for Unreal Engine 5.x C++ development, covering UObject hygiene, performance patterns, and best practices.
python-performance-optimization
wshobson
Profile and optimize Python code using cProfile, memory profilers, and performance best practices. Use when debugging slow Python code, optimizing bottlenecks, or improving application performance.