GET /api/v1/object
application/jsonThe object record, plus every active claim about it with the evidence resolved inline, plus the authority identifiers with their verification status. Identifiers that could not be confirmed at their own authority — VIAF, FAST, BnF, Art UK — are published here carrying verified: false and are deliberately kept out of the JSON-LD and the IIIF manifest, where a bare URI reads as an assertion of fact.
{
"dataset_version": "0.9",
"object": {
"id": "np-rmb-001",
"accession": "NP-RMB-001",
"title": "Self-Portrait in a Velvet Cap with Plume",
"date": "1638",
"medium": "Etching, possibly with drypoint"
},
"claim_count": 18
}
GET /api/v1/object.jsonld
application/ld+jsonschema.org VisualArtwork. Only properties that exist in schema.org: there is no provenance property and no inventoryNumber property, so custody history is carried as a PropertyValue in additionalProperty and the accession number as an identifier with propertyID: "accession number". Dimensions are QuantitativeValue with unitCode: "MMT".
{
"@context": "https://schema.org",
"@type": "VisualArtwork",
"name": "Self-Portrait in a Velvet Cap with Plume",
"artMedium": "Etching, possibly with drypoint",
"creator": {
"@type": "Person",
"name": "Rembrandt Harmenszoon van Rijn",
"sameAs": [
"http://vocab.getty.edu/ulan/500011051",
"http://www.wikidata.org/entity/Q5598"
]
}
}
The Wikidata item for the 1638 self-portrait identifies the work and the plate, not this sheet, so it is emitted as exampleOfWork and never as sameAs. Many impressions exist; they are different objects.
GET /api/v1/census
application/jsonEvery located impression, one record each, with the URL of the institutional record it was transcribed from. 27 records at this version. Where institutions disagree, both readings are carried: state is the normalised, filterable value and is null wherever the holding institution states none, while state_verbatim preserves the source’s exact wording.
- ?state=
- Normalised New Hollstein state — I, II, IV. Rows whose institution states no state are excluded rather than guessed at.
- ?holder=
- museum · library · university · private · unlocated · art_market
- ?country=
- Country of the current custodian, e.g. Netherlands.
{
"type": "census",
"count": 27,
"records": [
{
"id": "CN-rijksmuseum-rp-p-1961-989",
"institution": "Rijksmuseum",
"city": "Amsterdam",
"accession_number": "RP-P-1961-989",
"state": "I",
"source_url": "https://www.rijksmuseum.nl/en/collection/RP-P-1961-989"
}
]
}
Filters combine with AND and are case-insensitive. Unknown parameters are ignored and named back to you in the response rather than treated as an error.
GET /api/v1/census.csv
text/csvThe same records as a spreadsheet: 27 rows, 39 columns, RFC 4180 quoting, CRLF line endings, and a UTF-8 byte order mark so Excel does not mangle the “×” in every dimension field. Repeating fields (collector marks, exhibitions, literature) are joined with a semicolon.
id,holder_type,institution,city,country,accession_number,state
CN-rijksmuseum-rp-p-1961-989,museum,Rijksmuseum,Amsterdam,Netherlands,RP-P-1961-989,I
CN-the-british-museum-1910-0212-376,museum,The British Museum,London,United Kingdom,1910-0212-376,II
GET /api/v1/claims
application/jsonEvery claim on the record with its evidence inline. Superseded and withdrawn claims are included and marked, never deleted — a record that quietly drops what it used to say cannot be audited.
{
"type": "claims",
"count": 18,
"records": [
{
"id": "CL-ARTIST",
"field": "Artist",
"value": "Rembrandt Harmenszoon van Rijn (1606–1669)",
"confidence": "probable",
"evidence": [
{
"id": "EV-ACQ-INVOICE",
"tier": "primary_document",
"title": "Bonhams invoice and purchase documentation, New York, 2023"
}
]
}
]
}
GET /api/v1/evidence
application/jsonEvery source the record rests on, with its tier (1 strongest, 8 weakest) and the claims that cite it. Tier is a property of the source, not of how convenient its contents are. Evidence held privately is listed with the reason and the terms on which a copy can be seen.
{
"type": "evidence",
"count": 5,
"records": [
{
"id": "EV-ACQ-INVOICE",
"tier": "primary_document",
"tier_rank": 2,
"title": "Bonhams invoice and purchase documentation, New York, 2023",
"access": "on_request",
"cited_by": [
"CL-ACQUISITION"
]
}
]
}
GET /api/v1/questions
application/jsonThe 12 open research questions: why each matters, what evidence exists now, what would settle it, and — under negative_findings — the searches already made that produced nothing, so nobody repeats them.
{
"type": "questions",
"count": 12,
"records": [
{
"id": "RQ-01",
"slug": "does-this-impression-carry-the-signature",
"title": "Does this impression carry the signature “Rembrandt f. 1638”, and if not, why not?",
"status": "open",
"difficulty": "low",
"suitable_for_student": true
}
]
}
GET /api/v1/provenance
application/jsonThe custody timeline, gaps included. A gap is a first-class event with is_gap: true and the same fields as any other, because an unbroken-looking chain with the undocumented centuries removed is a fiction.
{
"type": "provenance",
"gaps": 1,
"records": [
{
"id": "PV-003",
"type": "gap",
"is_gap": true,
"date_display": "1638 – 2023",
"title": "No documented ownership",
"confidence": "unknown"
}
]
}
GET /api/v1/bibliography
application/json13 entries, 3 of them verified against a published record. Fields reading UNVERIFIED were not confirmed and were not filled in from memory — that is how a wrong citation enters the literature and stays there.
{
"type": "bibliography",
"verified": 3,
"records": [
{
"id": "white-boon-1969",
"type": "catalogue_raisonne",
"authors": [
"Christopher White",
"Karel G. Boon"
],
"title": "Rembrandt's Etchings: An Illustrated Critical Catalogue",
"year": 1969,
"verified": true
}
]
}
GET /api/v1/bibliography.bib
application/x-bibtexThe same entries as BibTeX. Catalogues raisonnés and exhibition catalogues map to @book, articles to @article, chapters to @incollection, websites and datasets to @misc with howpublished and urldate. Titles are double-braced so styles that impose sentence case cannot lowercase a proper noun, and every unverified entry says so in its note.
@book{white-boon-1969,
author = {Christopher White and Karel G. Boon},
title = {{Rembrandt's Etchings: An Illustrated Critical Catalogue}},
publisher = {Van Gendt & Co.},
address = {Amsterdam},
year = {1969},
note = {Bibliographic details confirmed against a published record.}
}
GET /api/v1/states
application/jsonThe state atlas, plus the census records attributed to each state. Read divisions first: catalogues disagree about how many states this plate has, and each division is recorded with the catalogue asserting it rather than flattened into one number.
{
"type": "states",
"catalogue": "New Hollstein (Hinterding & Rutgers, Rembrandt)",
"count": 4,
"divisions": 5,
"records": [
{
"state": "I",
"headline": "Before the jaw is strengthened",
"documented": true
}
]
}
GET /api/v1/glossary
application/jsonThe 28 terms the record uses, defined once, with a source where the definition is not the project's own.
{
"type": "glossary",
"count": 28,
"records": [
{
"term": "Impression",
"category": "technique"
}
]
}
GET /api/v1/changelog
application/jsonEvery change to the canonical record, newest first, each with the reason it was made and the credit where someone outside the project prompted it. Nothing changes without an entry here.
{
"type": "changelog",
"count": 5,
"records": [
{
"id": "CH-001",
"date": "2026-08-12",
"type": "release",
"summary": "Record published at version 0.9"
}
]
}
GET /api/v1/dataset
application/jsonEverything, in one envelope, with per-entity counts. This is the endpoint to build on: fetch it once per release rather than polling the others.
{
"@context": "https://schema.org",
"@type": "Dataset",
"dataset_version": "0.9",
"dataset_date": "2026-08-12",
"counts": {
"claims": 18,
"census": 27,
"questions": 12,
"comparators": 8
}
}
GET /api/v1/search
application/jsonSubstring search across every entity, returning the record type, its id, a link and the surrounding text so you can see why it matched. No stemming and no relevance score: explainable beats clever on a dataset this size.
- ?q=
- The query. Required; an empty query returns the list of searchable types.
- ?type=
- Optional filter: object · claim · evidence · census · question · provenance · bibliography · state · glossary · changelog · comparator · education · story · policy
{
"query": "watermark",
"count": 12,
"results": [
{
"type": "question",
"id": "RQ-04",
"title": "Watermark identification",
"href": "https://rembrandt.aidispatch.xyz/research/questions/watermark-identification",
"snippet": "…transmitted-light capture would record any watermark fragment…"
}
]
}