Research

Start async research jobs and poll for results. Each job costs 1 credit.

POST /v1/research

Start an async research job. Returns immediately with a job ID.

Request body

{ "company_url": "https://example.com" }
job = client.research("https://example.com")
print(job["job_id"])  # 42

# Or poll until complete:
result = client.research_and_poll("https://example.com")

Response 202

{
  "object": "research_job",
  "job_id": 42,
  "status": "processing"
}
GET /v1/research/{job_id}

Poll for job status. Returns the full research document when completed.

Response — processing

{
  "object": "research_job",
  "job_id": 42,
  "status": "processing",
  "company_url": "https://example.com",
  "created_at": "2026-01-28T12:00:00",
  "completed_at": null
}

Response — completed

{
  "object": "research_job",
  "job_id": 42,
  "status": "completed",
  "company_url": "https://example.com",
  "created_at": "2026-01-28T12:00:00",
  "completed_at": "2026-01-28T12:01:30",
  "document_id": 15,
  "company_name": "Example Inc",
  "scores": {
    "composite": 78,
    "pain": 85,
    "fit": 72,
    "timing": 80,
    "pain_categories": { "engineering": 85, "security": 72 },
    "pain_signals": [
      { "title": "Database Scaling Pressure", "severity": "high", "confidence": 85, "category": "engineering" }
    ]
  },
  "sections": {
    "company_overview": "...",
    "talking_points": "...",
    "business_problems": "..."
  }
}
GET /v1/research

List your recent research jobs. Supports cursor pagination.

Query parameters

ParameterDescription
limitMax results (1-500, default 100)
starting_afterCursor: job_id of last item from previous page

Response

{
  "object": "list",
  "data": [
    {
      "object": "research_job",
      "job_id": 42,
      "company_url": "https://example.com",
      "status": "completed",
      "document_id": 15,
      "created_at": "2026-01-28T12:00:00",
      "completed_at": "2026-01-28T12:01:30"
    }
  ],
  "has_more": false
}