{
  "openapi": "3.0.1",
  "info": {
    "title": "Academic Papers Search API — OpenAlex, Crossref, arXiv, PubMed",
    "description": "Search OpenAlex, Crossref, arXiv and PubMed, or look up DOIs, arXiv ids and PMIDs. One merged row per paper: title, abstract, venue, year, DOI, citations, open-access status and PDF link, authors with institutions, topics. Filter by year, type, open access, citations. No API key.",
    "version": "0.1",
    "x-build-id": "1vnLZ4GtOBvTqmaeJ"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/insight.solutions~academic-papers-api/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-insight.solutions-academic-papers-api",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/insight.solutions~academic-papers-api/runs": {
      "post": {
        "operationId": "runs-sync-insight.solutions-academic-papers-api",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/insight.solutions~academic-papers-api/run-sync": {
      "post": {
        "operationId": "run-sync-insight.solutions-academic-papers-api",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "queries": {
            "title": "Search queries",
            "type": "array",
            "description": "Free-text searches. Each query is searched once in every source you pick below, and each of those walks returns up to `maxResults` papers. Leave empty to only look up the identifiers below.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "title": "Sources",
            "type": "array",
            "description": "Where the queries are searched. OpenAlex is the broadest (abstracts, citations, topics, open-access links, institutions). Crossref is the publishers' own metadata of record. arXiv is preprints with full abstracts and PDFs. PubMed is biomedicine, with MeSH terms and abstracts. Identifier lookups always go to the source that owns the identifier, whatever this says.",
            "items": {
              "type": "string",
              "enum": [
                "openalex",
                "crossref",
                "arxiv",
                "pubmed"
              ],
              "enumTitles": [
                "OpenAlex (default, broadest)",
                "Crossref (publisher metadata)",
                "arXiv (preprints)",
                "PubMed (biomedical)"
              ]
            },
            "default": [
              "openalex"
            ]
          },
          "maxResults": {
            "title": "Max papers per query and source",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "How many papers each query may return from each source. `0` means no cap (the time budget still applies). Identifier lookups are not capped: they return what you asked for.",
            "default": 100
          },
          "dois": {
            "title": "DOIs to look up",
            "type": "array",
            "description": "Direct lookups, in any form: `10.1038/s41586-021-03819-2`, `doi:10.1038/…` or `https://doi.org/10.1038/…`. Resolved through OpenAlex first, then Crossref when OpenAlex has no record. An unknown DOI is a free `not-found` row.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "arxivIds": {
            "title": "arXiv ids to look up",
            "type": "array",
            "description": "`2303.08774`, `2303.08774v2`, `arXiv:2303.08774` or `https://arxiv.org/abs/2303.08774`; the pre-2007 form `hep-th/9901001` works too. Looked up on arXiv, 50 per request.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "pmids": {
            "title": "PubMed ids to look up",
            "type": "array",
            "description": "PMIDs such as `38253521`, `PMID: 38253521` or a pubmed.ncbi.nlm.nih.gov link. Looked up on PubMed, 50 per request, with abstracts, MeSH terms and keywords.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "arxivCategories": {
            "title": "arXiv categories",
            "type": "array",
            "description": "Limit the arXiv search to categories such as `cs.CL`, `cs.LG` or `q-bio.NC` (several are ORed). Setting one adds arXiv to the sources. With no search query at all, the categories are browsed on their own, newest first when `sortBy` is `date`.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "yearFrom": {
            "title": "Published from (year)",
            "minimum": 1000,
            "maximum": 2100,
            "type": "integer",
            "description": "Earliest publication year, inclusive. Applied upstream by OpenAlex, Crossref and PubMed, and to arXiv's first-submission date here."
          },
          "yearTo": {
            "title": "Published up to (year)",
            "minimum": 1000,
            "maximum": 2100,
            "type": "integer",
            "description": "Latest publication year, inclusive."
          },
          "types": {
            "title": "Types",
            "type": "array",
            "description": "Keep only these kinds of work. Leave empty for all. arXiv holds preprints only; Crossref does not label review articles, so `review` never matches a Crossref record; PubMed types come from its publication types.",
            "items": {
              "type": "string",
              "enum": [
                "article",
                "preprint",
                "review",
                "book-chapter",
                "book",
                "dissertation",
                "dataset",
                "other"
              ],
              "enumTitles": [
                "Article (journal or conference)",
                "Preprint",
                "Review",
                "Book chapter",
                "Book",
                "Dissertation",
                "Dataset",
                "Other"
              ]
            },
            "default": []
          },
          "openAccessOnly": {
            "title": "Open access only",
            "type": "boolean",
            "description": "Keep only papers that are free to read. OpenAlex applies this upstream; every arXiv paper qualifies; PubMed papers qualify when they are in PubMed Central. Crossref publishes no open-access status, so Crossref results are dropped (one free `skipped` row says how many).",
            "default": false
          },
          "minCitations": {
            "title": "Minimum citations",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only papers cited at least this many times. Applied upstream by OpenAlex and to Crossref's own count here. arXiv and PubMed publish no citation counts, so their papers are kept with `citationCount: null`."
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "relevance",
              "citations",
              "date"
            ],
            "type": "string",
            "description": "`relevance` (each source's own ranking), `citations` (most cited first — OpenAlex and Crossref; arXiv and PubMed fall back to relevance) or `date` (newest first, in every source).",
            "default": "relevance"
          },
          "includeAbstract": {
            "title": "Include abstracts",
            "type": "boolean",
            "description": "Fill the `abstract` column. OpenAlex's is rebuilt from its word index; Crossref has one only when the publisher deposited it; arXiv's is always there; PubMed's needs one extra request per 50 papers. Turn off for smaller, faster rows.",
            "default": true
          },
          "includeAuthors": {
            "title": "Include authors",
            "type": "boolean",
            "description": "Fill `authors` with each author's name as printed on the paper, their institutions and those institutions' countries — nothing else, never an ORCID or an e-mail address. Turn off to drop the author list and `firstAuthor` entirely.",
            "default": true
          },
          "dedupe": {
            "title": "Merge duplicates across sources",
            "type": "boolean",
            "description": "One paper, one row: records from several sources are merged on DOI, then arXiv id, then PMID. The OpenAlex record is the base and the others fill its empty columns; `sources` lists every source that had it. You pay for the merged row once. Turn off to get (and pay for) every source's row separately.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many searches and lookups run at once. arXiv is always one request at a time, three seconds apart, and PubMed at most three a second, whatever this is set to — those are their published rules.",
            "default": 3
          },
          "maxRunSecs": {
            "title": "Time budget (seconds)",
            "minimum": 30,
            "maximum": 3600,
            "type": "integer",
            "description": "Stop fetching after this many seconds and keep everything already returned.",
            "default": 240
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "All four sources answered from Apify's datacenter proxy and from no proxy at all in testing, so the cheap datacenter pool is the default and a cleared field still works.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}