From salesloft-pack
Optimizes SalesLoft API performance with caching, incremental syncs, pagination strategies, and connection pooling. For slow responses, bulk operations, or cadence throughput.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin salesloft-packThis skill is limited to using the following tools:
Optimize SalesLoft REST API v2 performance. Key bottlenecks: deep pagination (cost multiplier), no batch endpoints, and per-minute rate limits. Solutions: caching, incremental sync, and pagination-aware request planning.
Optimizes SalesLoft API rate limit costs via pagination avoidance, incremental sync, caching, and webhooks. For usage analysis and bulk operation planning.
Optimizes HubSpot CRM API performance using batch reads, minimal property requests, and caching to handle slow responses and high throughput.
Optimizes Apollo.io API performance in Node.js using connection pooling, per-endpoint TTL caching, bulk operations, and parallel fetching to cut latency on searches and enrichments.
Share bugs, ideas, or general feedback.
Optimize SalesLoft REST API v2 performance. Key bottlenecks: deep pagination (cost multiplier), no batch endpoints, and per-minute rate limits. Solutions: caching, incremental sync, and pagination-aware request planning.
| Operation | Typical | With Caching |
|---|---|---|
| GET /me.json | 80ms | N/A (auth) |
| GET /people.json (page 1) | 120ms | 1ms (cached) |
| POST /people.json | 200ms | N/A (write) |
| GET /activities/emails.json | 150ms | 1ms (cached) |
| Full sync (10k people) | ~20min | ~5min (incremental) |
import { LRUCache } from 'lru-cache';
const cache = new LRUCache<string, any>({ max: 5000, ttl: 60_000 });
async function cachedGet<T>(endpoint: string, params?: Record<string, any>): Promise<T> {
const key = `${endpoint}:${JSON.stringify(params || {})}`;
const hit = cache.get(key);
if (hit) return hit as T;
const { data } = await api.get(endpoint, { params });
cache.set(key, data);
return data;
}
// Cache people lookups (frequent during cadence enrollment)
const person = await cachedGet('/people.json', { email_addresses: ['alex@co.com'] });
// Only fetch records changed since last sync
async function incrementalSync(lastSyncTime: string) {
const updated: any[] = [];
let page = 1;
while (true) {
const { data } = await api.get('/people.json', {
params: {
updated_at: { gt: lastSyncTime }, // ISO 8601
per_page: 100,
page,
sort_by: 'updated_at',
sort_direction: 'ASC',
},
});
updated.push(...data.data);
if (page >= data.metadata.paging.total_pages) break;
page++;
}
return { updated, newSyncTime: new Date().toISOString() };
}
// Deep pages cost 3-30x. Instead of paginating all 25k records,
// use updated_at filter to get incremental changes
function shouldUseIncremental(totalCount: number): boolean {
// If total records > 1000, incremental sync is more efficient
// Full pagination of 250 pages = 910 cost points vs.
// incremental of last 50 changes = 1 page = 1 point
return totalCount > 1000;
}
import { Agent } from 'https';
const agent = new Agent({
keepAlive: true,
maxSockets: 10, // Max concurrent connections
maxFreeSockets: 5, // Keep idle connections alive
timeout: 30_000,
});
const api = axios.create({
baseURL: 'https://api.salesloft.com/v2',
headers: { Authorization: `Bearer ${process.env.SALESLOFT_API_KEY}` },
httpsAgent: agent,
});
// Parallelize independent reads (each costs 1 point)
const [people, cadences, activities] = await Promise.all([
api.get('/people.json', { params: { per_page: 100 } }),
api.get('/cadences.json', { params: { per_page: 50 } }),
api.get('/activities/emails.json', { params: { per_page: 100 } }),
]);
// 3 points total, ~120ms parallel vs ~360ms sequential
| Issue | Cause | Solution |
|---|---|---|
| Cache stampede | TTL expiry under load | Stale-while-revalidate pattern |
| Incremental misses | Clock skew | Use updated_at from last response, not local clock |
| Connection timeout | Pool exhausted | Increase maxSockets or reduce concurrency |
| Rate limit on bulk | Too many parallel requests | Use p-queue with intervalCap: 10 |
For cost optimization, see salesloft-cost-tuning.