API Reference
Jobs & Results
Poll research job status and retrieve synthesized results
Jobs & Results
GET /v1/threads/:threadId/jobs/:jobId -- Poll Job Status
Check the status of a research job and retrieve results when complete.
curl https://parallect.ai/api/v1/threads/THREAD_ID/jobs/JOB_ID \
-H "Authorization: Bearer YOUR_API_KEY"Response (Running)
{
"id": "<job_id>",
"threadId": "<thread_id>",
"status": "running",
"budgetTier": "M",
"budgetCapCents": 1500,
"query": "What are the latest advances in CRISPR gene therapy?",
"synthesisMarkdown": null,
"synthesisClaimsJson": null,
"totalCustomerCostCents": 0,
"durationSeconds": null,
"createdAt": "2026-03-16T10:00:00Z",
"completedAt": null,
"steps": []
}Response (Completed)
{
"id": "<job_id>",
"threadId": "<thread_id>",
"status": "completed",
"budgetTier": "M",
"budgetCapCents": 1500,
"query": "What are the latest advances in CRISPR gene therapy?",
"synthesisMarkdown": "# CRISPR Gene Therapy: Latest Advances\n\n...",
"synthesisClaimsJson": [
{
"claim": "Base editing efficiency exceeds 90% in recent trials",
"confidence": "high",
"supportingProviders": ["perplexity", "gemini"],
"contradictingProviders": []
}
],
"totalCustomerCostCents": 406,
"durationSeconds": 187,
"createdAt": "2026-03-16T10:00:00Z",
"completedAt": "2026-03-16T10:03:07Z",
"steps": [
{
"id": "<step_id>",
"provider": "perplexity",
"status": "completed",
"reportMarkdown": "## Perplexity Research Report\n\n...",
"citations": [...],
"durationSeconds": 45,
"errorMessage": null,
"createdAt": "2026-03-16T10:00:01Z",
"completedAt": "2026-03-16T10:00:46Z"
},
{
"id": "<step_id>",
"provider": "gemini",
"status": "completed",
"reportMarkdown": "## Gemini Research Report\n\n...",
"citations": [...],
"durationSeconds": 142,
"errorMessage": null,
"createdAt": "2026-03-16T10:00:01Z",
"completedAt": "2026-03-16T10:02:23Z"
}
]
}Job Status Values
| Status | Description |
|---|---|
pending | Job created, waiting to start |
running | Providers are actively researching |
synthesizing | Preparing final report |
completed | Final report available |
failed | Unrecoverable error |
cancelled | Job was stopped before completion |
POST /v1/threads/:threadId/jobs/:jobId/pursue -- Pursue Follow-On
Start a new research job based on a suggested follow-on topic.
curl -X POST https://parallect.ai/api/v1/threads/THREAD_ID/jobs/JOB_ID/pursue \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "topic": "What are the regulatory hurdles for CRISPR therapies?" }'Parameters
| Field | Type | Required | Description |
|---|---|---|---|
topic | string | Yes | The follow-on topic to pursue |
budget | string | No | Budget tier (default: S) |
mode | string | No | fast (default) or methodical |
providers | string[] | No | Override default providers |
spidering | boolean | No | Enable topic spidering |
Response (201)
{
"id": "<job_id>",
"threadId": "<thread_id>",
"parentJobId": "<parent_job_id>",
"topic": "What are the regulatory hurdles for CRISPR therapies?",
"status": "pending",
"budgetTier": "S",
"researchMode": "fast",
"createdAt": "2026-03-16T10:10:00Z"
}Polling Strategy
Research jobs typically take:
- Fast mode: 10-30 seconds
- Methodical mode: 2-10 minutes
Recommended polling interval: 5 seconds with exponential backoff up to 30 seconds.
async function waitForResult(threadId: string, jobId: string) {
let interval = 5000;
while (true) {
const res = await fetch(`https://parallect.ai/api/v1/threads/${threadId}/jobs/${jobId}`, {
headers: { Authorization: `Bearer ${API_KEY}` },
});
const job = await res.json();
if (job.status === "completed" || job.status === "failed") return job;
await new Promise((r) => setTimeout(r, interval));
interval = Math.min(interval * 1.5, 30000);
}
}