Research API endpoint
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.
/research/papers/searchSearches the enabled arXiv corpus and freezes a bounded candidate window in an owner-bound durable snapshot. Requires the x-api-key header. A continuation supplies only cursor and optional limit; it reads the saved window without another provider query. The response has no invented corpus total or offset pagination.
Source behaviour:
usage.search_requests is then 0 and coverage[].retrieved_at shows when the window was retrieved. The price is the same either way.partial: true, coverage has the arxiv entry with status failed (reason rate_limited or upstream_error) plus an openalex entry with status ok, and a source_failed warning says so. Ranking, coverage and abstracts can differ from arXiv's own search, and these results carry only the arXiv identifier and the publication year derived from it (no publication date).published_from/published_to is never answered from OpenAlex, because its dates for arXiv papers are unreliable; while arXiv is unavailable such a search returns 503 with a Retry-After hint.503 at once with a Retry-After hint instead of waiting.Query parameters:
q: required search terms, 1–1000 characters.limit: optional, 1–50; default 10.sources: optional repeated source filter; the only accepted value is arxiv. Omitted defaults to arxiv.authors: optional repeated author filter, at most five unique names (256 characters each).published_from, published_to: optional inclusive dates in YYYY-MM-DD; the lower date may not follow the upper date.cursor: optional owner-bound cursor, up to 2048 characters. When present, q, sources, authors, and date filters are forbidden; only cursor and optional limit are accepted.Response enum values:
items[].paper.identifiers[].namespace: arxiv, doi, pmid, pmcid.items[].paper.content_level: metadata, abstract, full_text.coverage[].source_id: arxiv, openalex (only when the OpenAlex fallback answered).coverage[].status: ok, failed, not_indexed, unsupported.coverage[].failure.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.warnings[].code: source_failed, source_not_indexed, discovery_truncated, ranking_window_limit, imprecise_date_excluded, content_unavailable, cached_source_stale.Example request:
GET /api/v1/research/papers/search?q=transformer%20attention&sources=arxiv&limit=10
| Field | Filled in, of 40 checked | Values in the sample |
|---|---|---|
| paper | 40 | |
| rank | 40 | 1 to 40, median 20 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| q | string | No | Required for initial search; omit on cursor continuation | ||
| limit | integer | No | Page size (1–50; default 10) Minimum: 1. Maximum: 50. | ||
| sources | array<string> | No | Enabled paper sources Allowed values: arxiv. Repeat this query parameter for multiple values. | ||
| authors | array<string> | No | Author names (up to five; 256 characters each) Repeat this query parameter for multiple values. | ||
| published_from | string | No | Inclusive publication date (YYYY-MM-DD) | ||
| published_to | string | No | Inclusive publication date (YYYY-MM-DD) | ||
| cursor | string | No | Owner-bound continuation cursor (cursor-only with optional limit) |
curl -X GET "https://api.crawlora.net/api/v1/research/papers/search?q=coffee&limit=10&sources=arxiv" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"items": [
{
"paper": {
"paper_id": "paper:arxiv:1706.03762",
"primary_id": "arxiv:1706.03762",
"identifiers": [
{
"namespace": "arxiv",
"value": "1706.03762"
}
],
"title": "Attention Is All You Need",
"authors": [
{
"name": "Ashish Vaswani"
}
],
"content_level": "abstract",
"source_urls": [
"https://arxiv.org/abs/1706.03762"
],
"retrieved_at": "2026-10-09T04:00:00Z"
},
"rank": 1
}
],
"has_more": false,
"partial": false,
"coverage": [
{
"source_id": "arxiv",
"status": "ok",
"corpus_revision": "arxiv-v1"
}
],
"warnings": [],
"usage": {
"search_requests": 1,
"fetch_attempts": 1,
"fetched_urls": 1,
"browser_renders": 0,
"input_tokens": 0,
"output_tokens": 0,
"credits_reserved": 0,
"credits_charged": 3,
"credits_released": 0,
"settlement_pending": false
}
}
}Request schema
No body schema
Response schema
Inline response schema
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | Code is the HTTP status code or a custom code used to indicate the result of the request @example 200 | |||
| data | researchretrieval.PaperSearchResponse | No | ||||
| data.coverage | array | No | PaperSourceCoverage record, 10 fields: corpus_revision, failure, indexed_at, retrieved_at, source_id, status. Described under Read a research paper API. | |||
| data.has_more | boolean | No | ||||
| data.items | array | No | ||||
| data.items[].paper | researchretrieval.Paper | No | ||||
| data.items[].paper.abstract | string | No | ||||
| data.items[].paper.authors | array | No | ||||
| data.items[].paper.authors[].affiliation | string | No | ||||
| data.items[].paper.authors[].name | string | No | ||||
| data.items[].paper.content_level | string | No | metadata, abstract, full_text | |||
| data.items[].paper.identifiers | array | No | ||||
| data.items[].paper.identifiers[].namespace | string | No | arxiv, doi, pmid, pmcid | |||
| data.items[].paper.identifiers[].value | string | No | ||||
| data.items[].paper.paper_id | string | No | ||||
| data.items[].paper.primary_id | string | No | ||||
| data.items[].paper.publication_year | integer | No | ||||
| data.items[].paper.published_at | string | No | ||||
| data.items[].paper.retrieved_at | string | No | ||||
| data.items[].paper.source_urls | array | No | ||||
| data.items[].paper.title | string | No | ||||
| data.items[].paper.updated_at | string | No | ||||
| data.items[].rank | integer | No | ||||
| data.items[].score | number | No | ||||
| data.next_cursor | string | No | ||||
| data.partial | boolean | No | ||||
| data.usage | retrievaltypes.Usage | No | Usage record, 10 fields: browser_renders, credits_charged, credits_released, credits_reserved, fetch_attempts, fetched_urls, input_tokens, output_tokens, search_requests, settlement_pending. Described under Read a research paper API. | |||
| data.warnings | array | No | ||||
| data.warnings[].code | string | No | source_failed, source_not_indexed, discovery_truncated, ranking_window_limit, imprecise_date_excluded, content_unavailable, cached_source_stale | |||
| data.warnings[].message | string | No | ||||
| data.warnings[].source_id | string | No | ||||
| msg | unknown | No | Msg is the message that describes the result of the request @example "Request successful" |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 401 | Unauthorized | #/definitions/app.Response |
| 402 | Payment Required | #/definitions/app.Response |
| 410 | Gone | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 500 | Internal Server Error | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/research/papers/search?q=coffee&limit=10&sources=arxiv" \
-H "x-api-key: $CRAWLORA_API_KEY"