From salesforce-pack
Diagnose and fix common Salesforce API errors like INVALID_LOGIN, INVALID_FIELD, MALFORMED_QUERY, and REQUIRED_FIELD_MISSING, plus SOQL and integration issues.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin salesforce-packThis skill is limited to using the following tools:
Quick reference for the most common Salesforce API errors with real error codes, messages, and solutions.
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Generates original PNG/PDF visual art via design philosophy manifestos for posters, graphics, and static designs on user request.
Quick reference for the most common Salesforce API errors with real error codes, messages, and solutions.
Check the errorCode field in the API response or the exception from jsforce.
[{"message":"INVALID_LOGIN: Invalid username, password, security token; or user locked out.","errorCode":"INVALID_LOGIN"}]
Cause: Wrong credentials or security token. Solution:
# Reset security token: Setup > My Personal Information > Reset My Security Token
# Append token to password: password + securityToken
# Verify IP is whitelisted or token is appended
echo "Password format: ${SF_PASSWORD}${SF_SECURITY_TOKEN}"
[{"message":"SELECT Id, FullName FROM Account\n ^\nERROR: No such column 'FullName' on entity 'Account'","errorCode":"INVALID_FIELD"}]
Cause: Field API name does not exist on the sObject. Solution:
// Check available fields via describe
const meta = await conn.sobject('Account').describe();
const fieldNames = meta.fields.map(f => f.name);
console.log('Available fields:', fieldNames.join(', '));
// Common mistake: "FullName" vs "Name", "Email" on Account (doesn't exist — it's on Contact)
[{"message":"unexpected token: 'FORM'","errorCode":"MALFORMED_QUERY"}]
Cause: Typo in SOQL keywords or missing quotes. Solution:
-- Wrong: SELECT Id FORM Account (typo)
-- Right: SELECT Id FROM Account
-- Wrong: WHERE Name = Acme (missing quotes)
-- Right: WHERE Name = 'Acme'
-- Wrong: WHERE CreatedDate > 2026-01-01 (needs literal format)
-- Right: WHERE CreatedDate > 2026-01-01T00:00:00Z
[{"message":"Required fields are missing: [LastName]","errorCode":"REQUIRED_FIELD_MISSING","fields":["LastName"]}]
Cause: Create/update missing a required field. Solution:
// Check required fields
const meta = await conn.sobject('Contact').describe();
const required = meta.fields
.filter(f => !f.nillable && !f.defaultedOnCreate && f.createable)
.map(f => f.name);
console.log('Required for create:', required);
// Contact requires: LastName
// Lead requires: LastName, Company
// Opportunity requires: Name, StageName, CloseDate
[{"message":"Insufficient access rights on cross-reference id","errorCode":"INSUFFICIENT_ACCESS_OR_READONLY"}]
Cause: User profile lacks CRUD permission or field-level security blocks access. Solution: In Setup, check:
[{"message":"TotalRequests Limit exceeded.","errorCode":"REQUEST_LIMIT_EXCEEDED"}]
Cause: Org exceeded the 24-hour rolling API call limit. Solution:
// Check remaining API calls
const limits = await conn.request('/services/data/v59.0/limits/');
console.log('Daily API:', limits.DailyApiRequests);
// { Max: 100000, Remaining: 45230 }
// Enterprise Edition base: 100,000/24hr + 1,000 per user license
// Check: Setup > Company Information > API Requests, Last 24 Hours
[{"message":"unable to obtain exclusive access to this record","errorCode":"UNABLE_TO_LOCK_ROW"}]
Cause: Another process is updating the same record simultaneously. Solution: Retry with exponential backoff — this is transient.
// This commonly occurs with triggers, workflows, or parallel bulk jobs
// Retry 3 times with increasing delay
await withRetry(() => conn.sobject('Account').update({ Id: id, Name: 'New Name' }));
[{"message":"Use one of these records?","errorCode":"DUPLICATES_DETECTED"}]
Cause: Salesforce Duplicate Rules matched existing records. Solution:
// Allow duplicates by setting header
const result = await conn.sobject('Lead').create(
{ LastName: 'Smith', Company: 'Acme', Email: 'smith@acme.com' },
{ headers: { 'Sforce-Duplicate-Rule-Header': 'allowSave=true' } }
);
[{"message":"Phone number must be 10 digits","errorCode":"FIELD_CUSTOM_VALIDATION_EXCEPTION"}]
Cause: A validation rule on the sObject rejected the data. Solution: Check Setup > Object Manager > [Object] > Validation Rules to see active rules and fix your data accordingly.
[{"message":"entity is deleted","errorCode":"ENTITY_IS_DELETED"}]
Cause: Record was soft-deleted and is in the Recycle Bin. Solution:
-- Query deleted records with ALL ROWS
SELECT Id, Name, IsDeleted FROM Account WHERE Id = '001xx' ALL ROWS
-- Undelete via API
await conn.sobject('Account').undelete('001xxxxxxxxxxxx');
# Check Salesforce system status
curl -s https://api.status.salesforce.com/v1/instances | jq '.[0]'
# Check org API limits via sf CLI
sf org display --target-org my-org
# List recent API errors in debug log
sf apex log list --target-org my-org
sf apex log get --log-id 07Lxx --target-org my-org
| HTTP Status | Error Code | Retryable? |
|---|---|---|
| 400 | MALFORMED_QUERY, INVALID_FIELD | No — fix query |
| 401 | INVALID_SESSION_ID | Yes — refresh token |
| 403 | REQUEST_LIMIT_EXCEEDED | Yes — wait and retry |
| 404 | NOT_FOUND | No — wrong ID or sObject |
| 409 | UNABLE_TO_LOCK_ROW | Yes — retry with backoff |
| 500 | UNKNOWN_EXCEPTION | Maybe — check SF status |
For comprehensive debugging, see salesforce-debug-bundle.