Skip to main content

An advanced, high-performance Python client, MCP server, and REST API for reverse-engineering Perplexity AI's WebUI.

Project description

Logo

Perplexity WebUI Scraper

Python scraper to extract AI responses from Perplexity's web interface.

PyPI Python License


📚 Full Documentation & Advanced Guide: https://henrique-coder.github.io/perplexity-webui-scraper


What is this?

This library lets you interact with Perplexity AI programmatically using the same web endpoints as the browser — no official API key required. It supports conversations, file uploads, streaming, an MCP server for AI agents, and a drop-in OpenAI-compatible REST API.

  • Requirements: A Perplexity Pro or Max account and your browser session token.
  • Key Features: 15 models (GPT-5.4, Claude Opus, Gemini, Deep Research…), file attachments (images, PDFs, …), streaming, MCP Server for AI agents, OpenAI-compatible REST API, multi-turn conversation thread continuation.

Installation

# Core library only
uv add perplexity-webui-scraper

# Interactive session token generator (adds rich)
uv add "perplexity-webui-scraper[cli]"

# MCP Server for AI agents (adds fastmcp)
uv add "perplexity-webui-scraper[mcp]"

# OpenAI-compatible API server (adds fastapi + uvicorn + typer)
uv add "perplexity-webui-scraper[api]"

# Everything at once
uv add "perplexity-webui-scraper[cli,mcp,api]"

Quick Start

1. Get your session token

# Interactive CLI wizard — walks you through email auth
uv run get-perplexity-session-token

Or retrieve __Secure-next-auth.session-token manually from your browser cookies on perplexity.ai.

2. Basic usage

from perplexity_webui_scraper import Perplexity

client = Perplexity(session_token="YOUR_TOKEN")
conversation = client.create_conversation()

conversation.ask("What is quantum computing?")
print(conversation.answer)

# Follow-ups preserve context automatically
conversation.ask("Explain it simpler")
print(conversation.answer)

3. Streaming

for chunk in conversation.ask("Explain AI", stream=True):
    if chunk.last_chunk:
        print(chunk.last_chunk, end="", flush=True)

4. Choose a model

from perplexity_webui_scraper import ConversationConfig

conversation = client.create_conversation(ConversationConfig(model="perplexity/best"))
conversation.ask("Solve this step by step: ...")
print(conversation.answer)

5. List all available models

from perplexity_webui_scraper import MODELS

for model in MODELS.list_all():
    print(f"{model.id:40} {model.name}")

Available CLIs

Command Extra Description
get-perplexity-session-token cli Interactive email auth wizard to generate a session token
perplexity-webui-scraper-mcp mcp Start the MCP server (used via MCP config, not directly)
perplexity-webui-scraper-api api Start the OpenAI-compatible REST API server

OpenAI-Compatible API

Run a local server that accepts OpenAI-formatted requests and forwards them to Perplexity. Works as a drop-in replacement for any OpenAI client — authentication is done per-request via Authorization: Bearer, exactly like the real API.

# Start the server (no token needed at startup)
perplexity-webui-scraper-api

# Custom host and port
perplexity-webui-scraper-api --host 0.0.0.0 --port 8080

# Development mode with auto-reload
perplexity-webui-scraper-api --reload

Running via Container (Podman / Docker)

You can seamlessly run the REST API using the provided Containerfile via Podman or Docker. This is the recommended way to securely isolate the server. The project utilizes a modern Python 3.14 Alpine container powered by uv for lightning-fast builds.

# 1. Build the lightweight image
podman build -t perplexity-api .

# 2. Run the server (exposing port 8000)
podman run --rm -it -p 8000:8000 perplexity-api

> You can safely replace podman with docker in the commands above as the Containerfile is fully OCI-compatible.

CLI options

Option Short Default Description
--host -H 127.0.0.1 Bind address
--port -p 8000 Port to listen on
--reload False Enable auto-reload (dev)
--log-level info Uvicorn log level

Authentication

Pass your Perplexity session token as the API key in every request — exactly like the OpenAI API:

# curl
curl http://localhost:8000/v1/chat/completions \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"model": "perplexity/best", "messages": [{"role": "user", "content": "Hello!"}]}'

# Streaming
curl -N http://localhost:8000/v1/chat/completions \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"model": "perplexity/best", "messages": [{"role": "user", "content": "Hello!"}], "stream": true}'
from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:8000/v1",
    api_key="YOUR_SESSION_TOKEN",  # sent as Authorization: Bearer automatically
)

response = client.chat.completions.create(
    model="perplexity/best",
    messages=[{"role": "user", "content": "Hello!"}],
)
print(response.choices[0].message.content)

API endpoints

Method Path Description
GET /v1/models List all available models
POST /v1/chat/completions Chat completion (streaming + non-streaming)
GET /docs Interactive Swagger UI
GET /redoc ReDoc documentation

Fields not supported by Perplexity (e.g. temperature, top_p) are accepted for client compatibility but silently ignored.

MCP Server

Expose every Perplexity model as a separate tool for AI agents (Claude Desktop, Antigravity, etc.):

{
  "mcpServers": {
    "perplexity-webui-scraper": {
      "command": "uvx",
      "args": [
        "--from",
        "perplexity-webui-scraper[mcp]@latest",
        "perplexity-webui-scraper-mcp"
      ],
      "env": { "PERPLEXITY_SESSION_TOKEN": "your_token_here" }
    }
  }
}

See the full MCP documentation for all tools and configuration details.

Disclaimer

This is an unofficial library. It uses internal APIs that may change without notice. Use at your own risk. By using this library, you agree to Perplexity AI's Terms of Service.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

perplexity_webui_scraper-1.0.0.tar.gz (48.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

perplexity_webui_scraper-1.0.0-py3-none-any.whl (74.2 kB view details)

Uploaded Python 3

File details

Details for the file perplexity_webui_scraper-1.0.0.tar.gz.

File metadata

  • Download URL: perplexity_webui_scraper-1.0.0.tar.gz
  • Upload date:
  • Size: 48.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for perplexity_webui_scraper-1.0.0.tar.gz
Algorithm Hash digest
SHA256 318b08195f4afce9278ba6d210ce7638e2766a0853aa01f6c92120cad8aea5a7
MD5 7c4cc61f022f52ba82c8f1da8cde2d50
BLAKE2b-256 2d4d281b53476a4a55fa95c05512e145cb4ee74ef7847e7f87a981c6a28af3c1

See more details on using hashes here.

File details

Details for the file perplexity_webui_scraper-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: perplexity_webui_scraper-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 74.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for perplexity_webui_scraper-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0898b42e20dec7b45409fcb1142030dedf5f4a579742d59c91eaa3c318b8885d
MD5 60581e613ab8ecbf98dbcf2b93b6f3ac
BLAKE2b-256 aaae7870e9ba5f8eaf182a6365383f215ef2fd605aaee452028f01b63d6b0c9e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page