Skip to content
Back to skills

Salesloft Common Errors

ASecurity

Diagnose and fix SalesLoft API errors: 401, 403, 422, 429, and 5xx. Use when encountering SalesLoft errors, debugging failed requests, or troubleshooting OAuth token issues. Trigger: "salesloft error", "fix salesloft", "salesloft not working", "salesloft 429".

  • 4 stars
  • 0 votes
  • 0 copies
  • 4 views
  • Added September 12, 2026
developmenttypescriptbashdebuggingapi

Works with

  • api

Security analysis

A96/100
  • mediumUses curl or wget to download content

Pro scans all 2 files and shows the line behind each finding

Scanned September 12, 2026

npx -y skills add aibot88/sec_skill_store --skill salesloft-common-errors --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Salesloft Common Errors?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Salesloft Common Errors
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/aibot88-salesloft-common-errors/badge)](https://www.skillsdirectory.com/skills/aibot88-salesloft-common-errors)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: salesloft-common-errors
description: |
  Diagnose and fix SalesLoft API errors: 401, 403, 422, 429, and 5xx.
  Use when encountering SalesLoft errors, debugging failed requests,
  or troubleshooting OAuth token issues.
  Trigger: "salesloft error", "fix salesloft", "salesloft not working", "salesloft 429".
allowed-tools: Read, Grep, Bash(curl:*)
version: 1.0.0
license: MIT
author: Jeremy Longshore <jeremy@intentsolutions.io>
tags: [saas, sales, outreach, salesloft]
compatible-with: claude-code
---

# SalesLoft Common Errors

## Overview

Quick reference for the most common SalesLoft REST API v2 errors. All errors return JSON with a message field. Rate limiting uses a cost-based system (600 cost/minute).

## Error Reference

### 401 Unauthorized -- Invalid or Expired Token

```json
{ "error": "Not authorized", "error_description": "The access token is invalid" }
```

**Causes:** Token expired, revoked, or wrong environment key.

**Fix:**
```typescript
// Check if token works
const { data } = await api.get('/me.json').catch(err => {
  if (err.response?.status === 401) {
    console.error('Token invalid. Refreshing...');
    return refreshAccessToken(storedRefreshToken);
  }
  throw err;
});
```

### 403 Forbidden -- Insufficient Scopes

```json
{ "error": "Forbidden", "error_description": "Insufficient scope for this resource" }
```

**Fix:** Check app scopes in [developer portal](https://developers.salesloft.com). Common issue: using user-level OAuth for team-level endpoints (cadences, team templates).

### 404 Not Found -- Wrong Endpoint or Deleted Resource

```bash
# Verify endpoint format -- all endpoints end with .json
curl -s -H "Authorization: Bearer $TOKEN" \
  https://api.salesloft.com/v2/people/12345.json
# NOT /people/12345 (missing .json suffix)
```

### 422 Unprocessable Entity -- Validation Errors

```json
{
  "errors": [
    { "attribute": "email_address", "message": "is required" },
    { "attribute": "email_address", "message": "has already been taken" }
  ]
}
```

**Common 422 causes:**
| Field | Error | Solution |
|-------|-------|----------|
| `email_address` | required | Must include when creating a person |
| `email_address` | already taken | Use `GET /people.json?email_addresses[]=x` first |
| `cadence_id` | not active | Cadence must have `current_state: 'active'` |
| `person_id` | already enrolled | Check existing cadence memberships |

### 429 Too Many Requests -- Rate Limit Exceeded

```
X-RateLimit-Limit-Per-Minute: 600
X-RateLimit-Remaining-Per-Minute: 0
Retry-After: 42
```

**SalesLoft uses cost-based rate limiting:**
- Default: each request costs 1 point
- Pages 101-150: 3 points per request
- Pages 151-250: 8 points per request
- Pages 251-500: 10 points per request
- Pages 501+: 30 points per request

```typescript
// Auto-retry with Retry-After header
api.interceptors.response.use(undefined, async (error) => {
  if (error.response?.status === 429) {
    const wait = parseInt(error.response.headers['retry-after'] || '60');
    await new Promise(r => setTimeout(r, wait * 1000));
    return api.request(error.config);
  }
  throw error;
});
```

### 5xx Server Errors

**Fix:** Retry with exponential backoff. Check [status.salesloft.com](https://status.salesloft.com) for outages.

## Quick Diagnostic

```bash
# 1. Verify token
curl -s -H "Authorization: Bearer $SALESLOFT_API_KEY" \
  https://api.salesloft.com/v2/me.json | jq '.data.email'

# 2. Check API status
curl -s https://status.salesloft.com/api/v2/status.json | jq '.status'

# 3. Test specific endpoint
curl -v -H "Authorization: Bearer $SALESLOFT_API_KEY" \
  'https://api.salesloft.com/v2/people.json?per_page=1'

# 4. Check rate limit remaining
curl -sI -H "Authorization: Bearer $SALESLOFT_API_KEY" \
  https://api.salesloft.com/v2/people.json | grep -i ratelimit
```

## Error Handling

| Status | Retryable | Action |
|--------|-----------|--------|
| 401 | No | Refresh token or re-authenticate |
| 403 | No | Update app scopes in developer portal |
| 404 | No | Check endpoint URL (must end in `.json`) |
| 422 | No | Fix request payload |
| 429 | Yes | Wait for `Retry-After` header value |
| 500-503 | Yes | Exponential backoff, check status page |

## Resources

- [SalesLoft API Basics](https://developers.salesloft.com/docs/platform/api-basics/)
- [Rate Limits](https://developers.salesloft.com/docs/platform/api-basics/rate-limits/)
- [Status Page](https://status.salesloft.com)

## Next Steps

For comprehensive debugging, see `salesloft-debug-bundle`.

Files in this skill

  • SKILL.md4.4 KB
  • source.json824 B

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.