Traduzione automatica
Questa pagina è stata tradotta automaticamente dall'IA e potrebbe contenere errori. In caso di dubbi, fare riferimento alla versione inglese.
Riferimento API: Endpoint REST¶
1. Endpoint REST (raggruppati per scopo)¶
Convenzione: ?version=2.18&source=default è la stringa di query comune (richiesta dalla maggior parte degli endpoint).
1.1 Contenuto del thread (percorso di esportazione principale)¶
| Endpoint | Note |
|---|---|
GET /rest/thread/<uuid> |
Risposta semplice: entries[] (per turno; text contiene tutti i testi dei passaggi), background_entries[] (flussi di lavoro completi dei subagenti), thread_metadata. Supporta la paginazione ?cursor= (has_next_page/next_cursor) |
GET /rest/thread/<uuid>?with_schematized_response=true&with_parent_info=true&limit=100&offset=0&from_first=false&<SCHEMATIZED_USE_CASES> |
Risposta strutturata: entries[].blocks[] (workflow_block/unified_assets_block/plan_block/markdown), inclusi i prompt dei subagenti (workflow_payload.objective_chunks), URL firmati degli asset, contenuti dei file. Casi d'uso in rest.py:SCHEMATIZED_USE_CASES (workflow_steps/unified_assets/asset_diff_assets/write_delta/bash_delta/run_subagent_delta/background_agents/markdown) |
GET /rest/thread/list_recent |
Elenco thread recenti (barra laterale home; include il campo unread) |
POST /rest/thread/mark_viewed |
Conferma di lettura (scoperta 2026-07-21): corpo {"context_uuids": ["<thread context_uuid>"]} → {"status":"success"}; il non letto passa immediatamente. Il frontend chiama questo endpoint quando un thread viene aperto dalla barra laterale. Nota: l'evento analitico "thread visualizzato" non cambia lo stato non letto (escluso da test ripetuti) |
GET /rest/thread/<uuid>/members |
Membri di condivisione a livello di thread (testato): {"owner": {username,email,name,image}, "members": [...]} |
GET /rest/thread/request-access-info/<uuid> |
Restituisce {"will_request_org_join": bool, "org_display_name": str|null} — relativo all'iscrizione all'organizzazione, non correlato alla semantica di threadAccess (escluso dai test) |
GET /rest/thread/list_ask_threads, /rest/thread/list_scheduled_computer_tasks |
Presenti nell'analisi statica; GET diretto testato 400 (forma del parametro da determinare) |
1.2 Metadati degli asset (scoperti 2026-07-20, salvavita per asset scaduti)¶
GET /rest/assets/<asset_uuid>/data→ metadati completi dell'asset (testato 200):asset_data.<type>.urleasset_data.download_info[].url: nuovi URL firmati CloudFront — se l'URL firmato originale è scaduto al momento dell'archiviazione, l'indirizzo di download può essere recuperato con l'asset_uuid (a condizione che la piattaforma non abbia eliminato l'asset);- restituisce anche
entry_uuid/context_uuid/source_thread_path/thread_access/is_owner/has_owning_space(catena di ricerca inversa asset → thread); - campi come
signed_url: null,read_write_token,allow_remix. - Limiti di applicabilità (testati): gli uuid reali degli asset funzionano; gli handle di spazio di lavoro cloud con prefisso
toolu_(DOC_FILE/CODE_FILE senza modulo URL) restituiscono 404 ASSET_NOT_FOUND;file-repository/downloadrichiede un URL reale e non accetta handlefile:repo/...(400 failed to parse). Non esiste ancora un canale di download API per asset di tipo toolu. - Correlati:
/rest/assets/<id>/members,/rest/assets/<id>/published-access(presenti nell'analisi statica, non testati). -
Implementato: lo strumento fornisce
pplx-export assets-backfill(estrazione in linea + aggiornamento online tramite questo endpoint; vedere la nota sugli strumenti implementati in §4). -
ENTRY_EXPIRED: thread/artefatti più vecchi di ~3 mesi vengono eliminati dalla piattaforma; le richieste restituiscono un corpo di errore specifico — lo strumento li contrassegna come terminali e non riprova.
- Eliminazione thread (2026-07-23 WebBridge + ricerca chunk, testata):
DELETE /rest/thread/delete_thread_by_entry_uuid, corpo{entry_uuid, read_write_token}, successo200 {"status":"success"}; l'eliminazione ripetuta è idempotente, restituisce ancora 200; l'eliminazione di un uuid inesistente → 404THREAD_NOT_FOUND; acquisizione diread_write_token(verificata in pratica lo stesso giorno): il primoentries[].read_write_tokennon vuoto nella rispostaGET /rest/thread/<uuid>funziona (10/10 eliminazioni riuscite su thread live); le operazioni di scrittura devono andare al dominio www (il dominio apex restituisce 301 per DELETE). Nessuna mutazione GraphQL, nessun endpoint di eliminazione batch (l'eliminazione batch dell'interfaccia utente è un ciclo frontend per elemento). L'eliminazione è la distruzione a livello di thread, irreversibile; il thread scompare automaticamente dai suoi spazi (non è necessariobatch_remove_collection_threadsprima). Opzione soft:POST /rest/thread/batch_archive_threads/batch_unarchive_threads(corpo{context_uuids:[...]}; solo analisi statica, non testata). - ENTRY_DELETED: dopo l'eliminazione di un thread,
GET /rest/thread/<uuid>restituisce HTTP 400ENTRY_DELETED(stesso 400 di ENTRY_EXPIRED ma codice diverso) — lo strumento lo mappa aEntryDeletedError(sottoclasse diEntryExpiredError); batch_state segna lo stato terminaledeleted. - Ogni voce di turno porta
context_uuid(= l'UUIDpast_session_contextsdella piattaforma — la chiave per il mapping dello spazio dei nomi a doppio ID).
1.3 Spazi (raccolte)¶
| Endpoint | Note |
|---|---|
GET /rest/collections/get_collection?collection_slug=<slug> |
Metadati dello spazio: uuid/title/emoji/access/max_contributors, owner_user{username,email,name,permission}, contributor_users[], user_permission. Valori di autorizzazione osservati: 4=proprietario, 2=può modificare. Quando l'account corrente non ha accesso in visualizzazione: status:"failed" + _response_type:"VIEW_COLLECTION_NOT_ALLOWED" (HTTP ancora 200) |
POST /rest/collections/create_collection |
Crea spazio (2026-07-21 WebBridge capture, testato): corpo {"title","description","emoji":"1f4c1","appearance":null,"instructions":"","access":1} → restituisce la raccolta completa (uuid/slug/url/user_permission=4). Lo spazio BOT è stato creato in questo modo |
GET /rest/collections/list_collection_threads?collection_slug=<slug> |
Elenco thread dello spazio (richiesta cookie diretta; può sostituire l'indice spazio basato su browser): la risposta è un array; ogni elemento ha uuid(=entryUUID), context_uuid, frontend_uuid, author_username, title, mode, last_query_datetime, thread_access, answer_preview, ecc. Paginazione: &offset=N (20 per pagina); has_next_page è su ogni elemento; total_threads legge alto (include sottothread computer; osservato 99 vs 27 di primo livello) |
POST /rest/collections/batch_move_threads |
Sposta thread in uno spazio (testato con successo): corpo {"context_uuids": [...], "new_collection_uuid": "<uuid>"} — usa context_uuid, non entryUUID |
POST /rest/collections/batch_remove_collection_threads |
Rimozione batch da uno spazio (corpo {items:[{collection_uuid,...}]}; non testato) |
GET /rest/collections/list_user_collections |
Elenco spazi dell'account corrente (testato, 16 elementi): ognuno ha uuid/title/emoji/access/contributor_users/is_invited/is_pinned/can_share_threads/file_count/has_next_page, ecc. — più ricco di list_recent |
GET /rest/collections/list_recent |
Spazi recenti dell'account corrente (title/uuid/emoji/is_pinned/link; testato, 5 elementi) |
GET /rest/collections/{uuid_or_slug}/request-access-info |
Informazioni sulla richiesta di accesso allo spazio (non testato) |
GET /rest/collections/<uuid>/join-requests |
Richieste di adesione (non esplorato) |
GET /rest/spaces/<uuid>/tasks |
Restituisce {"tasks":[]} — osservato vuoto; si sospetta siano attività pianificate/computer dello spazio, non un elenco di thread |
GET /rest/spaces/<uuid>/recurring_tasks |
Attività ricorrenti (non testato) |
GET /rest/spaces/<uuid>/pins/threads, /scheduled_threads |
Thread fissati/pianificati dello spazio (chiamati al caricamento della pagina; non esplorato) |
- Diramazione tra account (branch_of; conoscenza verificata dall'utente 2026-07-23): un thread condiviso tramite uno spazio può essere "continuato" da un altro account membro in un thread di diramazione che è visibile solo a, e continuato da, quell'account — dopo che il thread dell'account A è condiviso tramite uno spazio, B può continuarlo in una diramazione privata di B. L'archivio non ha ancora istanze; i bordi delle relazioni non sono implementati per ora; i campi del segnale API del thread di diramazione (puntatore genitore / marcatore di diramazione) saranno verificati e registrati quando apparirà la prima istanza.
1.4 Account / sessione¶
| Endpoint | Note |
|---|---|
GET /api/auth/session |
Sessione corrente {user:{email,...}} — utilizzata per la verifica dell'account e il probing del cambio automatico |
GET /api/auth/linked-accounts |
Vedi §1.2 (elenco completo solo mentre il primario è attivo) |
GET /rest/user/info, /rest/user/settings |
Profilo utente / impostazioni (non esplorato) |
1.5 Utilizzo del credito (scoperto 2026-07-20)¶
GET /rest/billing/credits/thread-usage?thread_id=<context_uuid>→ utilizzo del credito per thread (testato 200):{"usage_cents": 27926.36, "meter_usage": [{"meter_type": "asi_token_usage", "cost_cents": ...}]}- Nota:
thread_idsi aspetta il context_uuid (psc_uuid); passare entryUUID restituisce 403thread_usage_forbidden("Il thread non appartiene all'utente corrente" — in realtà una forma ID errata). - Fonti di context_uuid:
list_collection_threads(l'indice spazio REST copre già 27/27), il campocontext_uuiddella voce del thread (archiviato comepsc_uuidin thread.json). - Solo i thread dell'account corrente possono essere interrogati (cross-account → 403) — lo scraping multi-account necessita di cambio automatico per account.
GET /rest/billing/credits/thread-usages?offset&limit&sessionKind: versione elenco; testato vuoto su entrambi gli account (sospetta fatturazione organizzativa; da determinare).- Altri endpoint di fatturazione (
/rest/billing/credits/balance, ecc.) nell'appendice §7; non esplorati.
1.6 Esportazione ufficiale (backend del pulsante "Esporta" della pagina; scoperto 2026-07-20)¶
POST /rest/thread/export, corpo:{"thread_uuid": "<uuid>", "format": "<fmt>", "filename": "<name>"}- Risposta:
{"file_content_64": "<base64>", "filename": "..."} - Formati testati:
md(markdown ufficiale con intestazione logo<img>),pdf(binario PDF ~880KB),docx(zip PK ~350KB) — tutti HTTP 200. Altri valori di formato non testati. - Limite di contenuto (verificato): restituisce markdown dell'intero thread (riepilogo domanda + risposta + citazioni in nota a piè di pagina
[^1_N]), senza il corpo RESEARCH_REPORT — il rapporto di deep research stesso può essere ottenuto solo tramite il suo URL firmato (§3.7); cioè l'attuale catena di URL firmati report.md è la fonte ufficiale del rapporto (stessa fonte del download del pannello artefatto della pagina); non è necessario passare a questo endpoint. - Valore: il markdown ufficiale a livello di thread può servire come fonte di convalida incrociata a livello di conversazione (note a piè di pagina/formato citazione resi ufficialmente).
1.7 Download asset / rapporto¶
- URL firmati CloudFront nella risposta strutturata (
d2z0o16i8xm8ak.cloudfront.net): download urllib diretto, nessun cookie/auth necessario; file multiversione numerati in ordinecreated_at. - Fonte di fallback del rapporto di ricerca: l'URL S3 del passaggio RESEARCH_ANSWER (
ppl-ai-file-upload.s3.amazonaws.com, scade); secondo fallback: estrazione dal rendering della pagina (KaTeX<annotation>). - Eliminazione ~3 mesi: i collegamenti alle fonti di artefatti/rapporti scadono in modo irreversibile — le esportazioni devono essere tempestive.
1.8 Altri endpoint osservati (caricamento pagina; non esplorati)¶
/rest/models/config(/v2), /rest/sources, /rest/rate-limit/status, /rest/assets/pins,
/rest/file-repository/list-files, /rest/files/list, /rest/notifications/in-app/unread-count,
/rest/billing/*, /rest/sse/recent_thread_updates (SSE), /api/version.
1.9 Invio messaggi e telemetria (2026-07-20 WebBridge + CDP)¶
1.9.1 Endpoint di invio: POST /rest/sse/perplexity_ask¶
- Esempi di corpo richiesta completi (esempi sintetici) sotto
docs/perplexity-api-samples/: ask_envelope_deep_research.json— turno di follow-up di deep research (2026-07-20; 39 parametri + query_str):model_preference: "pplx_alpha",query_source: "followup"+ la catena di continuazionelast_backend_uuidask_envelope_search.json— ricerca standard, nuova conversazione dalla home (2026-07-21; 35 parametri + query_str):model_preference: "pplx_pro",query_source: "home"+frontend_context_uuidask_envelope_model_council.json— model council, nuova conversazione dalla home (2026-07-21; 36 parametri + query_str):model_preference: "pplx_agentic_research"+compare_model_preferences: ["gpt55_thinking", "claude48opusthinking", "gemini31pro_high"]- Campi chiave (turno di follow-up di deep research, testato):
mode: "copilot"(deep research);model_preference: "pplx_alpha"- Catena di continuazione:
last_backend_uuid(uuid backend del turno precedente) +query_source: "followup" frontend_uuid(nuovo uuid per questo turno),read_write_token,target_collection_uuid(spazio contenitore),target_thread_access_level: 1search_focus: internet,sources: ["web"],language: zh-CN,timezone: Asia/Shanghaitime_from_first_type: 87664(millisecondi dalla prima pressione del tasto all'invio — telemetria comportamentale caricata con l'invio)use_schematized_api: true,supported_block_use_cases(elenco blocchi completo, corrispondente a §3.1 strutturato),supported_features: ["browser_agent_permission_banner_v1.1"],skip_search_enabled: true- La risposta è uno stream SSE (il frontend lo consuma con fetch-event-source
getReader()— il modulo app congela il riferimento fetch all'inizializzazione, gli hook fetch/XHR collegati alla pagina sono inefficaci; e i corpi di risposta in streaming non vengono conservati dal browser (Network.getResponseBodyrestituisce No data found) — la cattura è possibile solo tramite CDPNetwork.getRequestPostData(corpo richiesta disponibile)). - Lo stato finale dello stream è esattamente le voci/blocchi di
/rest/thread/<uuid>(stessi dati, consegnati in modo incrementale) — lo strumento di esportazione non ha bisogno di leggere lo stream; recupera lo stato finale direttamente.
1.9.2 Telemetria: POST /rest/event/analytics (in batch, alta frequenza)¶
Eventi osservati (con elementi essenziali event_data):
| event_name | Campi chiave | Note |
|---|---|---|
| thread viewed | authorId, authorUsername, isThreadCreator, contextUUID | evento di visualizzazione pagina — non cambia lo stato non letto (escluso dai test; la vera conferma di lettura è POST /rest/thread/mark_viewed, vedere §3.1) |
| thread entry exited | entryUUID, timeOnEntryMs (millisecondi di permanenza in lettura per quel turno), userId, isPro, deviceInfo (concorrenza/schermo/profondità colore) | telemetria della durata di lettura (non cambia lo stato non letto, escluso dai test) |
| ask input submit button clicked | querySource: followup, searchMode: research, isFollowUp | azione di invio |
| query first llm token | startLLMTokenElapsed (latenza primo token), queryStr completo | telemetria delle prestazioni |
| SUCCESSFUL response | submissionType: perplexity_ask, queryStr completo | ricevuta di successo |
| ask input model selector opened | searchMode: "agentic_research", multiple: true, selectedModels | interazione con il selettore del modello council |
| ask context pane viewed | pane_mode, context_uuid | visualizzazione pannello destro |
- Campi evento comuni: userId, visitor_id, timezone, language, screen, device_info (hardwareConcurrency/schermo/profondità colore/architettura), isBrowserExtension, web_platform.
- Nota: un evento osservato portava un userId appartenente all'altro account (l'uid apparteneva all'account A mentre la sessione era già l'account B) —
l'ID profilo dell'SDK di telemetria ha un ritardo nella cache; non giudicare l'account corrente dalla userId della telemetria.
- C'è anche il reporting ad alta frequenza di datadog RUM (browser-intake-datadoghq.com/api/v2/rum) (scroll/mouse/prestazioni; contenuto non analizzato).
1.9.3 Selezione modalità e modello (2026-07-21, testato su un account a pagamento)¶
GET /rest/models/config/v2= tabella modelli autorevole:models{id→{label,mode,provider}},default_models{search:pplx_pro, research:pplx_alpha, agentic_research:pplx_agentic_research, study:pplx_study, asi:pplx_asi},agentic_research_compare_models(council default tre modelli).pplx-ask modelschiama questo endpoint.- Corrispondenza ufficiale (testata): search =
pplx_pro(nome UI "Best"), research =pplx_alpha(nome UI "Deep research"). - Elenco modelli selezionabili dall'UI in modalità search (senza Deep research): Best (pplx_pro), Sonar 2, GPT-5.6 Terra, GPT-5.6 Sol, Gemini 3.1 Pro, Claude Sonnet 5, Claude Opus 4.8, GLM 5.2, Kimi K2.6, Grok 4.5, Nemotron 3 Ultra.
- Il campo
modeè sempre"copilot"— non un discriminatore di modalità (uguale per search / deep research / model council). - La discriminazione risiede in
model_preference: - Search:
pplx_pro(o l'ID modello selezionato dall'utente, ad es.experimental=Sonar 2,gpt56_sol…) - Deep research:
pplx_alpha(nessun selettore modello nell'UI, fisso) - Model council:
pplx_agentic_research+compare_model_preferences: [<2-3 models>](default osservato["gpt55_thinking", "claude48opusthinking", "gemini31pro_high"]; l'UI è selezione singola per slot, che scende a 2 modelli nel follow-up). - Studio passo-passo:
pplx_study; Computer: la famigliapplx_asi*. - Il selettore modello dell'area di composizione ("model ⌄") e il selettore council "N models ⌄" mappano i campi sopra;
l'evento di telemetria
ask input model selector openedportasearchMode: "agentic_research",multiple: true,selectedModels(i thread di deep research precedenti avevanosearchMode: "research"). - Nuova conversazione:
query_source: "home", nessunlast_backend_uuid, hafrontend_context_uuid; continuazione: catenaquery_source: "followup"+last_backend_uuid.
1.9.4 entry.search_mode: il record autorevole della modalità di conversazione (definito 2026-07-22)¶
Ogni voce di /rest/thread/<uuid> porta search_mode, il record autorevole della piattaforma della modalità di conversazione di quel turno
(il segnale di rilevamento della modalità con la priorità più alta, normalize.SEARCH_MODE_MAP):
| search_mode | Significato (UI/modello) | Modalità archivio |
|---|---|---|
SEARCH |
ricerca normale (default_models.search=pplx_pro "Best" e modelli selezionabili dall'UI) | search |
STUDIO |
sessione labs (pplx_beta); l'UI lo raggruppa sotto search | search |
RESEARCH |
Deep research (default_models.research=pplx_alpha; UI fissa, nessun selettore) | deep-research |
AGENTIC_RESEARCH |
model council (pplx_agentic_research + compare_model_preferences) | council |
STUDY |
studio passo-passo (pplx_study) | study |
ASI |
Computer (pplx_asi*) | computer |
- Sondaggio valori nell'archivio: tutti e sei i valori hanno istanze nell'archivio reale; SEARCH e RESEARCH dominano, STUDIO successivo, ASI / STUDY / AGENTIC_RESEARCH rari.
- pplx_alpha ⟺ RESEARCH prova incrociata: 100+ voci platform-SEARCH + thread pplx_alpha nell'archivio sono al 100%
search_mode=RESEARCH; 100+ thread pplx_pro puri sono tuttisearch_mode=SEARCH— la vecchia statistica "pplx_alpha è un modello comunemente usato per la ricerca semplice" era in realtà campioni di errore di classificazione e non è valida. - Più valori possono apparire all'interno di un thread (cambio di modalità, ad esempio un mix SEARCH+RESEARCH osservato): il rilevamento prende il più alto per specificità computer>council>study>deep-research>search.
1.9.5 Struttura dell'output del model council e comportamento di espansione¶
- Output a turno singolo = N blocchi specifici del modello "Council:
" (ciascuno con query di recupero/sorgenti/risposta) + una parte di sintesi: Where Models Agree (matrice di consenso, per Finding confronto tre modelli ✓ + Evidence), Where Models Disagree (tabella di disaccordo, posizione di ciascun modello + ragioni della divergenza), Unique Discoveries (risultati unici di ciascun modello), seguiti da raccomandazioni di domande correlate — tutto consegnato nello stesso stream SSE. - Comportamento di espansione (inclusa l'espansione durante la generazione): le righe espandibili portano un chevron ">" (righe dei passaggi / righe "Sources" / righe Council); cliccando si espandono — rendering puramente lato client, zero richieste di contenuto: delle 1208 richieste di questa sessione, 921 erano asset statici favicon/font; l'espansione stessa attiva solo caricamenti favicon e /api/version. L'espansione durante lo streaming non disturba la consegna continua.
- Latenza primo token osservata ~204s (tre modelli che generano in parallelo, marcatamente più lunga del singolo modello); conteggio sorgenti osservato 236.
- Elementi essenziali dell'automazione dell'area di composizione (Lexical): il testo deve essere iniettato tramite CDP
Input.insertText(dopo execCommand/fill, lo stato interno di Lexical si desincronizza e Invio fallisce); l'invio può usare Invio CDP o fare clic sul pulsante con aria-label="提交" ("Submit") (la modalità council ha una freccia di invio esplicita).
1.9.6 Comportamento quando si continua una conversazione storica (testato 2026-07-20)¶
- Carica pagina thread →
session,assets/pins,billing/credits/computer-submit-gate,cdn-cgi/trace. - Invia follow-up →
rate-limit/status→sse/perplexity_ask(con la catenalast_backend_uuid) → analisi ad alta frequenza. - Durante la generazione → lo stream SSE viene renderizzato in modo incrementale; dopo il completamento, un altro batch di analisi (inclusa la durata di lettura
thread entry exited). - I turni di follow-up di deep research producono anche strutture di rapporto (questo turno ha completato 5 passaggi).