curl --request POST \
--url https://api.aisa.one/apis/v1/exa/agent/runs \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"query": "Summarize the main changes in RAG evaluation methods over the past year as a bullet list.",
"outputSchema": {},
"input": {
"data": [
"<unknown>"
],
"exclusion": "<unknown>"
},
"effort": "<string>",
"previousRunId": "<string>",
"dataSources": [
"<unknown>"
]
}
'import requests
url = "https://api.aisa.one/apis/v1/exa/agent/runs"
payload = {
"query": "Summarize the main changes in RAG evaluation methods over the past year as a bullet list.",
"outputSchema": {},
"input": {
"data": ["<unknown>"],
"exclusion": "<unknown>"
},
"effort": "<string>",
"previousRunId": "<string>",
"dataSources": ["<unknown>"]
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
query: 'Summarize the main changes in RAG evaluation methods over the past year as a bullet list.',
outputSchema: {},
input: {data: ['<unknown>'], exclusion: '<unknown>'},
effort: '<string>',
previousRunId: '<string>',
dataSources: ['<unknown>']
})
};
fetch('https://api.aisa.one/apis/v1/exa/agent/runs', 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.aisa.one/apis/v1/exa/agent/runs",
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([
'query' => 'Summarize the main changes in RAG evaluation methods over the past year as a bullet list.',
'outputSchema' => [
],
'input' => [
'data' => [
'<unknown>'
],
'exclusion' => '<unknown>'
],
'effort' => '<string>',
'previousRunId' => '<string>',
'dataSources' => [
'<unknown>'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$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.aisa.one/apis/v1/exa/agent/runs"
payload := strings.NewReader("{\n \"query\": \"Summarize the main changes in RAG evaluation methods over the past year as a bullet list.\",\n \"outputSchema\": {},\n \"input\": {\n \"data\": [\n \"<unknown>\"\n ],\n \"exclusion\": \"<unknown>\"\n },\n \"effort\": \"<string>\",\n \"previousRunId\": \"<string>\",\n \"dataSources\": [\n \"<unknown>\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
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.aisa.one/apis/v1/exa/agent/runs")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"query\": \"Summarize the main changes in RAG evaluation methods over the past year as a bullet list.\",\n \"outputSchema\": {},\n \"input\": {\n \"data\": [\n \"<unknown>\"\n ],\n \"exclusion\": \"<unknown>\"\n },\n \"effort\": \"<string>\",\n \"previousRunId\": \"<string>\",\n \"dataSources\": [\n \"<unknown>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.aisa.one/apis/v1/exa/agent/runs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"query\": \"Summarize the main changes in RAG evaluation methods over the past year as a bullet list.\",\n \"outputSchema\": {},\n \"input\": {\n \"data\": [\n \"<unknown>\"\n ],\n \"exclusion\": \"<unknown>\"\n },\n \"effort\": \"<string>\",\n \"previousRunId\": \"<string>\",\n \"dataSources\": [\n \"<unknown>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "iaj_01HZY8Q2M4K7N9V3T6W1X0B2C3",
"object": "integration_async_job",
"endpoint": "/apis/v1/exa/agent/runs",
"status": "queued",
"createdAt": "2023-11-07T05:31:56Z",
"completedAt": "2023-11-07T05:31:56Z",
"pricing": {
"currency": "USD",
"authorizedMicrosUSD": 123,
"finalMicrosUSD": 123,
"billingMode": "flat_per_call"
},
"output": "<unknown>",
"outputExpired": true,
"error": {
"code": "<string>",
"message": "<string>"
}
}Exa Agent Runs
Hand a research task to an agent that works in the background.
curl --request POST \
--url https://api.aisa.one/apis/v1/exa/agent/runs \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"query": "Summarize the main changes in RAG evaluation methods over the past year as a bullet list.",
"outputSchema": {},
"input": {
"data": [
"<unknown>"
],
"exclusion": "<unknown>"
},
"effort": "<string>",
"previousRunId": "<string>",
"dataSources": [
"<unknown>"
]
}
'import requests
url = "https://api.aisa.one/apis/v1/exa/agent/runs"
payload = {
"query": "Summarize the main changes in RAG evaluation methods over the past year as a bullet list.",
"outputSchema": {},
"input": {
"data": ["<unknown>"],
"exclusion": "<unknown>"
},
"effort": "<string>",
"previousRunId": "<string>",
"dataSources": ["<unknown>"]
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
query: 'Summarize the main changes in RAG evaluation methods over the past year as a bullet list.',
outputSchema: {},
input: {data: ['<unknown>'], exclusion: '<unknown>'},
effort: '<string>',
previousRunId: '<string>',
dataSources: ['<unknown>']
})
};
fetch('https://api.aisa.one/apis/v1/exa/agent/runs', 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.aisa.one/apis/v1/exa/agent/runs",
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([
'query' => 'Summarize the main changes in RAG evaluation methods over the past year as a bullet list.',
'outputSchema' => [
],
'input' => [
'data' => [
'<unknown>'
],
'exclusion' => '<unknown>'
],
'effort' => '<string>',
'previousRunId' => '<string>',
'dataSources' => [
'<unknown>'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$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.aisa.one/apis/v1/exa/agent/runs"
payload := strings.NewReader("{\n \"query\": \"Summarize the main changes in RAG evaluation methods over the past year as a bullet list.\",\n \"outputSchema\": {},\n \"input\": {\n \"data\": [\n \"<unknown>\"\n ],\n \"exclusion\": \"<unknown>\"\n },\n \"effort\": \"<string>\",\n \"previousRunId\": \"<string>\",\n \"dataSources\": [\n \"<unknown>\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
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.aisa.one/apis/v1/exa/agent/runs")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"query\": \"Summarize the main changes in RAG evaluation methods over the past year as a bullet list.\",\n \"outputSchema\": {},\n \"input\": {\n \"data\": [\n \"<unknown>\"\n ],\n \"exclusion\": \"<unknown>\"\n },\n \"effort\": \"<string>\",\n \"previousRunId\": \"<string>\",\n \"dataSources\": [\n \"<unknown>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.aisa.one/apis/v1/exa/agent/runs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"query\": \"Summarize the main changes in RAG evaluation methods over the past year as a bullet list.\",\n \"outputSchema\": {},\n \"input\": {\n \"data\": [\n \"<unknown>\"\n ],\n \"exclusion\": \"<unknown>\"\n },\n \"effort\": \"<string>\",\n \"previousRunId\": \"<string>\",\n \"dataSources\": [\n \"<unknown>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "iaj_01HZY8Q2M4K7N9V3T6W1X0B2C3",
"object": "integration_async_job",
"endpoint": "/apis/v1/exa/agent/runs",
"status": "queued",
"createdAt": "2023-11-07T05:31:56Z",
"completedAt": "2023-11-07T05:31:56Z",
"pricing": {
"currency": "USD",
"authorizedMicrosUSD": 123,
"finalMicrosUSD": 123,
"billingMode": "flat_per_call"
},
"output": "<unknown>",
"outputExpired": true,
"error": {
"code": "<string>",
"message": "<string>"
}
}query and an Idempotency-Key are required; effort trades depth against time, outputSchema shapes the result, dataSources restricts where it looks, and previousRunId continues an earlier run. Asynchronous. Submitting returns HTTP 202 and a job envelope — id, object, endpoint, status, createdAt, completedAt, pricing, output, error — with output still null. Poll get_exa_agent_run until terminal; output then carries text, structured and grounding. A one-sentence question completed in well under a minute. Billed a flat $0.10 per run — pricing.billingMode is fixed_request, so unlike a Firecrawl crawl the price does not grow with what it finds. Use it when a report is the deliverable. For an answer you read in one sitting, post_exa_answer returns in about two seconds. Send a fresh Idempotency-Key per distinct task.
https://mcp.aisa.one/mcp — Claude
Code, Codex, Cursor, VS Code and the rest. Authorization is OAuth: the client
opens a browser, you click Allow once, and there is no key to paste. The
commands per client, and what each call costs, are on
aisa.one/mcp.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Headers
Unique key (1 to 191 characters) that makes the submit idempotent. Re-submitting with the same key and request fingerprint returns the original run.
191Body
The natural-language research query.
"Summarize the main changes in RAG evaluation methods over the past year as a bullet list."
JSON Schema used to validate the structured output.
Row-processing input: rows to process and exclusions.
Show child attributes
Show child attributes
Compute/depth tier for the run.
Continue from a previously completed run.
Third-party data sources (Exa Connect) the Agent is granted access to.
Response
Research run accepted. The Location header points at the job resource; poll it until terminal.
An asynchronous integration job. Returned by the submit call (HTTP 202) and by the poll/detail call. Poll the job by its id until status is a terminal value (completed, failed, or cancelled).
Unique AIsa job identifier. Use it to poll, list, or cancel the job.
"iaj_01HZY8Q2M4K7N9V3T6W1X0B2C3"
Always "integration_async_job".
"integration_async_job"
The submit endpoint this job belongs to.
"/apis/v1/exa/agent/runs"
Customer-facing lifecycle status. queued and running are non-terminal; completed, failed, and cancelled are terminal.
queued, running, completed, failed, cancelled When the job was accepted.
When the job reached a terminal status. Null while the job is still queued or running.
Show child attributes
Show child attributes
Job result payload. Present only once status is completed. For Agent Runs this is the structured research result.
True when the result has been retained past its retention window and is no longer retrievable.
Present when status is failed. Null otherwise.
Show child attributes
Show child attributes