Research API endpoint
Return licensed Europe PMC body prose, question-ranked passages, byte locators, license and content provenance. Restricted or unavailable bodies return metadata-only availability; arXiv does not fetch PDFs. Full text costs 5 credits, metadata-only reads 1.
/research/papers/readRead licensed Europe PMC body prose and question-ranked passages, with an x-api-key. PMID, PMCID and DOI resolution covers Europe PMC's supported MED records and their PMC full text; this is not universal scholarly coverage. Explicit arXiv identifiers retain metadata-only behavior.
Request body:
paper_id: required, up to 4096 characters; a namespaced identifier (pmid:17299597, pmcid:PMC1790863, doi:10.1371/journal.pone.0000217, arxiv:1706.03762), supported source URL, or registered canonical paper: ID.question: required, 1–2000 characters. Deterministic lexical ranking selects body passages; no model-generated answer is returned. With no informative overlap, earliest body passages are returned with zero relevance score.limit: optional passage cap, 1–10, default 4.Response behavior:
full_text_available=true includes full_text.text (at most 1 MiB of normalized body prose), item-level license_url, original license/copyright notices, attribution, source_url, retrieved_at, and a SHA-256 digest of the exact normalized UTF-8 text. Paragraph whitespace is normalized. Figures, tables, bibliography and sub-articles are excluded, as stated in the extraction note. Up to ten passages have byte offsets into this exact text and stable content-derived identifiers. Oversized or malformed source payloads fail rather than silently claiming a complete clipped text.
The initial license policy accepts only CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/) and CC0 1.0 (https://creativecommons.org/publicdomain/zero/1.0/). Other, absent or conflicting licenses return metadata-only restricted; inaccessible/non-indexed bodies are explicit availability outcomes. Upstream failures return 503, not fabricated empty passages.
Billing: successful full-text extraction costs 5 credits; metadata-only reads cost 1; failed requests cost zero. Precheck requires at most 5 credits and preserves a 1-credit gate for explicit arXiv identifiers. usage.credits_charged contains the actual finalized receipt; pending settlement is explicit. No cache discount is claimed for an uncached source read.
Response enum values:
paper.identifiers[].namespace: arxiv, doi, pmid, pmcid.paper.content_level: metadata, abstract, full_text.unavailable_reason: not_indexed, restricted, unsupported_format, not_found.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:
{"paper_id":"pmcid:PMC1790863","question":"phenotypic complexity","limit":1}
Example response (text and metadata abbreviated):
{
"code": 200,
"msg": "OK",
"data": {
"paper": {"paper_id":"paper:8e50eecc-636b-40f9-a6a1-df0e66862dd1","primary_id":"europepmc:MED:17299597","content_level":"full_text"},
"full_text_available": true,
"full_text": {
"text": "Body prose…",
"license_url": "https://creativecommons.org/licenses/by/4.0/",
"source_url": "https://www.ebi.ac.uk/europepmc/webservices/rest/PMC1790863/fullTextXML",
"copyright": "Retained article copyright statement",
"attribution": "Retained author and article attribution"
},
"passages": [{"passage_id":"content-derived-id","text":"Body prose…","locator":{"start_byte":0,"end_byte":13}}],
"coverage": [{"source_id":"europepmc","status":"ok"}],
"warnings": [],
"usage": {"credits_charged":5,"settlement_pending":false}
}
}
Returned europepmc:MED:<id> / europepmc:PMC:<pmcid> primary IDs and public https://europepmc.org/article/MED/<id> / article/PMC/<id> URLs can be reused as paper identifiers. Other Europe PMC source codes are outside this resolver.
| Field | Filled in, of 4 checked | Values in the sample |
|---|---|---|
| name | 4 | “Tenaillon O” and 3 other values |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| request (body) | object | Yes | Paper read request |
curl -X POST "https://api.crawlora.net/api/v1/research/papers/read" \
-H "x-api-key: $CRAWLORA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"limit":1,"paper_id":"string","question":"string"}'{
"limit": 1,
"paper_id": "string",
"question": "string"
}{
"code": 200,
"msg": "OK",
"data": {
"paper": {
"paper_id": "paper:8e50eecc-636b-40f9-a6a1-df0e66862dd1",
"primary_id": "europepmc:MED:17299597",
"content_level": "full_text"
},
"full_text_available": true,
"full_text": {
"text": "Body prose…",
"license_url": "https://creativecommons.org/licenses/by/4.0/",
"source_url": "https://www.ebi.ac.uk/europepmc/webservices/rest/PMC1790863/fullTextXML",
"copyright": "Retained article copyright statement",
"attribution": "Retained author and article attribution"
},
"passages": [
{
"passage_id": "content-derived-id",
"text": "Body prose…",
"locator": {
"start_byte": 0,
"end_byte": 13
}
}
],
"coverage": [
{
"source_id": "europepmc",
"status": "ok"
}
],
"warnings": [],
"usage": {
"credits_charged": 5,
"settlement_pending": false
}
}
}Request schema
#/definitions/researchpapers.PaperReadRequest
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| limit | integer | No | ||||
| paper_id | string | Yes | ||||
| question | string | Yes |
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.PaperReadResponse | No | ||||
| data.coverage | array | No | ||||
| data.coverage[].corpus_revision | string | No | ||||
| data.coverage[].failure | researchretrieval.PaperFailure | No | ||||
| data.coverage[].failure.message | string | No | ||||
| data.coverage[].failure.reason | string | No | 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 | |||
| data.coverage[].failure.retry_after_seconds | integer | No | ||||
| data.coverage[].failure.retryable | boolean | No | ||||
| data.coverage[].indexed_at | string | No | ||||
| data.coverage[].retrieved_at | string | No | ||||
| data.coverage[].source_id | string | No | ||||
| data.coverage[].status | string | No | ok, failed, not_indexed, unsupported | |||
| data.full_text | researchpapers.EuropePMCFullText | No | ||||
| data.full_text.attribution | string | No | ||||
| data.full_text.content_sha256 | string | No | ||||
| data.full_text.copyright | string | No | ||||
| data.full_text.extraction_note | string | No | ||||
| data.full_text.license_text | string | No | ||||
| data.full_text.license_url | string | No | ||||
| data.full_text.retrieved_at | string | No | ||||
| data.full_text.source_url | string | No | ||||
| data.full_text.text | string | No | ||||
| data.full_text_available | boolean | No | ||||
| data.paper | researchretrieval.Paper | No | ||||
| data.paper.abstract | string | No | ||||
| data.paper.authors | array | No | ||||
| data.paper.authors[].affiliation | string | No | ||||
| data.paper.authors[].name | string | No | ||||
| data.paper.content_level | string | No | metadata, abstract, full_text | |||
| data.paper.identifiers | array | No | ||||
| data.paper.identifiers[].namespace | string | No | arxiv, doi, pmid, pmcid | |||
| data.paper.identifiers[].value | string | No | ||||
| data.paper.paper_id | string | No | ||||
| data.paper.primary_id | string | No | ||||
| data.paper.publication_year | integer | No | ||||
| data.paper.published_at | string | No | ||||
| data.paper.retrieved_at | string | No | ||||
| data.paper.source_urls | array | No | ||||
| data.paper.title | string | No | ||||
| data.paper.updated_at | string | No | ||||
| data.passages | array | No | ||||
| data.passages[].locator | retrievaltypes.PassageLocator | No | ||||
| data.passages[].locator.anchor | string | No | ||||
| data.passages[].locator.end_byte | integer | No | ||||
| data.passages[].locator.end_line | integer | No | ||||
| data.passages[].locator.heading | string | No | ||||
| data.passages[].locator.page | integer | No | ||||
| data.passages[].locator.start_byte | integer | No | ||||
| data.passages[].locator.start_line | integer | No | ||||
| data.passages[].passage_id | string | No | ||||
| data.passages[].score | number | No | ||||
| data.passages[].text | string | No | ||||
| data.unavailable_reason | string | No | not_indexed, restricted, unsupported_format, not_found | |||
| data.usage | retrievaltypes.Usage | No | ||||
| data.usage.browser_renders | integer | No | ||||
| data.usage.credits_charged | integer | No | ||||
| data.usage.credits_released | integer | No | ||||
| data.usage.credits_reserved | integer | No | ||||
| data.usage.fetch_attempts | integer | No | ||||
| data.usage.fetched_urls | integer | No | ||||
| data.usage.input_tokens | integer | No | ||||
| data.usage.output_tokens | integer | No | ||||
| data.usage.search_requests | integer | No | ||||
| data.usage.settlement_pending | boolean | No | ||||
| 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 |
| 404 | Not Found | #/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 POST "https://api.crawlora.net/api/v1/research/papers/read" \
-H "x-api-key: $CRAWLORA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"limit":1,"paper_id":"string","question":"string"}'