Create Async Chat Completion
curl --request POST \
--url https://api.perplexity.ai/v1/async/sonar \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"request": {
"model": "sonar-deep-research",
"messages": [
{
"role": "<string>",
"content": "<string>"
}
]
}
}
'import requests
url = "https://api.perplexity.ai/v1/async/sonar"
payload = { "request": {
"model": "sonar-deep-research",
"messages": [
{
"role": "<string>",
"content": "<string>"
}
]
} }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
request: {
model: 'sonar-deep-research',
messages: [{role: '<string>', content: '<string>'}]
}
})
};
fetch('https://api.perplexity.ai/v1/async/sonar', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.perplexity.ai/v1/async/sonar",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'request' => [
'model' => 'sonar-deep-research',
'messages' => [
[
'role' => '<string>',
'content' => '<string>'
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.perplexity.ai/v1/async/sonar"
payload := strings.NewReader("{\n \"request\": {\n \"model\": \"sonar-deep-research\",\n \"messages\": [\n {\n \"role\": \"<string>\",\n \"content\": \"<string>\"\n }\n ]\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.perplexity.ai/v1/async/sonar")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"request\": {\n \"model\": \"sonar-deep-research\",\n \"messages\": [\n {\n \"role\": \"<string>\",\n \"content\": \"<string>\"\n }\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.perplexity.ai/v1/async/sonar")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"request\": {\n \"model\": \"sonar-deep-research\",\n \"messages\": [\n {\n \"role\": \"<string>\",\n \"content\": \"<string>\"\n }\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"model": "<string>",
"created_at": 123,
"started_at": 123,
"completed_at": 123,
"response": {
"id": "<string>",
"model": "<string>",
"created": 123,
"choices": [
{
"index": 123,
"message": {
"content": "<string>"
},
"delta": {
"content": "<string>"
}
}
],
"usage": {
"prompt_tokens": 123,
"completion_tokens": 123,
"total_tokens": 123,
"cost": {
"input_tokens_cost": 123,
"output_tokens_cost": 123,
"total_cost": 123,
"reasoning_tokens_cost": 123,
"request_cost": 123,
"citation_tokens_cost": 123,
"search_queries_cost": 123
},
"search_context_size": "<string>",
"citation_tokens": 123,
"num_search_queries": 123,
"reasoning_tokens": 123
},
"object": "chat.completion",
"citations": [
"<string>"
],
"search_results": [
{
"title": "<string>",
"url": "<string>",
"date": "<string>",
"last_updated": "<string>",
"snippet": "",
"source": "web"
}
],
"images": [
{
"image_url": "<string>",
"origin_url": "<string>",
"title": "<string>",
"width": 123,
"height": 123
}
],
"related_questions": [
"<string>"
]
},
"failed_at": 123,
"error_message": "<string>"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Sonar API
Create Async Chat Completion
Submit an asynchronous chat completion request.
POST
/
v1
/
async
/
sonar
Create Async Chat Completion
curl --request POST \
--url https://api.perplexity.ai/v1/async/sonar \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"request": {
"model": "sonar-deep-research",
"messages": [
{
"role": "<string>",
"content": "<string>"
}
]
}
}
'import requests
url = "https://api.perplexity.ai/v1/async/sonar"
payload = { "request": {
"model": "sonar-deep-research",
"messages": [
{
"role": "<string>",
"content": "<string>"
}
]
} }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
request: {
model: 'sonar-deep-research',
messages: [{role: '<string>', content: '<string>'}]
}
})
};
fetch('https://api.perplexity.ai/v1/async/sonar', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.perplexity.ai/v1/async/sonar",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'request' => [
'model' => 'sonar-deep-research',
'messages' => [
[
'role' => '<string>',
'content' => '<string>'
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.perplexity.ai/v1/async/sonar"
payload := strings.NewReader("{\n \"request\": {\n \"model\": \"sonar-deep-research\",\n \"messages\": [\n {\n \"role\": \"<string>\",\n \"content\": \"<string>\"\n }\n ]\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.perplexity.ai/v1/async/sonar")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"request\": {\n \"model\": \"sonar-deep-research\",\n \"messages\": [\n {\n \"role\": \"<string>\",\n \"content\": \"<string>\"\n }\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.perplexity.ai/v1/async/sonar")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"request\": {\n \"model\": \"sonar-deep-research\",\n \"messages\": [\n {\n \"role\": \"<string>\",\n \"content\": \"<string>\"\n }\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"model": "<string>",
"created_at": 123,
"started_at": 123,
"completed_at": 123,
"response": {
"id": "<string>",
"model": "<string>",
"created": 123,
"choices": [
{
"index": 123,
"message": {
"content": "<string>"
},
"delta": {
"content": "<string>"
}
}
],
"usage": {
"prompt_tokens": 123,
"completion_tokens": 123,
"total_tokens": 123,
"cost": {
"input_tokens_cost": 123,
"output_tokens_cost": 123,
"total_cost": 123,
"reasoning_tokens_cost": 123,
"request_cost": 123,
"citation_tokens_cost": 123,
"search_queries_cost": 123
},
"search_context_size": "<string>",
"citation_tokens": 123,
"num_search_queries": 123,
"reasoning_tokens": 123
},
"object": "chat.completion",
"citations": [
"<string>"
],
"search_results": [
{
"title": "<string>",
"url": "<string>",
"date": "<string>",
"last_updated": "<string>",
"snippet": "",
"source": "web"
}
],
"images": [
{
"image_url": "<string>",
"origin_url": "<string>",
"title": "<string>",
"width": 123,
"height": 123
}
],
"related_questions": [
"<string>"
]
},
"failed_at": 123,
"error_message": "<string>"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}For new integrations, use the Agent API - see the migration guide.
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
application/json
Response
Successful Response
Unique identifier for the async request
Model used for the request
Unix timestamp when the request was created
Current processing status of the request
Available options:
CREATED, IN_PROGRESS, COMPLETED, FAILED Unix timestamp when processing started
Unix timestamp when processing completed
Show child attributes
Show child attributes
Unix timestamp when the request failed (if applicable)
Error message if the request failed
Was this page helpful?
⌘I