---
title: "Search research papers"
method: GET
path: "/research/papers/search"
tags: ["Research"]
---

# Search research papers

`GET /research/papers/search`

## Request

- Base URL: `https://api.crawlora.net/api/v1`
- URL: `https://api.crawlora.net/api/v1/research/papers/search`
- Auth: API key in header `x-api-key`

Search arXiv papers with an owner-bound frozen result window and cursor-only continuation. When arXiv is rate limited or unavailable, an undated search is answered from OpenAlex's index of arXiv papers and the response says so in coverage and warnings.

## Query parameters

- `q` string
- `limit` integer
- `sources` string[]
- `authors` string[]
- `published_from` string, date
- `published_to` string, date
- `cursor` string

## Response `200`

OK

- object: The Response struct is used for wrapping the API response with a code, message, and data.
  - `code` integer: Code is the HTTP status code or a custom code used to indicate the result of the request @example 200
  - `data` object: Data is the response data (can be any object or null) @example {"id": 1, "name": "John Doe"}
    - `coverage` ResearchretrievalPaperSourceCoverage[]
      - `corpus_revision` string
      - `failure` ResearchretrievalPaperFailure
        - `message` string
        - `reason` 'invalid_url' | 'unsupported_content_type' | 'blocked' | 'not_found' | 'rate_limited' | 'timeout' | 'upstream_error' | 'internal_error' | 'out_of_scope' | 'robots_disallowed' | 'duplicate' | 'limit_reached' | 'unsupported_filter' | 'unknown_source' | 'idempotency_conflict' | 'invalid_cursor' | 'result_expired' | 'full_text_unavailable' | 'budget_exhausted'
        - `retry_after_seconds` integer
        - `retryable` boolean
      - `indexed_at` string
      - `retrieved_at` string
      - `source_id` string
      - `status` 'ok' | 'failed' | 'not_indexed' | 'unsupported'
    - `has_more` boolean
    - `items` ResearchretrievalPaperHit[]
      - `paper` ResearchretrievalPaper
        - `abstract` string
        - `authors` ResearchretrievalPaperAuthor[]
          - `affiliation` string
          - `name` string
        - `content_level` 'metadata' | 'abstract' | 'full_text'
        - `identifiers` ResearchretrievalPaperIdentifier[]
          - `namespace` 'arxiv' | 'doi' | 'pmid' | 'pmcid'
          - `value` string
        - `paper_id` string
        - `primary_id` string
        - `publication_year` integer
        - `published_at` string
        - `retrieved_at` string
        - `source_urls` string[]
        - `title` string
        - `updated_at` string
      - `rank` integer
      - `score` number
    - `next_cursor` string
    - `partial` boolean
    - `usage` RetrievaltypesUsage
      - `browser_renders` integer
      - `credits_charged` integer
      - `credits_released` integer
      - `credits_reserved` integer
      - `fetch_attempts` integer
      - `fetched_urls` integer
      - `input_tokens` integer
      - `output_tokens` integer
      - `search_requests` integer
      - `settlement_pending` boolean
    - `warnings` ResearchretrievalPaperWarning[]
      - `code` 'source_failed' | 'source_not_indexed' | 'discovery_truncated' | 'ranking_window_limit' | 'imprecise_date_excluded' | 'content_unavailable' | 'cached_source_stale'
      - `message` string
      - `source_id` string
  - `msg` unknown

## Other responses

- `400`: Bad Request
- `401`: Unauthorized
- `402`: Payment Required
- `410`: Gone
- `429`: Too Many Requests
- `500`: Internal Server Error
- `503`: Service Unavailable

---

[API](https://skmtc.dev/crawlora/apis/crawlora-api.md) · [All operations](https://skmtc.dev/crawlora/apis/crawlora-api/llms.txt) · [OpenAPI document](https://skmtc.dev/crawlora/apis/crawlora-api/revisions/afac9b012a27?raw)
