Skip to main content
POST
/
api
/
v2
/
research
/
deep
Deep Research
curl --request POST \
  --url https://api.openfunnel.dev/api/v2/research/deep \
  --header 'Content-Type: application/json' \
  --header 'X-API-Key: <x-api-key>' \
  --data '
{
  "domain": "<string>",
  "activity_question": "rapidly growing their SDR team",
  "qualifier_question": "Has at least 5 SDRs/BDRs and a Sales Director",
  "timeframe_days": 90,
  "max_jobs_to_check": 25
}
'
{
  "domain": "<string>",
  "latency_ms": 123,
  "company": {
    "domain": "<string>",
    "name": "<string>",
    "linkedin_slug": "<string>",
    "employee_count": 123,
    "stage": "<string>",
    "industry": "<string>",
    "location": "<string>",
    "description": "<string>"
  },
  "activity": {
    "question": "<string>",
    "qualified": true,
    "answer": "<string>",
    "jobs_searched": 123,
    "jobs_matched": 123,
    "elapsed_ms": 123,
    "confidence": "<string>",
    "sources": [
      {
        "title": "<string>",
        "url": "<string>",
        "location": "<string>",
        "created": "<string>",
        "why_relevant": "<string>"
      }
    ],
    "error": "<string>"
  },
  "qualifier": {
    "question": "<string>",
    "qualified": true,
    "answer": "<string>",
    "detailed_reasoning": "<string>",
    "people_evaluated": 123,
    "elapsed_ms": 123,
    "sources": [
      {
        "name": "<string>",
        "title": "<string>",
        "linkedin_url": "<string>",
        "seniority": "<string>",
        "department": "<string>",
        "started_on": "<string>"
      }
    ],
    "error": "<string>"
  },
  "credits_consumed": 0
}

Headers

X-API-Key
string
required

Your OpenFunnel API key. Get one via Agent Auth.

Body

application/json

Inputs for a single Deep Research call.

Provide a domain plus at least one of:

  • activity_question — answered from the company's recent job postings (hiring intent, team expansion, JD signals).
  • qualifier_question — answered from LinkedIn people data (team composition, roles filled, org shape).

Pick the param whose backing data source contains the answer; pass both when the question spans both signals.

domain
string
required

Company website domain to research (e.g. 'stripe.com'). Protocol and www. prefixes are stripped automatically. The domain is resolved to a LinkedIn org via the internal companies index before either stage runs.

Examples:

"stripe.com"

"notion.so"

"databricks.com"

activity_question
string | null

Answered from the company's recent job postings. Natural-language description of the hiring activity / signal to look for in open roles (e.g. 'rapidly growing their SDR team', 'hiring senior platform engineers in Europe', 'building out an AI / ML team from scratch', 'hiring engineers experienced with Rust and Kubernetes', 'posting data roles that require Snowflake and dbt'). Use this parameter for any question whose answer would be visible in JDs — hiring intent, team expansion, tech-stack adoption, geographic footprint. Pass null or omit to skip this stage.

Example:

"rapidly growing their SDR team"

qualifier_question
string | null

Answered from LinkedIn people data (current-employee profiles). Natural-language criteria about the company's team / org composition (e.g. 'has at least 5 SDRs and a Sales Director', 'employs Kubernetes-experienced platform engineers', 'has a dedicated security team'). Use this parameter for any question about who already works at the company or how the org is shaped — roles filled, team size by function, seniority mix. Pass null or omit to skip this stage.

Example:

"Has at least 5 SDRs/BDRs and a Sales Director"

timeframe_days
integer
default:90

Lookback window (days) used by the activity stage. Has no effect when activity_question is omitted.

Required range: 1 <= x <= 365
max_jobs_to_check
integer
default:25

Upper bound on the number of recent job postings the activity stage scores with the LLM relevance pass. Higher values raise recall but add latency / token cost (each job is judged by an LLM call). Default 25 is tuned for interactive use; bump it for batch / data-extraction workflows where you want maximum recall. Has no effect when activity_question is omitted.

Required range: 1 <= x <= 200

Response

Research findings with natural-language answers and source evidence.

Top-level Deep Research response.

domain
string
required

Echo of the requested domain (normalized).

latency_ms
integer
required

End-to-end request latency in milliseconds.

company
CompanyInfo · object

Resolved firmographic context for the company. Null only if the domain could not be resolved (in which case the endpoint returns 404 instead).

activity
ActivityFinding · object

Findings for the activity question. Null when activity_question was not provided.

qualifier
QualifierFinding · object

Findings for the qualifier question. Null when qualifier_question was not provided.

credits_consumed
integer
default:0

Credits charged for this call. Charge is recorded in the background after the response is sent. 0 when the call failed before producing any findings.