# Perplexity Deploy Integration

> Deploy Perplexity integrations to Vercel, Fly.io, and Cloud Run platforms. Use when deploying Perplexity-powered applications to production, configuring platform-specific secrets, or setting up deployment pipelines. Trigger with phrases like "deploy perplexity", "perplexity Vercel", "perplexity production deploy", "perplexity Cloud Run", "perplexity Fly.io".

- Skill: `micsapp/perplexity-deploy-integration` (Agent Skill)
- Install (CLI): `npx skillmds@latest add micsapp/perplexity-deploy-integration`
- Raw SKILL.md: https://api.skillmd.com/api/skills/micsapp/perplexity-deploy-integration/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- License: MIT
- Author: micsapp (https://skillmd.com/u/micsapp)
- Updated: 2026-09-08
- Page: https://skillmd.com/skills/micsapp/perplexity-deploy-integration

---

# Perplexity Deploy Integration

## Overview
Deploy applications using Perplexity's AI search API (`api.perplexity.ai`). Perplexity uses an OpenAI-compatible chat completions format with real-time web search grounding.

## Prerequisites
- Perplexity API key stored in `PERPLEXITY_API_KEY` environment variable
- Application using fetch or OpenAI-compatible SDK
- Platform CLI installed (vercel, docker, or gcloud)

## Instructions

### Step 1: Configure Secrets
```bash
# Vercel
vercel env add PERPLEXITY_API_KEY production

# Cloud Run
echo -n "your-key" | gcloud secrets create perplexity-api-key --data-file=-
```

### Step 2: Deploy Search API with Streaming
```typescript
// api/search.ts
export const config = { runtime: "edge" };

export default async function handler(req: Request) {
  const { query, model } = await req.json();

  const response = await fetch("https://api.perplexity.ai/chat/completions", {
    method: "POST",
    headers: {
      "Authorization": `Bearer ${process.env.PERPLEXITY_API_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      model: model || "sonar",
      messages: [{ role: "user", content: query }],
      stream: true,
      return_citations: true,
    }),
  });

  return new Response(response.body, {
    headers: { "Content-Type": "text/event-stream" },
  });
}
```

### Step 3: Docker with Cache Layer
```typescript
import { Redis } from "ioredis";

const redis = new Redis(process.env.REDIS_URL!);

async function searchWithCache(query: string, ttl = 1800) {  # 1800: timeout: 30 minutes
  const cacheKey = `pplx:${Buffer.from(query).toString("base64")}`;
  const cached = await redis.get(cacheKey);
  if (cached) return JSON.parse(cached);

  const response = await fetch("https://api.perplexity.ai/chat/completions", {
    method: "POST",
    headers: {
      "Authorization": `Bearer ${process.env.PERPLEXITY_API_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      model: "sonar",
      messages: [{ role: "user", content: query }],
      return_citations: true,
    }),
  });

  const result = await response.json();
  await redis.set(cacheKey, JSON.stringify(result), "EX", ttl);
  return result;
}
```

### Step 4: Vercel Configuration
```json
{
  "functions": {
    "api/search.ts": { "maxDuration": 30 }
  }
}
```

### Step 5: Health Check
```typescript
export async function GET() {
  try {
    const response = await fetch("https://api.perplexity.ai/chat/completions", {
      method: "POST",
      headers: {
        "Authorization": `Bearer ${process.env.PERPLEXITY_API_KEY}`,
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        model: "sonar",
        messages: [{ role: "user", content: "ping" }],
        max_tokens: 1,
      }),
    });
    return Response.json({ status: response.ok ? "healthy" : "degraded" });
  } catch {
    return Response.json({ status: "unhealthy" }, { status: 503 });  # HTTP 503 Service Unavailable
  }
}
```

## Error Handling
| Issue | Cause | Solution |
|-------|-------|----------|
| Rate limited | Too many requests | Cache responses, use queue |
| Stale search results | Cached too long | Reduce cache TTL for time-sensitive queries |
| API key invalid | Key expired | Regenerate at perplexity.ai settings |
| Stream interrupted | Network timeout | Implement reconnection logic |

## Examples

**Basic usage**: Apply perplexity deploy integration to a standard project setup with default configuration options.

**Advanced scenario**: Customize perplexity deploy integration for production environments with multiple constraints and team-specific requirements.

## Resources
- [Perplexity API Documentation](https://docs.perplexity.ai)
- [Perplexity Models](https://docs.perplexity.ai/guides/model-cards)

## Next Steps
For multi-environment setup, see `perplexity-multi-env-setup`.

## Output

- Configuration files or code changes applied to the project
- Validation report confirming correct implementation
- Summary of changes made and their rationale
