---
title: "Papers API"
description: "Search over millions of research papers with simple or advanced queries. Returns clean metadata for apps and agents."
canonical_url: "https://scholarxiv.com/developers/docs/papers-api"
markdown_url: "https://scholarxiv.com/developers/docs/papers-api.md"
---

> For the complete documentation index, see [llms.txt](/llms.txt).

# Papers API

The Papers API lets you search the ScholarXIV paper index programmatically.

It is a read-only search API. It returns structured metadata — titles, authors, abstracts, categories, dates, and PDF links. It does **not** manage collections, likes, or bookmarks.

## Endpoints

| Method | Path                    | Use Case                    |
| ------ | ----------------------- | --------------------------- |
| `GET`  | `/api/v1/papers/search` | Simple title search         |
| `POST` | `/api/v1/papers/search` | Advanced multi-field search |

Base URL: `https://scholarxiv.com`

Every request must include a valid API key (see Authentication).

## Limits By Plan

| Plan | Max API Keys | Requests per Hour | Max Results per Request |
| ---- | ------------ | ----------------- | ----------------------- |
| Free | 2            | 1,200             | 2,000                   |
| Plus | 5            | 2,400             | 4,000                   |
| Pro  | 20           | 3,600             | 6,000                   |

The hourly request limit is shared across all of your API keys and uses a rolling 60-minute window.

## 429 Rate Limit Handling

If the Papers API returns `429 Too Many Requests`, read the `Retry-After` header, wait that many seconds, and retry with backoff. Check the [Usage dashboard](/developers/docs/dashboard/usage) to see current consumption across all keys before running another batch job.

## Response Format

Successful responses always contain `data` and `pagination`.

```json title="response.json"
{
	"data": [
		/* paper objects */
	],
	"pagination": {
		"page": 0,
		"limit": 20,
		"hasMore": true,
		"nextPage": 1
	}
}
```

## Paper Object

Here is the shape of items returned in `data`:

| Field             | Type     | Always Present? | Description                            |
| ----------------- | -------- | --------------- | -------------------------------------- |
| `id`              | string   | Yes             | Full arXiv identifier URL              |
| `extractedID`     | string   | Yes             | Clean ID (e.g. `2401.01234v1`)         |
| `title`           | string   | Yes             | Paper title                            |
| `summary`         | string   | Yes             | Abstract / summary text                |
| `authors`         | string[] | Yes             | List of author names                   |
| `published`       | ISO date | Yes             | Original submission / publication date |
| `updated`         | ISO date | Often           | Last record update time                |
| `primaryCategory` | string   | Yes             | Primary arXiv category (e.g. `cs.CL`)  |
| `category`        | string[] | Yes             | All associated categories              |
| `pdfLink`         | string   | Yes             | Direct link to the PDF                 |

Optional fields that appear on many papers: `doi`, `journalRef`, `comment`, `reportNo`, `submitter`, `authorsRaw`.

**Example paper object:**

```json title="paper.json"
{
	"id": "http://arxiv.org/abs/2401.01234v1",
	"extractedID": "2401.01234v1",
	"title": "Attention Is All You Need",
	"summary": "The dominant sequence transduction models are based on complex recurrent or convolutional neural networks...",
	"authors": ["Ashish Vaswani", "Noam Shazeer", "Niki Parmar"],
	"published": "2023-06-01T00:00:00Z",
	"updated": "2023-06-05T00:00:00Z",
	"primaryCategory": "cs.CL",
	"category": ["cs.CL", "cs.LG"],
	"pdfLink": "https://arxiv.org/pdf/2401.01234v1",
	"doi": "10.48550/arXiv.2401.01234"
}
```

> [!NOTE]
> Treat optional fields as nullable in your code. The API returns whatever metadata was available from the source.

## Pagination

- Zero-based (`page=0` is the first page).
- `limit` / `maxResults` is capped by your current plan: Free 2,000, Plus 4,000, Pro 6,000.
- Use `pagination.nextPage` (or `hasMore`) to decide whether to continue. Do not guess.

**Best practice:** Always loop using the `nextPage` value returned by the API.

See the [Code Examples](/developers/docs/papers-api/examples) page for complete quickstarts, search examples, full pagination loops, retry logic, and production patterns.

## Next

- [Authentication](/developers/docs/papers-api/authentication) — key format and headers.
- [Search](/developers/docs/papers-api/search) — filters and query options.
- [Rate Limits & Quotas](/developers/docs/papers-api/limits) — entitlements, plan changes, and rate limit behavior.
- [Code Examples](/developers/docs/papers-api/examples) — all ready-to-use code samples.
- [Errors](/developers/docs/papers-api/errors) — status codes and troubleshooting.

## Sitemap

See the full [sitemap](/sitemap.md) for all pages.
Docs-scoped sitemap: [/docs/sitemap.md](/docs/sitemap.md).
Well-known sitemap: [/.well-known/sitemap.md](/.well-known/sitemap.md).
