This REST API exposes linked data related to Design Museum Gent. It provides access to collection objects, agents, exhibitions and thesaurus concepts as CIDOC-CRM compliant JSON-LD. The data is harvested from the Linked Data Event Streams and all URIs are compliant with the Flemish URI standard.
π Full documentation: api.designmuseumgent.be π§ Swagger UI: data.designmuseumgent.be/v2/api-docs π Changelog: CHANGELOG.md
Note
Scope. The API serves the objects that have been published through it β around ten thousand of the twenty-four thousand the museum holds. Which objects have been published, and in what order, is a decision made by people, and it shapes every count and statistic these endpoints return. This matters most for the index endpoints: a figure such as "grey accounts for half the collection palette" describes the published catalogue, not the collection.
| Endpoint | URI | Description |
|---|---|---|
| Objects | GET /v2/id/objects |
Paginated collection of all objects |
| Agents | GET /v2/id/agents |
Paginated collection of all agents |
| Exhibitions | GET /v2/id/exhibitions |
Paginated collection of all exhibitions |
| Concepts | GET /v2/id/concepts |
Paginated collection of the thesaurus |
| Private objects | GET /v2/id/private/objects |
Authenticated private stream |
All collection endpoints support ?fullRecord=true for bulk harvesting, ?modifiedSince=YYYY-MM-DD for incremental updates, ?q= for full text search, and use Hydra Core Vocabulary for pagination with Link headers.
Important
Records whose persistent URI redirects elsewhere β merged, renumbered or withdrawn β are excluded from the collection listings. They remain individually resolvable at /v2/id/object/{PID}, returning 301 or 410. If you maintain a mirror, reconcile against a full pass periodically: ?modifiedSince= cannot tell you that a record has left the collection.
| Endpoint | URI | Description |
|---|---|---|
| Object | GET /v2/id/object/{PID} |
Single collection object |
| Object β similar | GET /v2/id/object/{PID}/similar |
Objects whose photographs resemble this one |
| Agent | GET /v2/id/agent/{PID} |
Single agent record |
| Exhibition | GET /v2/id/exhibition/{PID} |
Single exhibition record |
| Concept | GET /v2/id/concept/{PID} |
Single thesaurus concept |
All single entity endpoints support HEAD requests for lightweight existence checks and cache validation.
These describe the collection rather than return records from it β what values exist, and in what proportion.
| Endpoint | URI | Description |
|---|---|---|
| Colours | GET /v2/id/colors |
Colour index with weighted statistics and hex values |
| Colours β dominant | GET /v2/id/colors/dominant |
Objects sorted by colour dominance |
| Production | GET /v2/id/production |
When the collection's objects were made, and when it acquired them |
| Types | GET /v2/id/types |
Object type index with counts |
| Materials | GET /v2/id/materials |
Material index with counts |
| Nationalities | GET /v2/id/nationalities |
Nationality index with counts |
| Roles | GET /v2/id/roles |
Agent role index with counts |
| DCAT | GET /v2/ |
Machine-readable data catalog |
Note
Index endpoints are rate limited to 20 requests per minute β far tighter than the collections, because each call aggregates across the whole collection. Cache their responses: the underlying figures change only when the collection is re-harvested.
curl 'https://data.designmuseumgent.be/v2/id/object/1975-0061/similar'Every photograph is encoded as a 768-dimension vector by CLIP (ViT-L-14-openai), a model trained on images paired with the text found near them online. /similar returns the objects whose photographs sit nearest.
The model has never seen this collection. It was never told what a decorative tile is and has no access to any record. It compares pictures. 1975-0061 is a tile painted with a sea creature; its nearest neighbours are all decorative tiles and almost all depict sea creatures, across different designs and centuries, at similarities of 0.92β0.95. No cataloguer ever recorded "sea creature" as a category.
Warning
CLIP carries the associations of the corpus it was trained on, including its blind spots and its clichΓ©s. It will group objects for reasons that have nothing to do with design history β a shared backdrop, a similar crop, a photographic convention. similarity measures two photographs, not two objects.
Coverage is 7,307 of 10,238 published objects. For the rest the endpoint returns an empty collection with 200 β the object exists, the question is simply unanswerable for it.
| Parameter | Description |
|---|---|
?fullRecord=true |
Return full CIDOC-CRM records |
?modifiedSince=YYYY-MM-DD |
Incremental harvest |
?q= |
Full text search on titles, descriptions and object number |
?concept= |
Filter by thesaurus concept PID or URI, expanded to narrower concepts |
?conceptSearch= |
Search the thesaurus by label (NL/EN/FR) and filter by matching concepts |
?agent= |
Filter by agent PID or URI β designer or producer |
?date=YYYY/YYYY |
Filter by production span, overlap logic |
?dateFrom=, ?dateTo= |
Same, as open-ended bounds |
?type=, ?material= |
Filter by type or material label. Comma-separated for AND |
?color=, ?cssColor= |
Filter by base colour or named tone |
?colors=true |
Include colour data (requires fullRecord=true) |
?hasImages=true |
Only objects with a IIIF manifest |
?hasColors=true |
Only objects processed by the colour tagger |
?hasParts=true |
Only koepelrecords |
?isPartOf=true |
Only set members |
?koepels=exclude |
Hide koepelrecords |
?language=NLD|FRA|ENG |
Only objects with a title in that language |
?onDisplay= |
Tri-state. Omit for all objects, true for on display, false for not on display |
?sortBy=, ?sortOrder= |
objectNumber, modified, titleNL/FR/EN, dateBegin, dateEnd |
| Parameter | Description |
|---|---|
?q= |
Full text search on name and agent ID |
?nationality= |
Filter by nationality |
?role= |
Filter by role (designer, producer) |
?type= |
individual, organisation or unknown |
| Parameter | Applies to | Description |
|---|---|---|
?onDisplay=true |
colors, production, types, materials | Restrict to objects in the collection presentation |
?minCount= |
colors | Minimum objects a colour must appear on to be listed |
?swatchesPerBase= |
colors | How many constituent tones each base colour returns |
?bucket= |
production | Bucket size in years (5β100, default 10) |
?yearFrom=, ?yearTo= |
production | Axis range |
?q= |
production | Narrow both measures to a search |
?limit= |
similar | Objects to return (1β50, default 12) |
?minSimilarity= |
similar | Only return objects at or above this similarity (0β1) |
# fetch a single object
curl https://data.designmuseumgent.be/v2/id/object/1987-1105
# fetch a single agent
curl https://data.designmuseumgent.be/v2/id/agent/DMG-A-00162
# paginate through all objects
curl "https://data.designmuseumgent.be/v2/id/objects?page=1&itemsPerPage=50&fullRecord=true"
# full text search
curl "https://data.designmuseumgent.be/v2/id/objects?q=roze+glas&hasImages=true"
# search the thesaurus in any of three languages
curl "https://data.designmuseumgent.be/v2/id/objects?conceptSearch=chaise"
# filter by colour and type
curl "https://data.designmuseumgent.be/v2/id/objects?color=pink&type=vaas&hasImages=true"
# filter by production period
curl "https://data.designmuseumgent.be/v2/id/objects?date=1950/1969&hasImages=true"
# objects currently on display
curl "https://data.designmuseumgent.be/v2/id/objects?onDisplay=true&fullRecord=true"
# the collection's palette, with renderable hex values
curl "https://data.designmuseumgent.be/v2/id/colors"
# when the collection was made, and when it was collected
curl "https://data.designmuseumgent.be/v2/id/production?bucket=10&yearFrom=1600"
# objects that resemble this one, from the photographs alone
curl "https://data.designmuseumgent.be/v2/id/object/1975-0061/similar"// harvest the full collection
async function harvest(url) {
const res = await fetch(url)
const data = await res.json()
// process data["hydra:member"]
console.log(`fetched ${data["hydra:member"].length} objects`)
if (data["hydra:view"]["hydra:next"]) {
await new Promise(r => setTimeout(r, 250)) // polite delay
await harvest(data["hydra:view"]["hydra:next"])
} else {
console.log('harvest complete')
}
}
harvest('https://data.designmuseumgent.be/v2/id/objects?fullRecord=true&itemsPerPage=50')v1 no longer serves requests. Its URIs return HTTP 410 Gone rather than 404, with headers pointing at the successor:
HTTP/1.1 410 Gone
Deprecation: true
Sunset: Wed, 01 Jul 2026 00:00:00 GMT
Link: <https://data.designmuseumgent.be/v2/>; rel="successor-version"410 rather than 404 is deliberate: these URIs existed and were published, so the honest answer is that the resource is deliberately gone, not that it never existed.
| v1 | v2 | |
|---|---|---|
| Data model | Linked Art / OSLO | Pure CIDOC-CRM |
| Serialization | JSON-LD (mixed vocabularies) | JSON-LD (strict CIDOC-CRM) |
| Multilingual | single language fields | crm:E41_Appellation per language |
| Nationality | plain string | EU Publications Office URI |
| Biographies | crm:P3_has_note |
crm:E33_Linguistic_Object + CC BY-SA |
| Colour data | separate endpoints | crm:E36_Visual_Item inline |
| Colour API | /v1/color-api/{color} |
?color= / ?cssColor= filters, plus /v2/id/colors |
| Full text search | β | ?q= on objects, agents, concepts |
| Concept search | β | ?concept=, ?conceptSearch= with hierarchy expansion |
| Date filters | β | ?date=, ?dateFrom=, ?dateTo= |
| Index endpoints | β | colours, production, types, materials, nationalities, roles |
| Visual similarity | β | /similar on any object, from CLIP image embeddings |
| Incremental harvest | β | ?modifiedSince= |
| Pagination headers | β | RFC 8288 Link header |
| HEAD requests | β | Lightweight existence checks |
| ARK routes | /v1/id/ark:/29417/β¦ |
Not carried over |
| Base URI | /v1/ |
/v2/ |
- CIDOC-CRM β core data model
- Flemish URI standard β persistent identifiers
- Hydra Core Vocabulary β pagination
- PROV-O β provenance
- SKOS β thesaurus labels and hierarchy
- Getty vocabularies β AAT, ULAN, TGN
- EU Publications Office β language, country, gender authorities
- RFC 8288 β
Linkheader pagination - IIIF β image delivery
- CLIP (
ViT-L-14-openai) β image embeddings behind/similar
- π Documentation
- π§ Swagger UI
- π GitHub Issues
- π§ olivier.vandhuynslager@stad.gent
Development and coordination by Olivier Van D'huynslager β Studio Digitaal, Design Museum Gent