# Research Index (/features/research)

<!-- agent-signals: reading_time_min: 6 · est_tokens: 3138 · updated: 2026-07-30 -->
Related: [Search](/features/search.md), [Search Highlights](/features/search-highlights.md), [Scrape](/features/scrape.md), [Faster Scraping](/features/fast-scraping.md), [Batch Scrape](/features/batch-scrape.md), [JSON mode - Structured result](/features/llm-extract.md)

Firecrawl Research is a purpose-built index for scientific and engineering research agents. It exposes a research-specific toolset for searching papers, inspecting paper metadata, reading relevant full-text passages, discovering related papers through structural expansion, and searching over research-related GitHub repos.

* Find papers by topic, method, benchmark, author, or category
* Inspect canonical paper metadata and source ids
* Read the passages in one paper that answer a specific question
* Expand from strong seed papers to related papers, citers, or references
* Search GitHub history and READMEs for implementation notes, bugs, and design discussions

<Note>
  To give your agent access to the Research Index, we strongly recommend using our [CLI](/sdks/cli) or [MCP](/mcp-server), combined with our [**dedicated research skill**](https://github.com/firecrawl/skills/blob/main/skills/firecrawl-research-index/SKILL.md), which you can install with:

  ```bash
  npx skills add firecrawl/skills@firecrawl-research-index
  ```
</Note>

## Endpoints [#endpoints]

| Task                              | Endpoint                                                                                      |
| --------------------------------- | --------------------------------------------------------------------------------------------- |
| Search papers                     | [`GET /search/research/papers`](/api-reference/endpoint/research-search-papers)               |
| Inspect metadata or read passages | [`GET /search/research/papers/{id}`](/api-reference/endpoint/research-paper)                  |
| Find related papers               | [`GET /search/research/papers/{id}/similar`](/api-reference/endpoint/research-related-papers) |
| Search GitHub history             | [`GET /search/research/github`](/api-reference/endpoint/research-github-search)               |

## Search papers [#search-papers]

Search paper abstracts with a natural-language query. The response returns ranked papers with canonical `paperId`, preferred `primaryId`, source ids, title, abstract, score, and optional ranking signals.

<CodeGroup>
  <CodeBlockTabs defaultValue="cURL" groupId="cli+curl+node+python">
    <CodeBlockTabsList>
      <CodeBlockTabsTrigger value="cURL">
        cURL
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="CLI">
        CLI
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="Python">
        Python
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="Node">
        Node
      </CodeBlockTabsTrigger>
    </CodeBlockTabsList>

    <CodeBlockTab value="cURL">
      ```bash  
      # No API key needed to get started; add -H "Authorization: Bearer $FIRECRAWL_API_KEY" for higher rate limits:
      curl -s "https://api.firecrawl.dev/v2/search/research/papers?query=diffusion%20image%20synthesis&k=20"
      ```
    </CodeBlockTab>

    <CodeBlockTab value="CLI">
      ```bash  
      firecrawl research search-papers "diffusion image synthesis" --limit 20
      ```
    </CodeBlockTab>

    <CodeBlockTab value="Python">
      ```python  
      from firecrawl import Firecrawl

      firecrawl = Firecrawl(
        # No API key needed to get started; add one for higher rate limits:
        # api_key="fc-YOUR-API-KEY",
      )

      result = firecrawl.v2.search_papers("diffusion image synthesis", k=20)
      print(result)
      ```
    </CodeBlockTab>

    <CodeBlockTab value="Node">
      ```js  
      import { Firecrawl } from "firecrawl";

      const firecrawl = new Firecrawl({
        // No API key needed to get started; add one for higher rate limits:
        // apiKey: "fc-YOUR-API-KEY",
      });

      const result = await firecrawl.research.searchPapers("diffusion image synthesis", {
        k: 20,
      });
      console.log(result);
      ```
    </CodeBlockTab>
  </CodeBlockTabs>
</CodeGroup>

Optional filters:

* `authors`: author substring filter; all filters must match
* `categories`: paper category filter, such as `cs.LG`
* `from`: inclusive created/updated lower bound, `YYYY-MM-DD`
* `to`: inclusive created/updated upper bound, `YYYY-MM-DD`

## Inspect a paper [#inspect-a-paper]

Use a canonical `paperId` or a source-specific `primaryId`.

<CodeGroup>
  <CodeBlockTabs defaultValue="cURL" groupId="cli+curl+node+python">
    <CodeBlockTabsList>
      <CodeBlockTabsTrigger value="cURL">
        cURL
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="CLI">
        CLI
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="Python">
        Python
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="Node">
        Node
      </CodeBlockTabsTrigger>
    </CodeBlockTabsList>

    <CodeBlockTab value="cURL">
      ```bash  
      # No API key needed to get started; add -H "Authorization: Bearer $FIRECRAWL_API_KEY" for higher rate limits:
      curl -s "https://api.firecrawl.dev/v2/search/research/papers/arxiv:1706.03762"
      ```
    </CodeBlockTab>

    <CodeBlockTab value="CLI">
      ```bash  
      firecrawl research inspect-paper arxiv:1706.03762
      ```
    </CodeBlockTab>

    <CodeBlockTab value="Python">
      ```python  
      from firecrawl import Firecrawl

      firecrawl = Firecrawl(
        # No API key needed to get started; add one for higher rate limits:
        # api_key="fc-YOUR-API-KEY",
      )

      paper = firecrawl.v2.inspect_paper("arxiv:1706.03762")
      print(paper)
      ```
    </CodeBlockTab>

    <CodeBlockTab value="Node">
      ```js  
      import { Firecrawl } from "firecrawl";

      const firecrawl = new Firecrawl({
        // No API key needed to get started; add one for higher rate limits:
        // apiKey: "fc-YOUR-API-KEY",
      });

      const paper = await firecrawl.research.getPaper("arxiv:1706.03762");
      console.log(paper);
      ```
    </CodeBlockTab>
  </CodeBlockTabs>
</CodeGroup>

## Read paper passages [#read-paper-passages]

Add `query` to the same paper path to retrieve the top full-text passages for a question. This is useful for verifying whether a candidate paper actually contains a method, dataset, constraint, or result before you include it.

<CodeGroup>
  <CodeBlockTabs defaultValue="cURL" groupId="cli+curl+node+python">
    <CodeBlockTabsList>
      <CodeBlockTabsTrigger value="cURL">
        cURL
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="CLI">
        CLI
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="Python">
        Python
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="Node">
        Node
      </CodeBlockTabsTrigger>
    </CodeBlockTabsList>

    <CodeBlockTab value="cURL">
      ```bash  
      # No API key needed to get started; add -H "Authorization: Bearer $FIRECRAWL_API_KEY" for higher rate limits:
      curl -s "https://api.firecrawl.dev/v2/search/research/papers/arxiv:1706.03762?query=what%20is%20the%20attention%20mechanism&k=4"
      ```
    </CodeBlockTab>

    <CodeBlockTab value="CLI">
      ```bash  
      firecrawl research read-paper arxiv:1706.03762 --question "What is the attention mechanism?" --limit 4
      ```
    </CodeBlockTab>

    <CodeBlockTab value="Python">
      ```python  
      from firecrawl import Firecrawl

      firecrawl = Firecrawl(
        # No API key needed to get started; add one for higher rate limits:
        # api_key="fc-YOUR-API-KEY",
      )

      passages = firecrawl.v2.read_paper(
          "arxiv:1706.03762",
          "What is the attention mechanism?",
          k=4,
      )
      print(passages)
      ```
    </CodeBlockTab>

    <CodeBlockTab value="Node">
      ```js  
      import { Firecrawl } from "firecrawl";

      const firecrawl = new Firecrawl({
        // No API key needed to get started; add one for higher rate limits:
        // apiKey: "fc-YOUR-API-KEY",
      });

      const passages = await firecrawl.research.getPaper("arxiv:1706.03762", {
        query: "What is the attention mechanism?",
        k: 4,
      });
      console.log(passages);
      ```
    </CodeBlockTab>
  </CodeBlockTabs>
</CodeGroup>

## Find related papers [#find-related-papers]

Expand from one or more seed papers through semantic expansion and rank the candidates against a natural-language `intent`.

<CodeGroup>
  <CodeBlockTabs defaultValue="cURL" groupId="cli+curl+node+python">
    <CodeBlockTabsList>
      <CodeBlockTabsTrigger value="cURL">
        cURL
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="CLI">
        CLI
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="Python">
        Python
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="Node">
        Node
      </CodeBlockTabsTrigger>
    </CodeBlockTabsList>

    <CodeBlockTab value="cURL">
      ```bash  
      # No API key needed to get started; add -H "Authorization: Bearer $FIRECRAWL_API_KEY" for higher rate limits:
      curl -s "https://api.firecrawl.dev/v2/search/research/papers/arxiv:1706.03762/similar?intent=efficient%20transformers&mode=similar&k=20"
      ```
    </CodeBlockTab>

    <CodeBlockTab value="CLI">
      ```bash  
      firecrawl research related-papers arxiv:1706.03762 --intent "efficient transformers" --limit 20
      ```
    </CodeBlockTab>

    <CodeBlockTab value="Python">
      ```python  
      from firecrawl import Firecrawl

      firecrawl = Firecrawl(
        # No API key needed to get started; add one for higher rate limits:
        # api_key="fc-YOUR-API-KEY",
      )

      papers = firecrawl.v2.related_papers(
          "arxiv:1706.03762",
          "efficient transformers",
          mode="similar",
          k=20,
      )
      print(papers)
      ```
    </CodeBlockTab>

    <CodeBlockTab value="Node">
      ```js  
      import { Firecrawl } from "firecrawl";

      const firecrawl = new Firecrawl({
        // No API key needed to get started; add one for higher rate limits:
        // apiKey: "fc-YOUR-API-KEY",
      });

      const papers = await firecrawl.research.similarPapers("arxiv:1706.03762", {
        intent: "efficient transformers",
        mode: "similar",
        k: 20,
      });
      console.log(papers);
      ```
    </CodeBlockTab>
  </CodeBlockTabs>
</CodeGroup>

Modes:

* `similar`: co-citation and bibliographic-coupling neighborhood
* `citers`: papers that cite the seed
* `references`: papers cited by the seed

## Search GitHub history [#search-github-history]

Search GitHub issues, pull requests, discussions, and repository READMEs for implementation details and engineering prior art.

<CodeGroup>
  <CodeBlockTabs defaultValue="cURL" groupId="cli+curl+node+python">
    <CodeBlockTabsList>
      <CodeBlockTabsTrigger value="cURL">
        cURL
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="CLI">
        CLI
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="Python">
        Python
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="Node">
        Node
      </CodeBlockTabsTrigger>
    </CodeBlockTabsList>

    <CodeBlockTab value="cURL">
      ```bash  
      # No API key needed to get started; add -H "Authorization: Bearer $FIRECRAWL_API_KEY" for higher rate limits:
      curl -s "https://api.firecrawl.dev/v2/search/research/github?query=flash%20attention%20implementation%20notes&k=10"
      ```
    </CodeBlockTab>

    <CodeBlockTab value="CLI">
      ```bash  
      firecrawl research search-github "flash attention implementation notes" --limit 10
      ```
    </CodeBlockTab>

    <CodeBlockTab value="Python">
      ```python  
      from firecrawl import Firecrawl

      firecrawl = Firecrawl(
        # No API key needed to get started; add one for higher rate limits:
        # api_key="fc-YOUR-API-KEY",
      )

      results = firecrawl.v2.search_github("flash attention implementation notes", k=10)
      print(results)
      ```
    </CodeBlockTab>

    <CodeBlockTab value="Node">
      ```js  
      import { Firecrawl } from "firecrawl";

      const firecrawl = new Firecrawl({
        // No API key needed to get started; add one for higher rate limits:
        // apiKey: "fc-YOUR-API-KEY",
      });

      const results = await firecrawl.research.searchGithub(
        "flash attention implementation notes",
        { k: 10 },
      );
      console.log(results);
      ```
    </CodeBlockTab>
  </CodeBlockTabs>
</CodeGroup>

GitHub results include repository, URL, issue/PR metadata when available, snippet, and matched markdown content when available.
