AI

Perplexity APIとは:Agent APIで出典付き回答を取得する実装と料金【2026年10月】

Perplexity APIとは:Agent APIで出典付き回答を取得する実装と料金【2026年10月】

Perplexity APIとは、Perplexityの検索と回答生成を自社のアプリやシステムから呼び出すための開発者向けAPIの総称です。2026年10月時点の主役はAgent APIで、従来のSonar Chat Completionsは2026年9月27日にサポートを終えました。本記事では、APIの種類と役割、APIキーの発行からcurlとPythonでの最初のリクエスト、effortの選び方、応答JSONから引用番号と出典URLを取り出すコード、料金の見積もり方、レート制限とSonarからの移行までを、公式ドキュメントに沿って解説します。

まとめ:新規はAgent APIで組み、出典はsearch_resultsから組み立てる

これから作るならPOST /v1/agentのAgent APIを使います。effortにfastやlowを渡すだけで、Web検索と出典付きの回答が返ります。modelを直接指定する場合は、web_searchツールを足さない限り検索しません。

出典は回答本文とは別のsearch_resultsに入り、本文中の[1]や[web:1]がそのidを指します。自社画面に出すときは、この番号を出典リンクへ置き換える処理を自分で書きます。

料金は「モデルのトークン単価+ツールの呼び出し料金」で、応答のusage.cost.total_costに1回ごとの金額が入ります。見積もりは試算より実測で固めます。

Perplexity APIの5種類とAgent API・Sonarの位置づけ

Perplexityの開発者ドキュメントには、2026年10月時点で5つのAPIが並んでいます。

5種類のAPIの用途とエンドポイントを並べて選ぶための比較表

何を返すかで分けると、選び分けがはっきりします。

API 返すもの エンドポイント(POST) 課金の単位
Agent API 検索付きの生成回答と出典 /v1/agent トークン+ツール呼び出し
Search API 順位付きの検索結果のみ /search 成功したリクエスト
Orchestrator API オープンウェイトモデルの生成 OpenAI互換 トークン
Embeddings API 埋め込みベクトル 専用エンドポイント トークン
Decisions API 確率付きの判定 /v1/decisions 入力トークンのみ

出典付きで答えてほしいならAgent API、検索結果だけ受け取って要約は自社のLLMで行うならSearch APIです。実務ではこの2択から始めれば足ります。

Sonar Chat Completionsは2026年9月27日にサポート終了した経緯

Sonarからの移行ガイドには、Sonar Chat Completionsのサポートが2026年9月27日に終了したと書かれています。同期とストリーミングのリクエストは引き続き動き、モデルごとに順次Agent APIのリクエストへ読み替えられています。一方、非同期のSonarリクエストは読み替えの対象外で、すでに使えません。

ネット上の解説やサンプルの多くはmodel="sonar"とchoices[0].message.contentを使う旧方式のままです。写す前に、本記事後半の対応表でAgent APIの書き方へ置き換えます。Perplexityという製品そのものの強みや精度の限界は、Perplexityの強みと特徴を解説した記事で整理しています。

APIキーを発行してAgent APIへ最初のリクエストを送る手順

認証はAuthorization: BearerヘッダーにAPIキーを載せる方式です。公式のSDKは環境変数PERPLEXITY_API_KEYを自動で読みます。

コンソールでのキー発行とPERPLEXITY_API_KEYを設定する作業

  1. Perplexity API Platformのコンソールでプロジェクトを作り、支払い方法を登録する
  2. APIキーを発行し、パスワード管理ツールなど安全な場所へ控える
  3. 実行環境の環境変数PERPLEXITY_API_KEYにキーを設定する
  4. Pythonならpip install perplexityai、Node.jsならnpm install @perplexity-ai/perplexity_aiでSDKを入れる

公式のクイックスタートは、キーの値や先頭数文字を画面に表示して確かめる操作をしないよう注意しています。シェルの履歴やログ、コーディングエージェントの記録に残るためです。公式のPython SDKは2026年10月23日公開の0.46系が最新で、Python 3.10以上で動きます。

curlとPython SDKでeffortを指定し出典付きの回答を受け取る

まずはcurlで、effortと質問だけを送ります。

curl https://api.perplexity.ai/v1/agent \
  -H "Authorization: Bearer $PERPLEXITY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "effort": "fast",
    "input": "Perplexity Agent APIのeffortにはどんな段階がありますか"
  }'

同じことをPython SDKで書くと次のとおりです。回答の本文だけならoutput_textで取り出せます。

from perplexity import Perplexity

client = Perplexity()  # PERPLEXITY_API_KEY を環境変数から読む

response = client.responses.create(
    effort="fast",
    input="Perplexity Agent APIのeffortにはどんな段階がありますか",
)
print(response.output_text)

effortはPython SDK 0.46.0とTypeScript SDK 0.41.0で追加された引数です。変更履歴によると、2026年10月に旧名のpresetから改称されており、presetも非推奨の別名として当面は受け付けられます。古いSDKでeffortが通らないときは、まずSDKの版を確かめます。

effortとmodelの指定で変わる検索の深さと応答の中身

Agent APIの呼び方は2通りあります。Perplexityが調整した構成を名前で呼ぶeffortと、モデルを自分で選ぶmodelです。

fastからxhighまで5段階のeffortが束ねるモデルと手順の上限

effortの解説では、各段階がモデル・検索設定・推論の手順数・システムプロンプト・使えるツールをひとまとめにした構成だと説明されています。2026年10月26日時点の現行値は次のとおりです。

effort 向く質問 現行のモデル max_steps
fast 単一の事実・定義・短い要約 gpt-6-luna 1
low 最新情報を含む日常的な調べもの gpt-6-luna 5
medium 多数の情報源をまたぐ集約 gpt-6-luna 15
high 網羅性が要る専門的な分析 gpt-6-sol 15
xhigh コード実行を含む長い作業 claude-opus-5-5 100

中身のモデルは評価結果に応じて入れ替わり、9月にはlowからhighがGPT-6系へ、xhighがClaude Opus 5.5へ移りました。回答が月をまたいで変わると困る業務では、応答のeffort欄に返る版付きの値を次のリクエストへ渡して版を固定します。

modelを直接指定するとweb_searchを足さない限り検索しない仕様

クイックスタートには、Web検索はオプトインだと明記されています。modelとinputだけのリクエストはモデル自身の知識で答え、出典を返しません。検索させるにはeffortを付けるか、toolsに{"type": "web_search"}を入れます。

もう1つの落とし穴は、anthropic/で始まるモデルです。モデル一覧によると、max_output_tokensを指定しないとHTTP 400が返ります。複数のモデルを試すコードでは、この引数を常に付けておくと切り替えで落ちません。既存のOpenAI SDKを流用するなら、OpenAI互換の解説のとおりbase_urlをhttps://api.perplexity.ai/v1に変え、client.responses.create()で呼びます。

応答JSONから引用番号と出典URLを取り出し自社画面に出す実装

台帳や社内ポータルに出典付きの回答を表示するには、本文と出典を自分でつなぎ直す必要があります。

output配列のsearch_resultsとmessageを分けて読む応答の構造

Agent APIの応答はoutputという配列で、モデルが踏んだ手順ごとに1要素が入ります。移行手順の解説によると、読むべき要素は2種類です。

  • typeがsearch_resultsの要素:resultsに出典が並び、各出典にid・title・url・snippet・date・last_updatedが入る。queriesには実際に投げた検索語が残る
  • typeがmessageの要素:contentの中のoutput_textに回答本文が入る
  • 応答直下のusage:トークン数とcost(入力・出力・ツールの内訳と合計)

引用の目印は本文に直接埋め込まれます。fastは[1]の番号形式、low・medium・highは[web:1]の形式で、どちらも数字がsearch_resultsのidに対応します。annotationsは公式の応答例では空配列なので、出典の対応づけには使えません。

引用マーカーを出典リンクへ置き換えるPython標準ライブラリのコード

SDKに頼らず、Python 3.10以上の標準ライブラリだけで書いた例です。検索先をPerplexityの公式ドキュメントのドメインに絞り、本文の目印を通し番号に振り直して、出典一覧と一緒に返します。

import json
import os
import re
import urllib.request

API_URL = "https://api.perplexity.ai/v1/agent"


def ask(question: str) -> dict:
    body = {
        "effort": "low",
        "input": question,
        "tools": [{
            "type": "web_search",
            "filters": {
                "search_domain_filter": ["docs.perplexity.ai"],
                "search_recency_filter": "month",
            },
        }],
    }
    req = urllib.request.Request(
        API_URL,
        data=json.dumps(body).encode("utf-8"),
        headers={
            "Authorization": f"Bearer {os.environ['PERPLEXITY_API_KEY']}",
            "Content-Type": "application/json",
        },
    )
    with urllib.request.urlopen(req, timeout=120) as res:
        return json.load(res)


def render(resp: dict) -> tuple[str, list[str]]:
    sources, text = {}, ""
    for item in resp["output"]:
        if item["type"] == "search_results":
            for s in item["results"]:
                sources[s["id"]] = s
        elif item["type"] == "message":
            text += "".join(c["text"] for c in item["content"] if c["type"] == "output_text")

    used: list[int] = []

    def renumber(m: re.Match) -> str:
        sid = int(m.group(1))
        if sid not in sources:
            return ""  # 出典が見つからない番号は表示しない
        if sid not in used:
            used.append(sid)
        return f"[{used.index(sid) + 1}]"

    answer = re.sub(r"\[(?:web:)?(\d+)\]", renumber, text)
    refs = [f"[{i + 1}] {sources[s]['title']} {sources[s]['url']}" for i, s in enumerate(used)]
    return answer, refs


resp = ask("Agent APIのレート制限はTierごとにどう変わりますか")
answer, refs = render(resp)
print(answer)
print("\n".join(refs))
print("cost:", resp["usage"]["cost"]["total_cost"], "USD")

出典が見つからない番号を消しているのは、存在しない出典へのリンクを画面に出さないためです。複数回の検索でidが重なる場合の扱いは公式に明記がないため、本番前にmedium以上で複数回検索させた応答を保存し、番号と出典が一致するかを確かめます。

search_domain_filterと期間指定で出典を社内向けに絞る設定

Web検索ツールの解説によると、絞り込みはweb_searchツールのfiltersに書きます。search_domain_filterは20件までのドメインかURLを受け付け、先頭に-を付けると除外の指定になります。許可と除外は1つのリクエストで混ぜられません。

期間はsearch_recency_filterで、取り込む本文の量はmax_tokensとmax_tokens_per_pageで上限を決めます。官公庁の告知だけを根拠にしたい窓口なら、ドメインの許可リストと期間を固定してから公開します。

Perplexity APIの料金をトークン単価とツール料金から見積もる

料金ページの説明では、Agent APIの請求はモデルのトークン料金と、ツールの呼び出し料金の合計です。Search APIは成功したリクエストの件数で数えます。

perplexity/sonarと外部モデルの単価、検索1回あたりの料金

2026年10月26日時点の主な単価を抜き出します(モデルは100万トークンあたり、ツールは1回あたり、いずれも米ドル)。

モデル 入力 出力 備考
perplexity/sonar 0.25 2.50 キャッシュ読み込み0.0625
openai/gpt-6-luna 0.10 0.50 fast・low・mediumの現行モデル
claude-sonnet-5-5 2.00 10.00 max_output_tokens必須
ツール・API 料金 備考
web_search(標準) 1回0.0025 1,000回で2.50
web_search(Fast Search) 1回0.001 effort利用時の既定
fetch_url 1回0.0005 指定URLの本文取得
Search API 1,000件で5.00 Fast Searchは1.00

2026年10月の変更で、lowからxhighまでもFast Searchが既定になり、effort経由の検索は1回0.001ドルになりました。modelを直接指定してsearch_typeを省くと標準の0.0025ドルで、同じ検索回数でも2.5倍の差がつきます。flex(0.5倍)とpriority(2倍)の料金区分は、モデル一覧でその区分が載っているモデルにだけ効きます。

1,000件の問い合わせの月額をusage.costで検算する手順

入力6,000トークン・出力600トークン・検索1回の問い合わせを仮定して、1件あたりを計算します。

  • effort="fast"(gpt-6-luna・Fast Search):入力0.0006+出力0.0003+検索0.001=約0.0019ドル
  • model="perplexity/sonar"+標準検索:入力0.0015+出力0.0015+検索0.0025=約0.0055ドル

月1,000件なら約1.9ドルと約5.5ドルです。ただし検索結果の本文やシステムプロンプトが入力に足されるため、公式のモデル一覧にある応答例でも、短い質問の入力が6,599トークンありました。試算は桁の目安にとどめ、本番と同じ質問を20〜30件流してusage.cost.total_costの平均に想定件数を掛けて予算を決めます。

レート制限・Sonarからの移行・Search APIの単体利用で詰まる箇所

動くところまでは早い一方、本番で詰まりやすいのは上限と旧コードの扱いです。

Tier 0の毎秒1リクエストと429のRetry-Afterに従う再試行

レート制限とTierの解説によると、Tierは残高ではなく累計の購入額で決まり、Agent APIの毎秒リクエスト数(QPS)は組織内の全キーで共有されます。

Tier 累計購入額 Agent APIのQPS
Tier 0 0ドル 1
Tier 1 50ドル以上 3
Tier 2 250ドル以上 8
Tier 3 500ドル以上 17
Tier 4・5 1,000ドル以上・5,000ドル以上 33

上限に当たると429とRetry-Afterヘッダーが返ります。トークン数の上限(Tier 0で毎分500万)でも429になり、その場合は本文のerror.typeがtoken_rate_limit_exceededです。バックグラウンド実行の状態確認のための呼び出しもQPSに数えられるので、Tier 0で1秒ごとに状態を確認すると、新しいリクエストを送る余地がなくなります。

import random
import time
import urllib.error


def ask_with_retry(question: str, tries: int = 5) -> dict:
    for n in range(tries):
        try:
            return ask(question)
        except urllib.error.HTTPError as e:
            if e.code != 429 or n == tries - 1:
                raise
            wait = float(e.headers.get("Retry-After", "1"))
            time.sleep(wait + random.uniform(0, 2 ** n))  # 待機秒+揺らぎ

Sonarのmessagesとcitationsを書き換える移行の対応表

旧コードを直す箇所は多くありません。移行手順の解説にある対応から、よく使う項目を抜き出します。

  1. エンドポイントを/v1/sonarから/v1/agentへ、SDKの呼び出しをchat.completions.create()からresponses.create()へ変える
  2. model="sonar"と"sonar-pro"はeffort="fast"、Sonar Reasoning Proは"low"、Sonar Deep Researchは"high"に置き換える
  3. messagesをinputに改名する(role・contentの配列はそのまま渡せる)
  4. 回答の読み出しをchoices[0].message.contentからoutput_textへ、出典を応答直下のcitationsからoutput内のsearch_results要素へ移す
  5. 直下にあったsearch_domain_filterとsearch_recency_filterをweb_searchツールのfiltersへ、num_search_resultsを同ツールのmax_resultsへ移す
  6. 非同期リクエストはバックグラウンド実行に書き換える

Sonarのdisable_searchに当たる指定は、effortを使う場合はありません。tools: []を渡してもeffort側のツールは外れないため、検索させたくない処理ではeffortを使わずmodelを直接指定します。

回答の生成が要らない処理はSearch APIを使い自前のLLMへ渡す

Search APIのクイックスタートによると、POST https://api.perplexity.ai/searchはタイトル・URL・抽出本文の順位付きリストを返すだけで、生成回答は付きません。max_resultsは1〜20件で既定は10件です。1リクエストに最大5つのクエリを入れても課金は1件ですが、レート制限は毎秒50クエリ単位の枠をクエリ数ぶん消費します。

回答の文体を自社のLLMで細かく制御したい場合や、Azure OpenAIなどの契約がすでにある場合は、Search APIで根拠を集めて自前のLLMに渡す構成が向きます。検索を繰り返す処理を自前で組むときの止め方は、エージェントループの止まる条件を解説した記事が参考になります。

自社の検索機能にPerplexity APIを組み込む判断と見送る場面

APIの完成度とは別に、業務の要件に合うかで線を引きます。

公開Webの最新情報が答えの根拠になる問い合わせで採用する条件

採用してよいのは、答えの根拠が公開Web上にあり、しかも数日から数週間で変わる用途です。競合の価格改定や業界ニュースの要約、制度の告知を踏まえた社内向けの一次回答がこれに当たります。検索基盤を自前で持たず、1件1円未満の試算から従量課金で始められます。

条件は3つです。出典のドメインを許可リストで絞れること、出典URLを画面に必ず出すこと、回答をそのまま社外に出さず人が確認する運用にすることです。生成AIの精度の限界と社外公開物での注意は、Perplexityの精度の限界を扱った記事で具体例を挙げています。

社内文書だけで答える用途ではAPIを見送りRAGを自前で組む

答えの根拠が社内規程や製品マニュアル、過去の問い合わせ履歴だけにある場合、Perplexity APIは採用しません。Web検索の料金を払っても、欲しい情報は検索結果に出てこないためです。この場合は社内文書を索引にして検索するRAGを組みます。仕組みはRAGの仕組みと企業での導入例の記事、手順はRAG構築の進め方の記事、OpenAIのマネージドな選択肢はOpenAI File Searchの記事にまとめています。

社内文書と公開Webの両方が要る問い合わせ窓口では、社内RAGを先に引き、該当がないときだけAgent APIへ回す二段構えにすると、料金と誤回答の両方を抑えられます。一創では、こうした検索と生成の組み合わせを要件定義から実装・運用まで受託しています。どのAPIで組むかから相談したい場合は、生成AI開発・AI受託開発のサービスをご覧ください。

よくある質問

Perplexity APIについてよく寄せられる質問をまとめました。

Perplexity APIは無料で使えますか?

無料枠を前提にした使い方はできず、従量課金です。コンソールで支払い方法を登録してクレジットを購入し、使った分が差し引かれます。ただし単価は小さく、effortのfastで検索1回の短い質問なら1件0.002ドル前後の試算です。正確な金額は、応答のusage.cost.total_costで1件ずつ確認できます。

Perplexity Proの契約とAPIの料金は別ですか?

別です。ProやMaxはWebやアプリで使う利用者向けのプランで、APIの請求はAPI Platform側のクレジットから従量で引かれます。Proを契約していてもAPIの利用料は別にかかり、Tierもコンソールでの累計購入額で決まる仕組みです。製品版の料金プランはPerplexity Computerの料金とクレジットの記事でも扱っています。

Sonar APIで作った既存のコードはもう動かないのですか?

同期とストリーミングのリクエストは、2026年9月27日のサポート終了後も動き、順次Agent APIのリクエストへ読み替えられています。非同期のリクエストは読み替えの対象外で、すでに使えません。読み替え後は中身の構成が変わり、回答の質や料金も変わりうるため、早めに/v1/agentへ書き換えて、自社の質問で結果を確かめます。

Perplexity APIの回答に日本語の出典は含まれますか?

日本語のページも検索対象です。日本の情報に寄せたい場合、Agent APIではsearch_domain_filterにgo.jpや業界団体のドメインを入れます。Search APIならcountryにJP、search_language_filterにjaを指定すれば、国と言語での絞り込みも可能です。回答の言語はinstructionsで「日本語で回答する」と指定しておきます。

Perplexity APIとOpenAI APIのWeb検索はどう使い分けますか?

検索の仕組みそのものに強みがあるのがPerplexityで、1つのAPIからOpenAI・Anthropic・Googleなど複数社のモデルに同じ検索ツールを組み合わせられます。すでにOpenAIのモデルとツールで作り込んでいるなら、OpenAIの検索機能を使うほうが構成は単純です。PerplexityのAgent APIはOpenAIのResponses APIと同じ形式なので、base_urlを変えるだけで両方を比べられます。

関連記事

お気に入りに入れた記事の一覧

資料請求

今日のトレンド記事 直近 24 時間で、いつもより多く読まれている記事

  1. 2026.10.23 テックブログ Renta!不正アクセスでサービス停止:再開未定の現状と運営側の停止判断・証拠保全・段階的再開
  2. 2026.07.09 テックブログ Muse Imageとは?Metaの画像生成AIの使い方・API料金(1枚0.01ドル)と日本での提供状況【2026年10月】
  3. 2025.12.10 コラム 今の50代は何世代?バブル世代・団塊ジュニア・氷河期の境目と特徴
  4. 2026.10.22 テックブログ Tomcatのバージョン一覧とサポート期限【2026年10月】最新版11.0.27、9.0系は2027年3月末終了・9.1系は2030年末まで
  5. 2026.10.24 テックブログ ブラストメール不正アクセス:配信先288件の漏えいと利用企業の報告・通知の手順

RELATED POSTS 関連記事

目次