From salesloft-pack
Set up SalesLoft API authentication with OAuth 2.0 or API key. Use when configuring a new SalesLoft integration, setting up OAuth flows, or initializing API access to the SalesLoft REST API v2. Trigger: "install salesloft", "setup salesloft", "salesloft auth", "salesloft API key".
npx claudepluginhub flight505/skill-forge --plugin salesloft-packThis skill is limited to using the following tools:
Configure access to the SalesLoft REST API v2. SalesLoft supports two OAuth 2.0 flows (authorization code and client credentials) plus API key auth. All requests require `Authorization: Bearer <token>` header. Base URL: `https://api.salesloft.com/v2/`.
Guides Next.js Cache Components and Partial Prerendering (PPR): 'use cache' directives, cacheLife(), cacheTag(), revalidateTag() for caching, invalidation, static/dynamic optimization. Auto-activates on cacheComponents: true.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Share bugs, ideas, or general feedback.
Configure access to the SalesLoft REST API v2. SalesLoft supports two OAuth 2.0 flows (authorization code and client credentials) plus API key auth. All requests require Authorization: Bearer <token> header. Base URL: https://api.salesloft.com/v2/.
# Node.js — no official SDK, use axios or fetch
npm install axios dotenv
# Python
pip install requests python-dotenv
http://localhost:3000/callback)client_id and client_secret# .env
SALESLOFT_CLIENT_ID=your-client-id
SALESLOFT_CLIENT_SECRET=your-client-secret
SALESLOFT_REDIRECT_URI=http://localhost:3000/callback
SALESLOFT_API_KEY=your-api-key # If using API key auth
import axios from 'axios';
// Step 1: Redirect user to authorize
const authUrl = `https://accounts.salesloft.com/oauth/authorize?` +
`client_id=${process.env.SALESLOFT_CLIENT_ID}` +
`&redirect_uri=${encodeURIComponent(process.env.SALESLOFT_REDIRECT_URI!)}` +
`&response_type=code`;
// Step 2: Exchange code for token (in callback handler)
async function exchangeCode(code: string) {
const { data } = await axios.post('https://accounts.salesloft.com/oauth/token', {
client_id: process.env.SALESLOFT_CLIENT_ID,
client_secret: process.env.SALESLOFT_CLIENT_SECRET,
code,
grant_type: 'authorization_code',
redirect_uri: process.env.SALESLOFT_REDIRECT_URI,
});
// data.access_token, data.refresh_token, data.expires_in
return data;
}
// No user interaction — recommended for background tasks
async function getServiceToken() {
const { data } = await axios.post('https://accounts.salesloft.com/oauth/token', {
client_id: process.env.SALESLOFT_CLIENT_ID,
client_secret: process.env.SALESLOFT_CLIENT_SECRET,
grant_type: 'client_credentials',
});
return data.access_token;
}
const token = await getServiceToken();
const { data } = await axios.get('https://api.salesloft.com/v2/me.json', {
headers: { Authorization: `Bearer ${token}` },
});
console.log(`Authenticated as: ${data.data.name} (${data.data.email})`);
Authenticated as: Jane Smith (jane@company.com)
| Error | Cause | Solution |
|---|---|---|
401 Unauthorized | Expired or invalid token | Refresh token or re-authorize |
403 Forbidden | Insufficient OAuth scopes | Check app permissions in developer portal |
invalid_grant | Authorization code already used | Codes are single-use; restart OAuth flow |
invalid_client | Wrong client_id/secret | Verify credentials in developer portal |
async function refreshAccessToken(refreshToken: string) {
const { data } = await axios.post('https://accounts.salesloft.com/oauth/token', {
client_id: process.env.SALESLOFT_CLIENT_ID,
client_secret: process.env.SALESLOFT_CLIENT_SECRET,
grant_type: 'refresh_token',
refresh_token: refreshToken,
});
return data; // { access_token, refresh_token, expires_in }
}
After successful auth, proceed to salesloft-hello-world for your first API call.