Find an API

Search public APIs with auth details & Postman guides

← All APIs

OpenAlex

openalex.org · Science

Science No Auth Free & Open Academic Research Open Data

Free, open index of hundreds of millions of scholarly works, authors, institutions, journals, and concepts. Aggregates from Crossref, ORCID, Unpaywall, and more. No API key required — just start querying.

Authentication

No authentication requiredFree to use with no key needed.

Sample Requests

GET Search works by keyword

Search scholarly works by keyword.

https://api.openalex.org/works?search=machine learning&per_page=5

Hover any highlighted part to learn what it does

curl -X GET "https://api.openalex.org/works?search=machine%20learning&per_page=5"
import requests
params = {
    "search": "machine learning",
    "per_page": "5"
}
response = requests.get(
    "https://api.openalex.org/works",
    params=params,
)
print(response.json())
const url = new URL('https://api.openalex.org/works');
url.searchParams.set('search', 'machine learning');
url.searchParams.set('per_page', '5');

const response = await fetch(url); 
const data = await response.json();
console.log(data);
package main

import (
	"fmt"
	"io"
	"net/http"
	"net/url"
)

func main() {
	baseURL, _ := url.Parse("https://api.openalex.org/works")
	q := baseURL.Query()
	q.Set("search", "machine learning")
	q.Set("per_page", "5")
	baseURL.RawQuery = q.Encode()
	targetURL := baseURL.String()
	req, _ := http.NewRequest("GET", targetURL, nil)

	client := &http.Client{}
	resp, _ := client.Do(req)
	defer resp.Body.Close()
	body, _ := io.ReadAll(resp.Body)
	fmt.Println(string(body))
}
require "net/http"
require "json"

uri = URI("https://api.openalex.org/works")
uri.query = URI.encode_www_form({
  "search" => "machine learning",
  "per_page" => "5"
})

http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == "https"

req = Net::HTTP::Get.new(uri)

res = http.request(req)
puts JSON.parse(res.body)
<?php
$url = "https://api.openalex.org/works?" . http_build_query([
    "search" => "machine learning",
    "per_page" => "5"
]);
$opts = ["http" => [
    "method" => "GET",
]];
$ctx = stream_context_create($opts);
$res = file_get_contents($url, false, $ctx);
print_r(json_decode($res, true));
GET Get author by ORCID

Retrieve an author record by ORCID.

https://api.openalex.org/authors/https:/orcid.org/0000-0001-5000-0007

Hover any highlighted part to learn what it does

curl -X GET "https://api.openalex.org/authors/https://orcid.org/0000-0001-5000-0007"
import requests
response = requests.get(
    "https://api.openalex.org/authors/https://orcid.org/0000-0001-5000-0007",
)
print(response.json())
const url = 'https://api.openalex.org/authors/https://orcid.org/0000-0001-5000-0007';

const response = await fetch(url); 
const data = await response.json();
console.log(data);
package main

import (
	"fmt"
	"io"
	"net/http"
)

func main() {
	targetURL := "https://api.openalex.org/authors/https://orcid.org/0000-0001-5000-0007"
	req, _ := http.NewRequest("GET", targetURL, nil)

	client := &http.Client{}
	resp, _ := client.Do(req)
	defer resp.Body.Close()
	body, _ := io.ReadAll(resp.Body)
	fmt.Println(string(body))
}
require "net/http"
require "json"

uri = URI("https://api.openalex.org/authors/https://orcid.org/0000-0001-5000-0007")

http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == "https"

req = Net::HTTP::Get.new(uri)

res = http.request(req)
puts JSON.parse(res.body)
<?php
$url = "https://api.openalex.org/authors/https://orcid.org/0000-0001-5000-0007";
$opts = ["http" => [
    "method" => "GET",
]];
$ctx = stream_context_create($opts);
$res = file_get_contents($url, false, $ctx);
print_r(json_decode($res, true));

Postman Setup Guide

Get Postman ↗
  1. No API key needed
  2. Try GET https://api.openalex.org/works?search=climate+change
  3. Add &[email protected] for higher rate limits
  4. Filter by open_access.is_oa=true for free full-text papers

Open documentation ↗