agentsclimarketplace

Perplexity common errors

Skill jeremylongshore/claude-code-plugins-plus-skills/plugins/saas-packs/perplexity-pack/skills/perplexity-common-errors

'Diagnose and fix Perplexity Sonar API errors and exceptions.From its SKILL.md

Install
npx -y skills add jeremylongshore/claude-code-plugins-plus-skills --skill perplexity-common-errors

Assembled 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

5.7 KB, ~1.4k tokens by cl100k_base, as published. Nobody here has run it

Perplexity Common Errors

Overview

Quick reference for the most common Perplexity Sonar API errors, their root causes, and fixes. All Perplexity errors follow the OpenAI error format since the API is OpenAI-compatible.

Prerequisites

  • PERPLEXITY_API_KEY environment variable set
  • curl available for diagnostic commands

Error Reference

401 Unauthorized — Invalid API Key

{"error": {"message": "Invalid API key", "type": "authentication_error", "code": 401}}

Causes: Key missing, expired, revoked, or doesn't start with pplx-.

Fix:

set -euo pipefail
# Verify key is set and has correct prefix
echo "${PERPLEXITY_API_KEY:0:5}"  # Should print "pplx-"

# Test key directly
curl -s -o /dev/null -w "%{http_code}" \
  -H "Authorization: Bearer $PERPLEXITY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"sonar","messages":[{"role":"user","content":"test"}],"max_tokens":5}' \
  https://api.perplexity.ai/chat/completions
# 200 = valid, 401 = invalid key

Regenerate at perplexity.ai/settings/api.


429 Too Many Requests — Rate Limited

{"error": {"message": "Rate limit exceeded", "type": "rate_limit_error", "code": 429}}

Causes: Exceeded requests per minute (RPM). Most tiers allow 50 RPM. Perplexity uses a leaky bucket algorithm.

Fix:

async function withBackoff<T>(fn: () => Promise<T>, maxRetries = 5): Promise<T> {
  for (let i = 0; i <= maxRetries; i++) {
    try {
      return await fn();
    } catch (err: any) {
      if (err.status !== 429 || i === maxRetries) throw err;
      const delay = Math.pow(2, i) * 1000 + Math.random() * 500;
      console.log(`Rate limited. Retrying in ${delay.toFixed(0)}ms...`);
      await new Promise(r => setTimeout(r, delay));
    }
  }
  throw new Error("Unreachable");
}

See perplexity-rate-limits for queue-based solutions.


400 Bad Request — Invalid Model

{"error": {"message": "Invalid model: gpt-4", "type": "invalid_request_error"}}

Cause: Using a non-Perplexity model name.

Valid models: sonar, sonar-pro, sonar-reasoning-pro, sonar-deep-research.


400 Bad Request — Invalid search_domain_filter

{"error": {"message": "search_domain_filter must contain at most 20 domains"}}

Cause: Exceeding the 20-domain limit, or mixing allowlist (no prefix) with denylist (- prefix).

Fix: Use either allowlist OR denylist mode, not both:

// Allowlist: only these domains
search_domain_filter: ["python.org", "docs.python.org"]

// Denylist: exclude these domains
search_domain_filter: ["-reddit.com", "-quora.com"]

Empty Citations Array

Not an error, but a common surprise.

Causes: Query too abstract, non-factual question, or model couldn't find relevant sources.

Fix:

// BAD: abstract query yields no citations
"Tell me about technology"

// GOOD: specific factual query
"What are the key features of TypeScript 5.5 released in 2025?"

Use sonar-pro for more citations (2x average citation count vs sonar).


Timeout / Hanging Request

Causes: Complex query with sonar-pro or sonar-deep-research. Sonar: 1-3s typical. Sonar-pro: 3-8s. Deep research: 10-60s.

Fix:

const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), 15000);

try {
  const response = await perplexity.chat.completions.create(
    { model: "sonar", messages: [{ role: "user", content: query }] },
    { signal: controller.signal }
  );
  return response;
} finally {
  clearTimeout(timeout);
}

402 Payment Required — No Credits

{"error": {"message": "Insufficient credits", "type": "billing_error"}}

Cause: Account has no API credits remaining.

Fix: Add credits at perplexity.ai/settings/api.

Diagnostic Commands

set -euo pipefail
# Quick API health check
curl -s -w "\nHTTP %{http_code} in %{time_total}s\n" \
  -H "Authorization: Bearer $PERPLEXITY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"sonar","messages":[{"role":"user","content":"ping"}],"max_tokens":5}' \
  https://api.perplexity.ai/chat/completions

# Check if key env var is set
env | grep PERPLEXITY

# Test DNS resolution
dig api.perplexity.ai +short

Error Handling

HTTP CodeError TypeRetry?Action
400invalid_request_errorNoFix request parameters
401authentication_errorNoRegenerate API key
402billing_errorNoAdd credits
429rate_limit_errorYesExponential backoff
500+server_errorYesRetry after 2-5 seconds

Output

  • Identified error cause from HTTP status and error type
  • Applied fix or workaround
  • Verified resolution with diagnostic commands

Resources

Next Steps

For comprehensive debugging, see perplexity-debug-bundle.

What ships with it

Read from the repository

Just SKILL.md. No reference files, no scripts.

Keep looking

Skills are one crate of 326,144. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.