| # Deep Research API Documentation | |
| ## Overview | |
| The Deep Research API provides a real-time interface for initiating and monitoring complex research tasks. Leveraging Server-Sent Events (SSE), it delivers updates, information, message, progress, and errors as they occur, allowing clients to receive continuous streams of data without polling. | |
| ## Protocol | |
| This API uses **Server-Sent Events (SSE)** over HTTP. Clients should establish an HTTP connection and keep it open to receive a stream of events from the server. | |
| ## Data Format | |
| All data sent via SSE adheres to the following structure: | |
| ```text | |
| event: EventName | |
| data: JSON_String | |
| ``` | |
| - `event`: Specifies the type of event being sent (e.g., `infor`, `message`, `reasoning`, `progress`, `error`). | |
| - `data`: A string containing a JSON object relevant to the event type. | |
| - A double newline (`\n\n`) signifies the end of an event block. | |
| ## API config | |
| Recommended to use the API via `@microsoft/fetch-event-source`. | |
| Endpoint: `/api/sse` | |
| Method: `POST` | |
| Body: | |
| ```typescript | |
| interface Config { | |
| // Research topic | |
| query: string; | |
| // AI provider, Possible values include: google, openai, anthropic, deepseek, xai, mistral, azure, openrouter, openaicompatible, pollinations, ollama | |
| provider: string; | |
| // Thinking model id | |
| thinkingModel: string; | |
| // Task model id | |
| taskModel: string; | |
| // Search provider, Possible values include: model, tavily, firecrawl, exa, bocha, searxng | |
| searchProvider: string; | |
| // Response Language, also affects the search language. (optional) | |
| language?: string; | |
| // Maximum number of search results. Default, `5` (optional) | |
| maxResult?: number; | |
| // Whether to include content-related images in the final report. Default, `true`. (optional) | |
| enableCitationImage?: boolean; | |
| // Whether to include citation links in search results and final reports. Default, `true`. (optional) | |
| enableReferences?: boolean; | |
| } | |
| ``` | |
| Headers: | |
| ```typescript | |
| interface Headers { | |
| "Content-Type": "application/json"; | |
| // If you set an access password | |
| // Authorization: "Bearer YOUR_ACCESS_PASSWORD"; | |
| } | |
| ``` | |
| For specific usage parameter forms, see the [example code](#client-code-example). | |
| ## Response Events | |
| The API streams data as a series of events. Each event has a type (`event`) and associated data (`data`). | |
| ### General Structure | |
| ```text | |
| event: [event_type] | |
| data: [JSON_payload] | |
| ``` | |
| ### Event Types | |
| The following event types are supported: | |
| - `infor` | |
| - `message` | |
| - `reasoning` | |
| - `progress` | |
| - `error` | |
| --- | |
| ### `infor` Event | |
| Sent at the beginning of the stream (or upon specific requests) to provide initial information about the API instance or the research session. | |
| **Description:** Provides basic information about the running API instance. | |
| **Data Structure (`data` field):** A JSON string representing the following structure: | |
| | Parameter | Type | Description | | |
| | :-------- | :----- | :------------------ | | |
| | `name` | string | Project name | | |
| | `version` | string | Current API version | | |
| ```typescript | |
| interface InforEvent { | |
| // Project name | |
| name: string; | |
| // Current API version | |
| version: string; | |
| } | |
| ``` | |
| **Example:** | |
| ```text | |
| event: infor | |
| data: {"name":"deep-research","version":"0.1.0"} | |
| ``` | |
| --- | |
| ### `message` Event | |
| Used to send text content of deep research to the client. | |
| **Description:** Delivers textual messages during the research process. | |
| **Data Structure (`data` field):** A JSON string representing the following structure: | |
| | Parameter | Type | Description | Notes | | |
| | :-------- | :----- | :------------------------------------- | :---------------------------------------------------- | | |
| | `type` | string | Type of the message content | Currently only `"text"` is supported. | | |
| | `text` | string | The message content (Markdown format). | Optional for future types, but required for `"text"`. | | |
| ```typescript | |
| interface MessageEvent { | |
| // Message type, currently only "text" is supported | |
| type: "text"; | |
| // Textual data | |
| text?: string; | |
| } | |
| ``` | |
| **Example:** | |
| ```text | |
| event: message | |
| data: {"type":"text","text":"This is a **markdown** string."} | |
| ``` | |
| --- | |
| ### `reasoning` Event | |
| Used to send thinking content of deep research to the client. Some thinking models support output thinking process. | |
| **Description:** Delivers textual messages during the research process. | |
| **Data Structure (`data` field):** A JSON string representing the following structure: | |
| | Parameter | Type | Description | Notes | | |
| | :-------- | :----- | :--------------------------------------- | :------------------------------------ | | |
| | `type` | string | Type of the reasoning content | Currently only `"text"` is supported. | | |
| | `text` | string | The reasoning content (Markdown format). | Required for `"text"`. | | |
| ```typescript | |
| interface ReasoningEvent { | |
| // Reasoning type, currently only "text" is supported | |
| type: "text"; | |
| // Textual data | |
| text: string; | |
| } | |
| ``` | |
| **Example:** | |
| ```text | |
| event: message | |
| data: {"type":"text","text":"Output thinking process"} | |
| ``` | |
| --- | |
| ### `progress` Event | |
| Communicates the current step and status of the research task execution. This is crucial for providing real-time feedback on the process flow. | |
| **Description:** Indicates the progress of the research task, including the current step and its status (start or end). | |
| **Data Structure (`data` field):** A JSON string representing the following structure: | |
| | Parameter | Type | Description | Notes | | |
| | :-------- | :------------------------------------------------------------------------------ | :------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------- | | |
| | `step` | "report-plan" \| "serp-query" \| "task-list" \| "search-task" \| "final-report" | The identifier of the current step in the research process. | See "Possible `step` Values" below. | | |
| | `status` | "start" \| "end" | The status of the current step. | Indicates if the step is starting or ending. See "Possible `status` Values" below. | | |
| | `name` | string | A descriptive name for the specific instance of the step (e.g., for a specific search task). | Included only when `step` is `"search-task"`. | | |
| | `data` | any | Optional data relevant to the step's outcome or details. | May be included when `status` is `"end"`. The content varies by step. | | |
| ```typescript | |
| interface ProgressEvent { | |
| // Current step | |
| step: | |
| | "report-plan" | |
| | "serp-query" | |
| | "task-list" | |
| | "search-task" | |
| | "final-report"; | |
| // Status of the step | |
| status: "start" | "end"; | |
| // Name of the specific task (e.g., search query) | |
| name?: string; | |
| // Data related to the step's outcome or details | |
| data?: any; | |
| } | |
| ``` | |
| **Possible `step` Values:** | |
| - `report-plan`: The system is generating or processing the overall report plan. | |
| - `serp-query`: The system is performing a Search Engine Results Page (SERP) query. | |
| - `task-list`: The system is generating or processing a list of specific research tasks. | |
| - `search-task`: The system is executing a specific search task. This step includes the `name` parameter. | |
| - `final-report`: The system is compiling or finalizing the comprehensive research report. | |
| **Possible `status` Values:** | |
| - `start`: Indicates that the specified `step` has just begun. | |
| - `end`: Indicates that the specified `step` has just finished. | |
| **Example:** | |
| ```text | |
| event: progress | |
| data: {"step":"search-task","status":"start","name":"AI trends for this year"} | |
| event: progress | |
| data: {"step":"search-task","status":"end","name":"AI trends for this year","data":{"results_count": 15}} | |
| ``` | |
| --- | |
| ### `error` Event | |
| Sent when an error occurs during the research process that prevents the task from completing successfully or requires user attention. | |
| **Description:** Signals that an error has occurred. | |
| **Data Structure (`data` field):** A JSON string typically containing information about the error. A common structure is: | |
| | Parameter | Type | Description | Notes | | |
| | :-------- | :----- | :----------------------------------------- | :---- | | |
| | `message` | string | A human-readable description of the error. | | | |
| ```typescript | |
| interface ErrorEvent { | |
| // A human-readable description of the error. | |
| message: string; | |
| } | |
| ``` | |
| **Example:** | |
| ```text | |
| event: error | |
| data: {"message":"Invalid query parameters."} | |
| ``` | |
| --- | |
| ## Error Handling | |
| Clients should always listen for the `error` event. Upon receiving an `error` event, the client should typically display the error message to the user and may consider the current research task terminated unless otherwise specified by the API's behavior. | |
| ## Client Code Example | |
| This example demonstrates how to connect to the SSE endpoint using `EventSource` API and listen for the defined event types, specifically focusing on displaying `message` events. | |
| ```typescript | |
| import { fetchEventSource } from "@microsoft/fetch-event-source"; | |
| const ctrl = new AbortController(); | |
| let report = ""; | |
| fetchEventSource("/api/sse", { | |
| method: "POST", | |
| headers: { | |
| "Content-Type": "application/json", | |
| // If you set an access password | |
| // Authorization: "Bearer YOUR_ACCESS_PASSWORD", | |
| }, | |
| body: JSON.stringify({ | |
| query: "AI trends for this year", | |
| provider: "google", | |
| thinkingModel: "gemini-2.0-flash-thinking-exp", | |
| taskModel: "gemini-2.0-flash-exp", | |
| searchProvider: "model", | |
| language: "en-US", | |
| maxResult: 5, | |
| enableCitationImage: true, | |
| enableReferences: true, | |
| }), | |
| signal: ctrl.signal, | |
| onmessage(msg) { | |
| const msgData = JSON.parse(msg.data); | |
| if (msg.event === "message") { | |
| if (msgData.type === "text") { | |
| report += msgData.text; | |
| } | |
| } else if (msg.event === "progress") { | |
| console.log( | |
| `[${data.step}]: ${msgData.name ? `${msgData.name} ` : ""}${ | |
| msgData.status | |
| }` | |
| ); | |
| if (msgData.data) console.log(msgData.data); | |
| } else if (msg.event === "error") { | |
| throw new Error(msgData.message); | |
| } | |
| }, | |
| onclose() { | |
| console.log(report); | |
| }, | |
| }); | |
| ``` | |