Salesloft upgrade migration
'Migrate between SalesLoft API versions and handle breaking changes.From its SKILL.md
npx -y skills add jeremylongshore/claude-code-plugins-plus-skills --skill salesloft-upgrade-migrationAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
What its file declares
Copied from the file, not written here
The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
4.3 KB, 903 tokens by cl100k_base, as published. Nobody here has run it
SalesLoft Upgrade & Migration
Overview
SalesLoft REST API is versioned at v2 with no official SDK -- migrations involve endpoint changes, auth flow updates, and response schema changes. The Cadence Import/Export API was a major addition. Key migration: SalesLoft rebranded some endpoints and added OAuth client credentials flow.
Migration Scenarios
Legacy API Key to OAuth 2.0
// BEFORE: Static API key (being deprecated for partner apps)
const api = axios.create({
headers: { Authorization: `Bearer ${process.env.SALESLOFT_API_KEY}` },
});
// AFTER: OAuth 2.0 with token refresh
class SalesloftOAuthClient {
private tokenStore: { access: string; refresh: string; expiresAt: number };
async getClient() {
if (Date.now() > this.tokenStore.expiresAt * 1000 - 300_000) {
await this.refreshToken();
}
return axios.create({
baseURL: 'https://api.salesloft.com/v2',
headers: { Authorization: `Bearer ${this.tokenStore.access}` },
});
}
private async refreshToken() {
const { data } = await axios.post('https://accounts.salesloft.com/oauth/token', {
grant_type: 'refresh_token',
refresh_token: this.tokenStore.refresh,
client_id: process.env.SALESLOFT_CLIENT_ID,
client_secret: process.env.SALESLOFT_CLIENT_SECRET,
});
this.tokenStore = {
access: data.access_token,
refresh: data.refresh_token,
expiresAt: Math.floor(Date.now() / 1000) + data.expires_in,
};
}
}
Adding Client Credentials Flow
// Client credentials: server-to-server, no user interaction
// Recommended for background sync jobs
async function getServiceToken(): Promise<string> {
const { data } = await axios.post('https://accounts.salesloft.com/oauth/token', {
grant_type: 'client_credentials',
client_id: process.env.SALESLOFT_CLIENT_ID,
client_secret: process.env.SALESLOFT_CLIENT_SECRET,
});
return data.access_token; // No refresh token -- request new when expired
}
Cadence Import/Export API Adoption
// Export cadence (portable format -- can import into any SalesLoft instance)
const { data: exported } = await api.get(`/cadence_exports/${cadenceId}.json`);
// Returns agnostic content: steps, email templates, timing
// Import cadence into another instance
const { data: imported } = await api.post('/cadence_imports.json', {
cadence_content: exported.data,
settings: {
name: 'Imported: Q1 Outbound',
shared: false,
},
});
Migration Checklist
- Audit all endpoints used (search codebase for
/v2/) - Check response fields consumed (SalesLoft may add/remove fields)
- Test with staging OAuth app first
- Update error handling for any new error codes
- Verify rate limit costs haven't changed
- Update webhook signature verification if format changed
- Run integration tests against new version
Rollback
# Pin to previous behavior
git checkout -b rollback/salesloft-migration
git revert <migration-commit>
git push origin rollback/salesloft-migration
Error Handling
| Change | Impact | Migration |
|---|---|---|
| API key deprecation | Auth stops working | Switch to OAuth 2.0 |
| New required fields | 422 on create | Add new fields to payloads |
| Endpoint rename | 404 on old path | Update URL in client |
| Rate limit cost change | Unexpected 429s | Recalculate pagination budgets |
Resources
Next Steps
For CI integration during upgrades, see salesloft-ci-integration.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.