Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/fatcat-works-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: fatcat auth Works API
version: 0.5.0
description: 'Fatcat is a scalable, versioned, API-oriented catalog of bibliographic
entities and file metadata.
<!-- STARTLONGDESCRIPTION -->
These API reference documents, along with client software libraries, are
generated automatically from an OpenAPI 2.0 ("Swagger") definition file.
## Introduction
A higher-level introduction to the API, as well as a description of the
fatcat data model, are available in ["The Fatcat Guide"](https://guide.fatcat.wiki/).
The guide also includes a [Cookbook](https://guide.fatcat.wiki/cookbook.html)
section demonstrating end-to-end tasks like creating entities as part of
editgroups, or safely merging duplicate entities.
### Expectations and Best Practices
A test/staging QA API instance of fatcat is available at
<https://api.qa.fatcat.wiki/v0>. The database backing this instance is
separate from the production interface, and is periodically rebuilt from
snapshots of the full production database, meaning that edits on the QA
server will *NOT* persist, and that semantics like the changelog index
monotonically increasing *MAY* be broken. Developers are expexcted to test
their scripts and tools against the QA instance before running against
production.
NOTE: as of Spring 2021, the QA server is temporarily unavailable.
Fatcat is made available as a gratis (no cost) and libre (freedom
preserving) service to the public, with limited funding and resources. We
welcome new and unforeseen uses and contributions, but may need to impose
restrictions (like rate-limits) to keep the service functional for other
users, and in extreme cases reserve the option to block accounts and IP
ranges if necessary to keep the service operational.
The Internet Archive owns and operates it''s own server equipment and data
centers, and operations are optimized for low-cost, not high-availability.
Users and partners should expect some downtime on the fatcat API, on the
order of hours a month.
Periodic metadata exports are available for batch processing, and database
snapshots can be used to create locally-hosted mirrors of the service for
more intensive and reliable querying.
### Other Nitty Gritties
Cross-origin requests are allowed for the API service, to enable third
parties to build in-browser applications.
A metadata search service is available at <https://search.fatcat.wiki>.
The API is currently the raw elasticsearch API, with only GET (read)
requests allowed. This public service is experimental and may be removed or
limited in the future.
## Authentication
The API allows basic read-only "GET" HTTP requests with no authentication.
Proposing changes to the metadata, or other mutating requests ("PUT",
"POST", "DELETE") all require authentication, and some operations require
additional account permissions.
End-user account creation and login happens through the web interface. From
a logged-in editor profile page, you can generate a API token. Tokens are
"macaroons", similar to JWT tokens, and are used for all API
authentication. The web interface includes macaroons in browser cookies and
passes them through to the API to authenticate editor actions.
<!-- ReDoc-Inject: <security-definitions> -->
<!-- ENDLONGDESCRIPTION -->
'
termsOfService: https://guide.fatcat.wiki/policies.html
contact:
name: Internet Archive Web Group
email: webservices@archive.org
url: https://fatcat.wiki
x-logo:
url: https://fatcat.wiki/static/paper_man_confused.gif
altText: Confused Papers Man (Logo)
backgroundColor: '#FFFFFF'
servers:
- url: https://api.fatcat.wiki/v0
tags:
- name: works
x-displayName: Works
description: '**Work** entities group several Release entities which are different # TAGLINE
versions of the same abstract piece of research. For example, three # TAGLINE
release entities representing the pre-print, published article, and # TAGLINE
retraction stages of the same journal paper would be grouped under a # TAGLINE
single work. # TAGLINE
See the "Catalog Style Guide" section of the guide for details and # TAGLINE
semantics of what should be included in specific entity fields. # TAGLINE
Specifically, the # TAGLINE
[Work Entity Reference](https://guide.fatcat.wiki/entity_work.html). # TAGLINE
'
paths:
/editgroup/{editgroup_id}/work:
parameters:
- name: editgroup_id
in: path
required: true
schema:
type: string
post:
operationId: create_work
tags:
- works
security:
- Bearer: []
responses:
400:
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
404:
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
500:
description: Generic Error
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
401:
description: Not Authorized
headers:
WWW_Authenticate:
schema:
type: string
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
403:
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
201:
description: Created Entity
content:
application/json:
schema:
$ref: '#/components/schemas/entity_edit'
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/work_entity'
required: true
/editgroup/auto/work/batch:
post:
operationId: create_work_auto_batch
tags:
- works
security:
- Bearer: []
responses:
400:
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
404:
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
500:
description: Generic Error
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
401:
description: Not Authorized
headers:
WWW_Authenticate:
schema:
type: string
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
403:
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
201:
description: Created Editgroup
content:
application/json:
schema:
$ref: '#/components/schemas/editgroup'
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/work_auto_batch'
required: true
/work/{ident}:
parameters:
- name: ident
in: path
required: true
schema:
type: string
get:
operationId: get_work
tags:
- works
parameters:
- name: expand
in: query
required: false
description: List of sub-entities to expand in response. For works, none accepted (yet).
schema:
type: string
- name: hide
in: query
required: false
description: List of entity fields to elide in response. For works, none accepted (yet).
schema:
type: string
responses:
400:
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
404:
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
500:
description: Generic Error
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
200:
description: Found Entity
content:
application/json:
schema:
$ref: '#/components/schemas/work_entity'
/editgroup/{editgroup_id}/work/{ident}:
parameters:
- name: editgroup_id
in: path
required: true
schema:
type: string
- name: ident
in: path
required: true
schema:
type: string
put:
operationId: update_work
tags:
- works
security:
- Bearer: []
responses:
400:
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
404:
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
500:
description: Generic Error
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
401:
description: Not Authorized
headers:
WWW_Authenticate:
schema:
type: string
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
403:
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
200:
description: Updated Entity
content:
application/json:
schema:
$ref: '#/components/schemas/entity_edit'
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/work_entity'
required: true
delete:
operationId: delete_work
tags:
- works
security:
- Bearer: []
responses:
400:
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
404:
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
500:
description: Generic Error
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
401:
description: Not Authorized
headers:
WWW_Authenticate:
schema:
type: string
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
403:
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
200:
description: Deleted Entity
content:
application/json:
schema:
$ref: '#/components/schemas/entity_edit'
/work/rev/{rev_id}:
parameters:
- description: UUID (lower-case, dash-separated, hex-encoded 128-bit)
name: rev_id
in: path
required: true
schema:
type: string
maxLength: 36
minLength: 36
pattern: '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}'
get:
operationId: get_work_revision
tags:
- works
parameters:
- name: expand
in: query
required: false
description: List of sub-entities to expand in response. See `get_work`, though note that identifier-based expansions like `releases` will always be empty for revisions.
schema:
type: string
- name: hide
in: query
required: false
description: List of entity fields to elide in response. See `get_work`.
schema:
type: string
responses:
400:
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
404:
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
500:
description: Generic Error
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
200:
description: Found Entity Revision
content:
application/json:
schema:
$ref: '#/components/schemas/work_entity'
/work/{ident}/history:
parameters:
- name: ident
in: path
required: true
schema:
type: string
- name: limit
in: query
required: false
schema:
type: integer
format: int64
get:
operationId: get_work_history
tags:
- works
responses:
400:
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
404:
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
500:
description: Generic Error
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
200:
description: Found Entity History
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/entity_history_entry'
/work/{ident}/redirects:
parameters:
- name: ident
in: path
required: true
schema:
type: string
get:
operationId: get_work_redirects
tags:
- works
responses:
400:
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
404:
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
500:
description: Generic Error
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
200:
description: Found Entity Redirects
content:
application/json:
schema:
type: array
items:
type: string
pattern: '[a-zA-Z2-7]{26}'
minLength: 26
maxLength: 26
description: base32-encoded unique identifier
/work/{ident}/releases:
parameters:
- name: ident
in: path
required: true
schema:
type: string
- name: hide
in: query
required: false
description: List of entity fields to elide in response. See `get_release`.
schema:
type: string
get:
operationId: get_work_releases
tags:
- works
description: 'Returns the set of release entities that are part of this work (aka,
have `work_id` pointing to this work entity).
'
responses:
400:
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
404:
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
500:
description: Generic Error
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
200:
description: Found
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/release_entity'
/work/edit/{edit_id}:
get:
operationId: get_work_edit
tags:
- works
parameters:
- description: UUID (lower-case, dash-separated, hex-encoded 128-bit)
name: edit_id
in: path
required: true
schema:
type: string
maxLength: 36
minLength: 36
pattern: '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}'
responses:
400:
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
404:
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
500:
description: Generic Error
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
200:
description: Found Edit
content:
application/json:
schema:
$ref: '#/components/schemas/entity_edit'
/editgroup/{editgroup_id}/work/edit/{edit_id}:
parameters:
- name: editgroup_id
in: path
required: true
schema:
type: string
- description: UUID (lower-case, dash-separated, hex-encoded 128-bit)
name: edit_id
in: path
required: true
schema:
type: string
maxLength: 36
minLength: 36
pattern: '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}'
delete:
operationId: delete_work_edit
tags:
- works
security:
- Bearer: []
responses:
400:
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
404:
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
500:
description: Generic Error
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
401:
description: Not Authorized
headers:
WWW_Authenticate:
schema:
type: string
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
403:
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/error_response'
200:
description: Deleted Edit
content:
application/json:
schema:
$ref: '#/components/schemas/success'
components:
schemas:
file_url:
type: object
required:
- url
- rel
properties:
url:
type: string
format: url
example: https://example.edu/~frau/prcding.pdf
description: 'URL/URI pointing directly to a machine retrievable copy of this exact
file.
'
rel:
type: string
example: web
description: 'Indicates type of host this URL points to. Eg, "publisher",
"repository", "webarchive". See guide for list of acceptable values.
'
webcapture_url:
type: object
required:
- url
- rel
properties:
url:
type: string
format: url
example: https://web.archive.org/web/
description: 'URL/URI pointing to archive of this web resource.
'
rel:
type: string
example: wayback
description: 'Type of archive endpoint. Usually `wayback` (WBM replay of primary
resource), or `warc` (direct URL to a WARC file containing all
resources of the capture). See guide for full list.
'
editgroup_annotation:
type: object
properties:
annotation_id:
type: string
pattern: '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}'
minLength: 36
maxLength: 36
description: UUID (lower-case, dash-separated, hex-encoded 128-bit)
example: 86daea5b-1b6b-432a-bb67-ea97795f80fe
editgroup_id:
type: string
pattern: '[a-zA-Z2-7]{26}'
minLength: 26
maxLength: 26
description: 'Editgroup that this annotation applies to. Set automatically in
creations based on URL parameter.
'
example: q3nouwy3nnbsvo3h5klxsx4a7y
editor_id:
type: string
pattern: '[a-zA-Z2-7]{26}'
minLength: 26
maxLength: 26
description: 'Defaults to editor created the annotation via POST request.
'
example: q3nouwy3nnbsvo3h5klxsx4a7y
editor:
$ref: '#/components/schemas/editor'
description: 'Only included in GET responses; ignored in PUT or POST requests.
'
created:
type: string
format: date-time
description: 'Timestamp when annotation was first created.
'
comment_markdown:
type: string
extra:
type: object
additionalProperties: {}
description: 'Additional free-form JSON metadata that can be included as part of
the annotation (or even as the primary annotation itself). See guide
for details.
'
error_response:
type: object
required:
- success
- error
- message
properties:
success:
type: boolean
example: false
error:
type: string
example: unexpected-thing
message:
type: string
example: A really confusing, totally unexpected thing happened
fileset_entity:
type: object
properties:
state:
type: string
enum:
- wip
- active
- redirect
- deleted
example: active
ident:
type: string
pattern: '[a-zA-Z2-7]{26}'
minLength: 26
maxLength: 26
description: base32-encoded unique identifier
example: q3nouwy3nnbsvo3h5klxsx4a7y
revision:
type: string
pattern: '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}'
minLength: 36
maxLength: 36
description: UUID (lower-case, dash-separated, hex-encoded 128-bit)
example: 86daea5b-1b6b-432a-bb67-ea97795f80fe
redirect:
type: string
pattern: '[a-zA-Z2-7]{26}'
minLength: 26
maxLength: 26
description: base32-encoded unique identifier
example: q3nouwy3nnbsvo3h5klxsx4a7y
extra:
type: object
description: 'Free-form JSON metadata that will be stored with the other entity
metadata. See guide for (unenforced) schema conventions.
'
additionalProperties: {}
edit_extra:
type: object
description: 'Free-form JSON metadata that will be stored with specific entity edits
(eg, creation/update/delete).
'
additionalProperties: {}
content_scope:
type: string
example: issue
manifest:
type: array
items:
$ref: '#/components/schemas/fileset_file'
urls:
type: array
items:
$ref: '#/components/schemas/fileset_url'
release_ids:
type: array
items:
type: string
pattern: '[a-zA-Z2-7]{26}'
minLength: 26
maxLength: 26
description: base32-encoded unique identifier
example: q3nouwy3nnbsvo3h5klxsx4a7y
description: 'Set of identifier of release entities this fileset represents a full
manifestation of. Usually a single release.
'
releases:
type: array
items:
$ref: '#/components/schemas/release_entity'
description: 'Full release entities, included in GET responses when `releases`
included in `expand` parameter. Ignored if included in PUT or POST
requests.
'
webcapture_entity:
type: object
properties:
state:
type: string
enum:
- wip
- active
- redirect
- deleted
example: active
ident:
type: string
pattern: '[a-zA-Z2-7]{26}'
minLength: 26
maxLength: 26
description: base32-encoded unique identifier
example: q3nouwy3nnbsvo3h5klxsx4a7y
revision:
type: string
pattern: '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}'
minLength: 36
maxLength: 36
description: UUID (lower-case, dash-separated, hex-encoded 128-bit)
example: 86daea5b-1b6b-432a-bb67-ea97795f80fe
redirect:
type: string
pattern: '[a-zA-Z2-7]{26}'
minLength: 26
maxLength: 26
description: base32-encoded unique identifier
example: q3nouwy3nnbsvo3h5klxsx4a7y
extra:
type: object
description: 'Free-form JSON metadata that will be stored with the other entity
metadata. See guide for (unenforced) schema conventions.
'
additionalProperties: {}
edit_extra:
type: object
description: 'Free-form JSON metadata that will be stored with specific entity edits
(eg, creation/update/delete).
'
additionalProperties: {}
cdx:
type: array
items:
$ref: '#/components/schemas/webcapture_cdx_line'
archive_urls:
type: array
items:
$ref: '#/components/schemas/webcapture_url'
original_url:
type: string
format: url
example: http://asheesh.org
description: Base URL of the primary resource this is a capture of
timestamp:
type: string
format: date-time
description: 'Same format as CDX line timestamp (UTC, etc). Corresponds to the
overall capture timestamp. Should generally be the timestamp of
capture of the primary resource URL.
'
content_scope:
type: string
example: landing-page
release_ids:
type: array
items:
type: string
pattern: '[a-zA-Z2-7]{26}'
minLength: 26
maxLength: 26
description: base32-encoded unique identifier
example: q3nouwy3nnbsvo3h5klxsx4a7y
description: 'Set of identifier of release entities this fileset represents a full
manifestation of. Usually a single release.
'
releases:
type: array
items:
$ref: '#/components/schemas/release_entity'
description: 'Full release entities, included in GET responses when `releases`
included in `expand` parameter. Ignored if included in PUT or POST
requests.
'
release_ref:
type: object
properties:
index:
type: integer
format: int64
description: 'Zero-indexed sequence number of this reference in the list of
references. Assigned automatically and used internally; don''t confuse
with `key`.
'
target_release_id:
type: string
pattern: '[a-zA-Z2-7]{26}'
minLength: 26
maxLength: 26
description: 'Optional, fatcat identifier of release entity that this reference is
citing.
'
example: q3nouwy3nnbsvo3h5klxsx4a7y
extra:
type: object
additionalProperties: {}
description: 'Additional free-form JSON metadata about this citation. Generally
follows Citation Style Language (CSL) JSON schema. See guide for
details.
'
key:
type: string
example: SMITH2016
description: 'Short string used to indicate this reference from within the release
text; or numbering of references as typeset in the release itself.
Optional; don''t confuse with `index` field.
'
year:
type: integer
format: int64
example: 1972
description: 'Year that the cited work was published in.
'
container_name:
type: string
description: 'Name of the container (eg, journal) that the citation work was
published as part of. May be an acronym or full name.
'
title:
type: string
description: Name of the work being cited.
locator:
type: string
example: p123
description: 'Page number or other indicator of the specific subset of a work being
cited. Not to be confused with the first page (or page range) of an
entire paper or chapter being cited.
'
success:
type: object
required:
- success
- message
properties:
success:
type: boolean
example: true
message:
type: string
example: The computers did the thing successfully!
editgroup:
type: object
properties:
editgroup_id:
type: string
pattern: '[a-zA-Z2-7]{26}'
minLength: 26
maxLength: 26
description: 'Fatcat identifier for this editgroup. Assigned on creation.
'
example: q3nouwy3nnbsvo3h5klxsx4a7y
editor_id:
type: string
pattern: '[a-zA-Z2-7]{26}'
minLength: 26
maxLength: 26
description: 'Fatcat identifier of editor that created this editgroup.
'
example: q3nouwy3nnbsvo3h5klxsx4a7y
editor:
$ref: '#/components/schemas/editor'
description: 'Complete editor object identified by `container_id` field. Only
included in GET responses.
'
changelog_index:
type: integer
example: 1048576
format: int64
description: 'For accepted/merged editgroups, the changelog index that the accept
occurred at. WARNING: not populated in all contexts that an editgroup
could be included in a response.
'
created:
type: string
format: date-time
description: 'Timestamp when this editgroup was first created.
'
submitted:
type: string
format: date-time
description: 'Timestamp when this editgroup was most recently submitted for review.
If withdrawn, or never submitted, will be `null`.
'
description:
type: string
description: 'Comment describing the changes in this editgroup. Can be updated w
# --- truncated at 32 KB (69 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/fatcat/refs/heads/main/openapi/fatcat-works-api-openapi.yml